1. 程式人生 > >matlab學習之蒙特卡羅 --渡口模型和趕火車問題(matlab程式設計)-----數模

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={0,0<r<=0.75,0.7<r<=0.910,0.9<r
t3={28,0<r<=0.330,0.3<r<=0.732,0.7<r<=0.934,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

DONE!!!