关于死理性派的恋爱有关问题

关于死理性派的恋爱问题
之前在科学松鼠会看到这篇文章,文章中的恋爱问题的另外两个版本是最大麦穗问题和最大钻石问题:


1,从一块麦田的一边走到另外一边,从所经过的麦穗中选择最大的麦穗,不允许回头,且只有一次选择机会,那么在怎样的策略下才能选择最大的麦穗?


2,在一个流水线上,依次从你面前经过一组大小不同的钻石,只有一次选择机会,制定一个策略,尽可能选择最大的钻石?


注意,这里的目标是选择最大的麦穗与钻石,显然,在随机的情况下,选中最大目标的概率为1/N,N为样本数。如果我们拒掉前N/e个样本(e为自然底数),并记录这N/e个样本的最大值MAX,再从剩下的样本中选择第一个大于MAX的那个数,这样得到最大值的概率最大,为1/e,约0.37。


但从另外一个角度来看,这也许并不是最佳的策略。在实际生活中,大多数人并不是希望得到最好的,这样的概率很小,只是希望选择尽可能好的,也就是说,我们希望结果的期望值达到最大。一个形式化的描述是:
给定1~100这个100个整数的一个随机排列,从这个排列的头到尾遍历一次,只有一个选择机会,怎样能够使得到的值的期望最大?

策略是:用前K个值的最大值MAX作为标准,在剩下的100-K个值中选择第一个比MAX大的值。

用程序模拟的结果如下:

关于死理性派的恋爱有关问题

当K取10时,得到的期望是最大的,约为91.48。


程序代码(by oldtimes.info)

#!/usr/bin/ruby 
#
#
def rndarr(array)
    tmp=Array.new
    result=Array.new
    s=array.size
    for i in 0...s
        index=rand(s)
        if tmp[index]==1
            redo
        else
            result.push(array[index])
            tmp[index]=1
        end
    end

    result
end


range=100
arr=(1..range).to_a
scores=(1..range).to_a
cycles=11000
for i in 0...cycles do
    narr=rndarr(arr)
    for j in 0...range do
        max=0
        # get the max in 0..j
        for k in 0...j do 
            if narr[k]>max
                max=narr[k]
            end
        end
        
        # choose the number that >max 
        for k in j...range do
            if narr[k]>max
                scores[j]+=narr[k]
                break
            end
            if k==range-1
                scores[j]+=narr[k]
            end
        end
    end
end

scores.each_with_index{|value,index|puts index.to_s+"  "+(value*1.0/cycles).to_s}