matlab学习之蒙特卡罗 --渡口模型和赶火车问题(matlab编程)-----数模

1. 渡口模型

问题描述:

一个渡口的渡船营运者拥有一只甲板长32米,可以并排停放两列车辆的渡船.他在考虑怎样在甲板上安排过河车辆的位置,才能安全地运过最多数量的车辆.
分析:怎样安排过河车辆,关心一次可以运多少辆各类车.
准备工作:观察数日,发现每次情况不尽相同,得到下列
数据和情况:
(1)车辆随机到达,形成一个等待上船的车列;
(2)来到车辆,轿车约占40%,卡车约占55%,摩托车约占5%;
(3)轿车车身长3.5~5.5米,卡车车身长为8~10米.

问题分析:

这是一个机理较复杂的随机问题,是遵”先到先服务”的随机排队问题.
解决方法:采用模拟模型方法.因此需考虑以下问题:
(1)应该怎样安排摩托车?
(2)下一辆到达的车是什么类型?
(3)怎样描述一辆车的车身长度?
(4)如何安排到达车辆加入甲板上两列车队中的哪一列中去?

模型建立:

设到达的卡车,轿车长度分别为随机变量L1,L2.结合实际,这里不妨设卡车,轿车的车身长度L1,L2均服从正态分布.由于卡车车身长8~10米,所以卡车车长L1的均值为(8+10)/2=9米,由概率知识中的”3σ”原则,其标准差为(9-8)/3=1/3,所以得到L1~N(9,1/9)
同理可得L2~N(4.5,1/9)
注:这地方可以改为均匀分布。

模拟程序设计:

由以上的分析,程序设计时应划分的主要模块
(函数)如下:
(1)确定下一辆到达车辆的类型:
(2)根据车的类型确定到达车辆的长度;
(3)根据一定的停放规则,确定放在哪一列.

matlab代码

function r=makeid %模拟下一辆到达车的类型
t=rand;
if t<=0.55
    r=1;  %到达卡车
elseif t<=0.95
    r=2;  %到达轿车
else
    r=3;  %到达摩托车
end

function len=getlength(id) %根据车的类型,产生车长随机数
switch id
    case 1,
        len=max([min([9+randn*(1/3),10]),8]);
    case 2,
        len=max([min([4.5+randn*(1/3),5.5]),3.5]);
    case 3;
        len=0;
end

function [full,pos]=getiffull(L,newlen) % 增加车长为len后是否可行(是否满) % pos表示加到那一列去
full=0;
pos=0;
if L(1)>L(2)
    if L(2)+newlen<=32
        pos=2;
    else
        full=1;
    end
else
    if L(1)+newlen<=32
        pos=1;
    else
        full=1;
    end
end


%主函数!!
function sim_dukou     %渡口模型的模拟
n=input('输入模拟次数:');
if isempty(n)||(n<500)
    n=500;
end
N=zeros(1,3);
for i=1:n
    isfull=0;
    L=[0,0];
    while ~isfull
        id=makeid;
        newlen=getlength(id);
        [isfull,pos]=getiffull(L,newlen);
        if ~isfull
            L(pos)=L(pos)+newlen;
            N(id)=N(id)+1;
        end
    end
end
disp('平均每次渡船上的车数')
disp(N./n);
其中函数说明
  • isempty()
    判断函数输入是否为空,和input配合使用,如果n为空,isempty(n)返回1.

  • zeros()
    zeros(m,n):生成m×n全零阵。类似还有ones(),更多详见

  • disp()
    直接将内容输出在Matlab命令窗口中 ,更多详见

  • ./
    数组右除。A./B是具有元素A(i,j)/ B(i,j)的矩阵。 A和B必须具有相同的大小,除非它们之一是标量。详见

  • rand
    X = rand 返回一个在区间 (0,1) 内均匀分布的随机数,详见

  • randn
    如果你想生成均值为a,方差为b的非标准正态分布N(a,b),即均值为a,方差(σ^2)为b,则为:a+sqrt(b)*randn(m,n)。其中:m为行数,n为列数。

结果
>> sim_dukou
输入模拟次数:
平均每次渡船上的车数
    4.4800    3.7300    0.5320

2. 赶火车

问题描述:

一列火车从A站开往B站,某人每天赶往B站上这趟火车.他已了解到:
(1)火车从A站到B站的运行时间是均值为30分钟,标准差为2分钟的随机变量;
(2)火车在下午大约1点离开A站,离开时刻的频率分布如下:

出发时刻午后1:00午后1:05午后1:10
频率0.70.20.1

此人到达B站的时刻频率分布如下:

时刻午后1:28午后1:30午后1:32午后1:34
频率0.30.40.20.1

问他能赶上火车的概率

变量说明

T1:火车从A站出发的时刻;
T2:火车从A站到B站的运行时间,单位:分钟;
T3:他到达B站的时刻

问题分析与假设:

此题包含多个随机因数.这里假设T1,T2,T3都是随机变量,其中T2服从正态分布.
很显然,他能及时赶上火车的条件是: T3 < T2 + T1 .为了简化计算,将下午1点记为0时刻.T1和T3的分布律如下:

T1/min0510
P(t)0.70.20.1
T3/min28303234
P(t)0.30.40.20.1

如果r为在(0,1)均匀分布的随机数,为了模拟随
机变量T1,T3,可以通过如下方法:

t1=0,5,10,0<r<=0.70.7<r<=0.90.9<r t 1 = { 0 , 0 < r <= 0.7 5 , 0.7 < r <= 0.9 10 , 0.9 < r

t3=28,30,32,34,0<r<=0.30.3<r<=0.70.7<r<=0.90.9<r t 3 = { 28 , 0 < r <= 0.3 30 , 0.3 < r <= 0.7 32 , 0.7 < r <= 0.9 34 , 0.9 < r

其中,t1和t3分别用来模拟随机变量T1和T3

matlab代码

function  pro_huoche   %模拟赶上火车的概率
n=input('输入模拟次数:');
if isempty(n)||(n<500)
    n=500;
end
m=0;
for i=1:n
   r1=rand;
   if r1<=0.7
     t1=0;
   elseif r1<=0.9
     t1=5;
   else 
     t1=10;
   end
   r3=rand;
   if r3<=0.3
     t3=28;
   elseif r3<=0.7
     t3=30;
   elseif r3<=0.9
     t3=32;
   else
     t3=34;
   end
   t2=30+randn*2;
   if t3<(t1+t2)
    m=m+1;
   end
end
disp(m/n);
end
结果
>> pro_huoche
输入模拟次数:
    0.6520

最后留下matlab网上教程matlab在线帮助文档

DONE!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值