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.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