前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最优停止法则-麦穗理论并用matlab验证

最优停止法则-麦穗理论并用matlab验证

作者头像
用户9925864
发布2024-01-15 18:11:33
2580
发布2024-01-15 18:11:33
举报
文章被收录于专栏:算法工程师的学习日志

前两天听了一个专家的分享,里面提到了这个麦穗问题,故分享一下里面的数学逻辑,并用matlab验证,在一些企业的面试里面也会遇到这个问题,如果在不确定中选择最优

麦穗理论

  有一天,柏拉图问老师苏个拉底什么是爱情?老师就让他先到麦田里去,摘一颗全麦田里最大最金黄的麦穗来。期间只能摘一次,并且期间只能向前走,不能回头。

  柏拉图于是按照老师说的去做了,结果他两手空空的走出了田地。老师问他为什么摘不到?

  他说:“因为只能摘一次,又不能走回头路,期间即使见到最大最金黄的,因为不知前面是否有更好的,所以没有摘。走到前面时,又发觉总不及之前见到的好,原来最大最金黄的麦穗早已错过了。于是我什么也没有摘!”

  老师说:这就是“爱情”。

  之后有一天柏拉图问他的老师什么是婚姻?老师就叫他先到树林里,砍下一颗全树林里最大最茂盛的,最适合放在家做圣诞树的树。期间同样只能砍一次,以及同样只能向前走,不能回头。

  于是柏拉图又照着老师的话去做。今次,他带了一颗普普通通,不是很茂盛,也不算太差的树回来。老师问他:怎么带这颗这么普通的树回来?他说:“有了上一次的经验,当我走到大半路程还两手空空时,看到这颗树也不太差,便砍了下来,免得错过了后,最后有什么也带不回来。”

  老师说:“这就是婚姻!”

数学解答

  现在我们用数学的角度来讨论这个问题。

  假设我们碰到的麦穗有n个,我们用这样的策略来选麦穗,前k个,记住一个最大的麦穗记为d(可能是重量,也可能是体积),然后k+1个开始,只要大于d的,就选择,否则就不选择。

  对于某个固定的k,如果最大的麦穗出现在了第i个位置(k<i≤n),要想让他有幸正好被选中,就必须得满足前i-1个麦穗中的最好的麦穗在前k个麦穗里,这有k/(i-1)的可能。考虑所有可能的i,我们便得到了前k个麦穗作为参考,能选中最大麦穗的总概率P(k):

  设k/n=x,并且假设n充分大,则上述公式可以改为:

  对-x·lnx求导,并令这个导数为0,可以解出x的最优值,它就是欧拉研究的神秘常数的倒数——1/e。

  所以k=n/e.

  如果你想摘取最大的麦穗,假设有n个麦穗,你应该先将前n/e个麦穗作为参考,然后再k+1个麦穗开始选择比前面k个最大的麦穗即可。

e = 2.718281828459,1/e = 0.36787944117144。

其他例子

一、一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最大的一颗。

答案:首先,这个题目说的,并不能完全拿到最大的钻石。但可以保证拿到最大钻石的概率最大。10/e = 3.67,向上取整,得4。则:前四层皆不取,只记下最大的。后面遇到的,只要比前面最大的还大,取之。即可。

二、秘书问题。在机率及博弈论上,秘书问题(类似名称有相亲问题、止步问题、见好就收问题、苏丹的嫁妆问题、挑剔的求婚者问题等)内容是这样的:要聘请一名秘书,有n人来面试。每次面试一人,面试过后便要即时决定聘不聘他,如果当时决定不聘他,他便不会回来。面试时总能清楚了解求职者的适合程度,并能和之前的每个人作比较。问凭什么策略,才使选得到最适合担任秘书的人的机率最大?

实验证明

基本思路

数组里存放 1-100,数字越大代表男生的质量越高,将数组随机打乱。从样本容量为 1 开始到 99,在每一个样本容量里,循环执行 10000 次算法,用计数器来计数选到最大数字的次数。

核心算法: 记录随机数组中最大的数和指定样本容量中最大的数,将备选区间里的数字和样本 容量最大的数字比较(备选区间按照顺序比较)。如果备选区间内的数字比样本容量中最大的数字大,则选择该数字。如果一直比样本容量中最大的数字小,则往后顺延。用计数器记录成功选到最 优秀数字的个数。

实验代码

代码语言:javascript
复制
clear
clc
close all
num = 100;
rng default
loop = 100000;
result = zeros(1,num);
for i = 1:num-1
    for k = 1:loop
        a=randperm(num);
        [max_a,index] = max(a);
        max_1 = max(a(1:i));
        for j = i+1:num
            if max_1<a(j) 
                if j==index
                    result(i) = result(i) + 1;
                end
                break
            end
        end
    end
end
figure
plot(result)
[max_result,index_result] = max(result)

结果符合预期,100/e=36.7,四舍五入等于37,

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档