⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 problem2_y2.m

📁 平时练习时的一些仿真程序
💻 M
字号:
clc,clear
tic                            %计时开始
timelength=100*24;              %设定仿真时间长度(小时)
h=0.01;  					   %设定仿真时间步长(小时)
G0=30000;                     %设定油罐的容量
time=0;                        %仿真时间
oiltankercome=zeros(1,1000);   %油轮到达,1表示油轮到达,0表示没有油轮到达
oiltankerhold= zeros(1,1000);  %到达油轮的当前油量
waittime=zeros(1,1000);        %油轮的等待时间
tankoil=0;                     %油罐的当前油量
alltankoil=0;                  %油罐油量的总值
unloadpause=0 ;                %表示卸货暂停的状态量
busytime=0;                    %码头忙时间
inoil=0;                       %码头的进油量数 
outoil=0;                      %码头的供油量数
queuelength=0;                 %队列长度

y=exprnd(6,1,1000);           %产生服从指数分布的时间间隔变量
reachtime=cumsum(y);           %得到油轮到达时间
x=rand(1,1000);                %产生均匀分布的随机数
capacity=zeros(1,1000);        %得到每个油轮的载油量
capacity(find(x<=1/6))=50000;
capacity(find(x>1/6&x<=1/2))=60000;
capacity(find(x>1/2&x<=5/6))=80000;
capacity(find(x>5/6))=100000;

%以下以时间步长0.01小时进行仿真
i=1;
for time=0:h:timelength
    nowtime=mod(time,24);             % 仿真在每一天中的时间
    
    if (time-reachtime(i)>0)&(time-reachtime(i)<=h) %%判断是否有油轮到达
        oiltankercome(i)=1;
        oiltankerhold(i)=capacity(i);
        queuelength=queuelength+1;
        i=i+1;    
    end
       
    if nowtime>=6                     %判断油轮到达时间是否为凌晨0点到6点之间
        if queuelength>0              %判断码头是否有船
            if tankoil<G0             %判断是否为码头油满
                if unloadpause==0     %判断是否为卸货暂停
                    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                        for j=1:i-1       %查找先进来的且未服务完的油轮卸货
                            if oiltankercome(j)==1;%%%%%%%%%%%%%%%
                               break
                            end
                        end    
                        oiltankerhold(j)=oiltankerhold(j)-150;%卸货
                        tankoil=tankoil+150;
                        inoil=inoil+150;
                        if oiltankerhold(j)<0.05*capacity(j)%如果油轮的剩余油小于其容量的5%,则卸货完毕
                            oiltankercome(j)=0;
                            queuelength=queuelength-1;
                        end
                      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                end
            else
                unloadpause=1;            %码头油满,置位卸货暂停标志
            end
            busytime=busytime+h;
        end
    end

    waittime(i-queuelength+1:i-1)=waittime(i-queuelength+1:i-1)+h;
    if tankoil<(0.8*G0)   %如果油罐的储油量小于其容量的80%,则恢复卸货
        unloadpause=0;
    end
    
    %以下为给炼油厂供油的仿真 
    if tankoil<=5000,  outputoil=0;  end
    if tankoil>=50000, outputoil=1; end
    if outputoil==1
        tankoil=tankoil-130;
        outoil=outoil+130;
    end
    alltankoil=alltankoil+tankoil;
end

dock_efficiency=busytime/(timelength*3/4)        % 码头利用率
mean_tankoil=alltankoil/(timelength/h)           % 储油罐平均储油量
mean_inoil=inoil/(timelength/24)                 % 码头日平均进油量 
mean_outoil=outoil/(timelength/24)               % 码头日平均供油量
mean_wait_time=sum(waittime)/(i-1)               % 油轮的平均等待时间
toc                              %计时结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -