1. 问题背景
在适龄阶段有 n n n位候选人,每次相亲1人,相亲后就要及时决定是否接受,不接受便不会回来。
问:采取什么样的策略,才能使最佳人选被选中的概率最大?
策略:
先看 m m m人,从第 m + 1 m + 1 m+1 人开始选择,如果第 m + k m + k m+k 人优于前面的 m m m人,则选择第 m + k m + k m+k人
确定 m m m值以使得以最大概率选到最佳人选
贝叶斯分析:
事件A:选中第 m + k m + k m+k人
事件B:第
m
+
k
m + k
m+k 人是最优的
P
(
A
B
)
=
P
(
A
∣
B
)
P
(
B
)
P(AB)=P(A|B)P(B)
P(AB)=P(A∣B)P(B)
显然
P
(
B
)
=
1
N
P(B)=\frac{1}{N}
P(B)=N1,以下我们讨论
P
(
A
∣
B
)
P(A|B)
P(A∣B)
如果第
m
+
k
m + k
m+k人是最优的且被选中,那么这个策略选中第
m
+
k
m + k
m+k人的情况为:在前
m
+
k
m + k
m+k人中,次优的人在前
m
m
m人中。如果第
m
+
1
m+1
m+1人与第
m
+
k
−
1
m+k-1
m+k−1之间有人比前面
m
m
m个人都好,那么就会在第
m
+
k
m+k
m+k人之前选择,而不会选择第
m
+
k
m+k
m+k人。(以下推导过程中
i
=
m
+
k
i = m +k
i=m+k,次优是前
m
+
k
m+k
m+k人中的次优)
P
(
A
∣
B
)
=
P
(
前
m
+
k
人
中
次
优
的
人
出
现
在
前
m
人
中
)
=
m
m
+
k
P(A|B) = P(前m+k人中次优的人出现在前m人中)= \frac{m}{m+k}
P(A∣B)=P(前m+k人中次优的人出现在前m人中)=m+km
P
(
A
B
)
=
P
(
A
∣
B
)
P
(
B
)
=
m
m
+
k
1
N
P(AB)=P(A|B)P(B)=\frac{m}{m+k}\frac{1}{N}
P(AB)=P(A∣B)P(B)=m+kmN1
P ( m ) = ∑ i = m + 1 N 1 N m i − 1 = m N ∑ i = m + 1 N 1 i − 1 P(m) = \sum_{i=m+1}^{N} \frac{1}{N}\frac{m}{i-1} = \frac{m}{N}\sum_{i=m+1}^{N}\frac{1}{i-1} P(m)=i=m+1∑NN1i−1m=Nmi=m+1∑Ni−11
当
N
>
>
m
N >> m
N>>m,不妨令
x
=
m
N
x = \frac{m}{N}
x=Nm则有
f
(
x
)
=
x
∫
x
1
1
t
d
t
=
−
x
ln
x
f(x) =x \int_{x}^{1} \frac{1}{t}dt= -x \ln x
f(x)=x∫x1t1dt=−xlnx
求导得
f
′
(
x
)
=
−
ln
x
−
1
f^{'}(x) = -\ln x - 1
f′(x)=−lnx−1
f
(
x
)
f(x)
f(x)是一个凹函数, 当
x
=
1
e
x = \frac{1}{e}
x=e1时,
f
’
(
x
)
=
0
f^{’}(x)=0
f’(x)=0,
f
(
x
)
f(x)
f(x)取得最大值
此时 m N = 1 e , m = N e \frac{m}{N} = \frac{1}{e},m = \frac{N}{e} Nm=e1,m=eN
2. 蒙特卡罗仿真模拟
2.1 流程图
2.2 算例
a r r a y = [ 6 , 5 , 7 , 4 , 2 ] , L = 5 array = [6,5,7,4,2], L = 5 array=[6,5,7,4,2],L=5
t o t a l _ m a x = 7 total\_max = 7 total_max=7
m r e c o r d = [ 0 , 0 , 0 , 0 ] , m = 1 , b e f o r e _ m _ m a x = 6 mrecord=[0,0,0,0],m =1,before\_m\_max = 6 mrecord=[0,0,0,0],m=1,before_m_max=6
c a n d _ n u m = 7 = t o t a l _ m a x cand\_num = 7 = total\_max cand_num=7=total_max ,—> m r e c o r d [ 1 ] = 0 + 1 mrecord[1] = 0 + 1 mrecord[1]=0+1
m r e c o r d = [ 1 , 0 , 0 , 0 ] , m = 2 , b e f o r e _ m _ m a x = 6 mrecord =[1,0,0,0],m = 2, before\_m\_max = 6 mrecord=[1,0,0,0],m=2,before_m_max=6
c a n d _ n u m = 7 = t o t a l _ m a x cand\_num = 7 = total\_max cand_num=7=total_max ,—> m r e c o r d [ 2 ] = 0 + 1 mrecord[2] = 0 + 1 mrecord[2]=0+1
m r e c o r d = [ 1 , 1 , 0 , 0 ] , m = 3 , b e f o r e _ m _ m a x = 7 = t o t a l _ m a x mrecord =[1,1,0,0],m = 3, before\_m\_max = 7 =total\_max mrecord=[1,1,0,0],m=3,before_m_max=7=total_max
输出mrecord
m r e c o r d = [ 1 , 1 , 0 , 0 ] mrecord =[1,1,0,0] mrecord=[1,1,0,0]
2.3 代码
蒙特卡罗函数
function mrecord = Monte_Carlo(mrecord,L)
%蒙特卡罗模拟过程实现
%mrecord记录m的得分,L为随机数组
total_max = max(L); %整体最优
max_before_m = L(1);%初始化局部最优
for m=1:length(L)-1
%max_before_m = max(L(1:m)); %局部最优(效率比较低)
max_before_m = max(max_before_m,L(m))%局部最优
if max_before_m == total_max %前m个人中包含了最好的一个则终止此次循环
break
else
temp = find(L(m+1:end) > max_before_m); %找到大于局部最优的值
%选取第一个值如果这个值是整体最优则更新得分
if L(m+temp(1)) == total_max
mrecord(m) = mrecord(m) + 1;
end
end
end
主函数
mrecord = zeros(1,19);
x = 1:1:1000;%表示1000次实验
y = zeros(1,1000); %存储1000次实验每次实验的结果 p置
z = zeros(1,1000); %存储1000次实验每次实验的结果 m值
for k = 1:1000
for i = 1:1000
L = rand(1,20); %生成20个随机数
mrecord = Monte_Carlo(mrecord,L); %进行蒙特卡罗模拟
end
[~,z(k)] = max(mrecord);%每次试验的m值
end
y = z/20 ;% P值
%绘图
figure
subplot(2,1,1)
plot(x,y)
%标题题注
title('相亲问题蒙特卡罗实验结果P值')
axis ([1 1000 0.30 0.45])
xlabel('实验次数')
ylabel('P值')
subplot(2,1,2)
plot(x,z)
%标题题注
title('相亲问题蒙特卡罗实验结果m值')
axis ([1 1000 6 8])
xlabel('实验次数')
ylabel('m值')
2.4 实验结果分析
在给定 N = 20 , 40 , 60 , 80 , 100 , 1000 N=20,40,60,80,100,1000 N=20,40,60,80,100,1000的情况下重复实验1000次得出对应的 m m m值及其 p p p值
以上两个表格展示在不同样本量N下的m值和P值(取1000次重复实验的首尾5行)
-
给定 N N N值,随着实验次数的增加,对应的 m m m值趋近于某一特定的常数 N e \frac{N}{e} eN.
-
当 N N N值越大, P = m N P = \frac{m}{N} P=Nm越趋近于0.368即 1 e \frac{1}{e} e1.