数学建模:10 蒙特卡罗模拟

目录

概述

实例

投针问题

三门问题

模拟排队问题

有约束的非线性规划问题

书店买书问题(0-1规划)

导弹追踪问题

旅行商问题TSP

换灯泡

武器升级

估计自然对数的底数e


概述

原理:由大数定理可知,当样本容量足够大时,事件的发生频率即为其概率

实例

投针问题

 ​​​​​​

需要随机模拟的是 x(中点到最近平行线的距离)、角度 φ 

%% 由于一次模拟的结果具有偶然性,可以重复100次后再来求一个平均的pi
result = zeros(100,1);  % 初始化保存100次结果的矩阵

l =  0.520;     
a = 1.314;

n = 1000000;
    
for num = 1:100
    m = 0;  
    x = rand(1, n) * a / 2 ; % 随机模拟针的终点到平行线的距离
    phi = rand(1, n) * pi; % 随机模拟角度
    for i=1:n
        if x(i) <= l / 2 * sin(phi (i)) % 判断相交的条件
            m = m + 1;
        end
    end
    p = m / n;
    mypi = (2 * l) / (a * p);
    result(num) = mypi;  % 把求出来的myphi保存到结果矩阵中
end
mymeanpi = mean(result);  % 计算result矩阵中保存的100次结果的均值

三门问题

决胜21点中的“三门问题”是怎么回事?应该如何提高中奖的概率?李永乐老师讲解蒙提霍尔问题(2018最新)_哔哩哔哩_bilibili

求:① 在已成功获奖的情况下,是因为改变后才获奖 / 没改变获奖的概率
       ② 求没有获奖、改变后才获奖、没改变获奖的概率

需要模拟的是:第一次选的哪扇门 x ,奖品在 y 门后,是否改变选择 change

%%%%%%%%%%%%%%%%%%%%%%%%%% 在成功获奖的条件下,改变还是不改变 赢的概率大
n = 100000;  % n代表蒙特卡罗模拟重复次数
a = 0;  % a表示不改变主意时能赢得汽车的次数
b = 0;  % b表示改变主意时能赢得汽车的次数
for i= 1 : n 
    % 第一次选的是哪个门
    x = randi([1,3]);  % 随机生成一个1-3之间的整数x
    % 哪个门后有车
    y = randi([1,3]); 

    if x == y   % 如果x和y相同,只有不改变主意时才能赢
        a = a + 1;     b = b + 0;
    else  % x ~= y % 如果x和y不同,只有改变主意时才能赢
        a = a + 0;     b = b +1;
    end
end
disp(['蒙特卡罗方法得到的不改变主意时的获奖概率为:', num2str(a/n)]);
disp(['蒙特卡罗方法得到的改变主意时的获奖概率为:', num2str(b/n)]);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 不获奖、改变获奖、不改变获奖的概率
n = 100000;
a = 0;
b = 0;  
c = 0;  % c表示没有获奖的次数

for i= 1 : n 
    x = randi([1,3]); 
    y = randi([1,3]); 

    % 改不改变选择
    change = randi([0, 1]); % change =0  不改变主意,change = 1 改变主意
    % 下面分为两种情况讨论:x=y和x~=y
    if x == y   % 如果x和y相同,只有不改变主意时才能赢
        if change == 0  % 不改变主意
        	a = a + 1; 
        else  % 改变了主意
            c= c + 1;
        end
    else  % x ~= y % 如果x和y不同,只有改变主意时才能赢
         if change == 0  % 不改变主意
        	c = c + 1; 
        else  % 改变了主意
            b = b + 1;
         end
    end
end
disp(['蒙特卡罗方法得到的不改变主意时的获奖概率为:', num2str(a/n)]);
disp(['蒙特卡罗方法得到的改变主意时的获奖概率为:', num2str(b/n)]);
disp(['蒙特卡罗方法得到的没有获奖的概率为:', num2str(c/n)]);

模拟排队问题

需要模拟的是:

  • 第 i 个顾客到来的时间间隔 xi 
  • 第 i 个顾客的服务时间 yi (注意小于 1 时改为 1)

计算:

  • 第 i 个顾客到来时间 ci = c(i-1) + xi (前一个到达时间 + 间隔)
  • 第 i 个顾客开始服务时间 bi = max( e(i-1), ci ) (自己到达时间 / 前一个人完成时)
  • 第 i 个顾客结束服务时间 ei = bi + yi (开始时间 + 服务时间)
  • 第 i 个顾客等待时间 wi = bi - ci (开始服务时间 - 到达时间)

循环条件:

  • 开始服务时间 < 480 (8小时一天,单位是分钟)

初始化:

  • e0 = 0, c0 = 0
  • n(k) 记录第 k 天服务的人数

有约束的非线性规划问题

求非线性规划的局部最优解需要给定初始值,蒙特卡洛算法可以得到初始值

书店买书问题(0-1规划)

变量:

  • xij (01变量) 第 i 商城中第 j 本书被买了就是 1 ,否则是 0
  • mij 记录第 i 商城中第 j 本书的售价
  • qi 记录第 i 家商城的运费
  • ti 记录有没有在第 i 家店买书,买了的话就要算运费 

条件:

  • 每列的和为 1 (每本书只在一家店买)

目标函数:总花费 + 运费

导弹追踪问题

思想:取很小的时间间隔,计算每一时间间隔后导弹与船的距离,小于设定的某一个值就认为相撞

旅行商问题TSP

随机生成路线,比较得到最小的那个

换灯泡

自己规定一个时间 T ,计算 T 时间内换灯泡的花费

武器升级

估计自然对数的底数e

猜你喜欢

转载自blog.csdn.net/m0_54625820/article/details/128682161
今日推荐