关于死理性派的恋爱有关问题
关于死理性派的恋爱问题
之前在科学松鼠会看到这篇文章,文章中的恋爱问题的另外两个版本是最大麦穗问题和最大钻石问题:
1,从一块麦田的一边走到另外一边,从所经过的麦穗中选择最大的麦穗,不允许回头,且只有一次选择机会,那么在怎样的策略下才能选择最大的麦穗?
2,在一个流水线上,依次从你面前经过一组大小不同的钻石,只有一次选择机会,制定一个策略,尽可能选择最大的钻石?
注意,这里的目标是选择最大的麦穗与钻石,显然,在随机的情况下,选中最大目标的概率为1/N,N为样本数。如果我们拒掉前N/e个样本(e为自然底数),并记录这N/e个样本的最大值MAX,再从剩下的样本中选择第一个大于MAX的那个数,这样得到最大值的概率最大,为1/e,约0.37。
但从另外一个角度来看,这也许并不是最佳的策略。在实际生活中,大多数人并不是希望得到最好的,这样的概率很小,只是希望选择尽可能好的,也就是说,我们希望结果的期望值达到最大。一个形式化的描述是:
给定1~100这个100个整数的一个随机排列,从这个排列的头到尾遍历一次,只有一个选择机会,怎样能够使得到的值的期望最大?

之前在科学松鼠会看到这篇文章,文章中的恋爱问题的另外两个版本是最大麦穗问题和最大钻石问题:
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}