蒙特卡罗仿真实验

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(AB)P(B)
显然 P ( B ) = 1 N P(B)=\frac{1}{N} P(B)=N1,以下我们讨论 P ( A ∣ B ) P(A|B) P(AB)

如果第 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+k1之间有人比前面 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(AB)=P(m+km)=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(AB)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+1NN1i1m=Nmi=m+1Ni11

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)=xx1t1dt=xlnx

求导得
f ′ ( x ) = − ln ⁡ x − 1 f^{'}(x) = -\ln x - 1 f(x)=lnx1
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=1before_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=20,40,60,80,100的情况下对应的m值

在这里插入图片描述

给定N值下对应m的P值
结果分析:
  • 给定 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.

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值