?? problem2_y.m
字號:
clc,clear
simday=30;
wait_time=zeros(1,144); %wt為每個油輪的等待時間
h=0.01; %時間步長0.01小時
simtime=0.01; % 變量存儲仿真時間
otc= zeros(1,144); %事件油輪到達otc=1 表示油輪到達,otc=0 表示沒有油輪到達,或者油輪卸貨完畢
otchold= zeros(1,144); %到達油輪的存儲油量
dockship=0 ; %dockship為表示碼頭忙閑的狀態
tankoil=0; %tankoil為儲油罐的儲油量
unloadtemp=0 ; %unloadtemp為表示卸貨暫停的狀態量
freetime=0; %freetime變量表示碼頭空閑數,freetime=0表示工作,freetime=1表示空閑
night=0; %night變量為是否為:0:0-6:0的標志
eatoil=0; %eatoil變量為碼頭的進油量數
outoil=0; %outoil變量為碼頭的供油量數
ql=0; %ql變量為隊列長度
sum_of_tankoil=0;%仿真步長內油罐的儲油量
unload_time= zeros(1,144);%
%兩個月(60天)約144條油輪到達,首先產生服從均值為10的指數分布的油輪到達時間,結合油輪載油量的分布函數產生每個油輪 的載油量
x=rand(1,144);%產生144個均勻分布的隨機數
y=log(x);
y=-10*y;%產生服從指數分布的時間間隔變量
cat(1)=0; % %%%%cat(1)=5;
for i=2:144
for j=1:(i-1) %%%%%%%%%
cat(i)=cat(i-1)+y(i-1);%計算出144個油輪的到來時刻 ,存于eat數組中
end
hold(1)=50000; %%%% hold(1)=60000;
if x(i-1)<=(1/6)%利用隨機數計算出每個油輪的載油量,存于hold數組中
hold(i)=50000;
elseif x(i-1)<=(1/6+1/3)
hold(i)=60000;
elseif x(i-1)<=(1/6+2/3)
hold(i)=80000;
else
hold(i)=100000;
end
end
%以下以時間步長0.01小時進行仿真
for step=1:144000
ql=0;
simtime=simtime+h;
nowtime=mod(simtime,24); % nowime變量存儲仿真的每一天中的時間
for i=1:144 %%%%%%%%%%%%判斷是否有油輪到達,記錄在otc數組中;并表示碼頭dockship置位
cha=simtime-cat(i);
if((cha>0)&(cha<=0.01))
otc(i)=1;
otchold(i)=hold(i);
dockship=1;
unload_time(i)=unload_time(i)+0.95*otchold(i)/15000;
end
end
if nowtime>=6%判斷油輪到達時間是否為凌晨0點到6點之間
if dockship==1 %判斷碼頭是否有船
if tankoil<300000%判斷是否為碼頭油滿(設碼頭的儲油量為300000桶)
if unloadtemp==0%是否為卸貨暫停
for j=1:144%查找先進來的且未服務完的油輪卸貨
if otc(j)==1;%%%%%%%%%%%%%%%
break
end
end
otchold(j)=otchold(j)-150;%卸貨
tankoil=tankoil+150;
eatoil=eatoil+1;
end
else
unloadtemp=1;%碼頭油滿,置位卸貨暫停標志
end
else
freeime=freetime+1;
end
else
night=1;%如果是夜里,置夜標志位night
end
%以下為統計一步長的狀態,并改變相應的狀態量
for t=1:144 %%%%%%%%%
if otc(t)==1
wt(t)=wt(t)+0.01;
end
ql=ql+otc(t);
end
if otchold(j)<0.05*hold(j)%如果油輪的剩余油小于其容量的5%,則卸貨完畢
otc(j)=0;
end
if tankoil<(0.8*300000)%如果儲油罐的儲油量小于其容量的80%,則恢復卸貨
unloadtemp=0;
end
if ql==0
dockship=0;
end
%以下為給煉油廠供油的仿真
if tankoil<=5000
outputoil=0;
end
if tankoil>=50000
outputoil=1;
end
if outputoil==1
tankoil=tankoil-130;
outoil=outoil+1;
end
sum_of_tankoil=sum_of_tankoil+tankoil;
end
total_waittime=0;%所有144條船的總等待時間
wait_time_of_eachship=wt-unload_time;
for i=1:144
total_waittime=total_waittime+wait_time_of_eachship(i);
end
average_tankoil_of_each_step=sum_of_tankoil/(60*24*100)
averge_inoil_of_shipside=eatoil*150/60
averge_outoil_of_shipside=outoil*130/60
working_efficiency=1-(freetime*0.01)/(24*60)
average_wait_time=total_waittime/144
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -