目录
概述
原理:由大数定理可知,当样本容量足够大时,事件的发生频率即为其概率
实例
投针问题
需要随机模拟的是 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 时间内换灯泡的花费