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