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.7 | 0.2 | 0.1 |
此人到达B站的时刻频率分布如下:
时刻 | 午后1:28 | 午后1:30 | 午后1:32 | 午后1:34 |
---|---|---|---|---|
频率 | 0.3 | 0.4 | 0.2 | 0.1 |
问他能赶上火车的概率
变量说明
T1:火车从A站出发的时刻;
T2:火车从A站到B站的运行时间,单位:分钟;
T3:他到达B站的时刻
问题分析与假设:
此题包含多个随机因数.这里假设T1,T2,T3都是随机变量,其中T2服从正态分布.
很显然,他能及时赶上火车的条件是: T3 < T2 + T1 .为了简化计算,将下午1点记为0时刻.T1和T3的分布律如下:
T1/min | 0 | 5 | 10 |
---|---|---|---|
P(t) | 0.7 | 0.2 | 0.1 |
T3/min | 28 | 30 | 32 | 34 |
---|---|---|---|---|
P(t) | 0.3 | 0.4 | 0.2 | 0.1 |
如果r为在(0,1)均匀分布的随机数,为了模拟随
机变量T1,T3,可以通过如下方法:
其中,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