purplelesly 发表于 2009-9-3 17:22

m/m/c模型的matlab代码。。。

本帖最后由 厚积薄发 于 2010-2-9 14:47 编辑

function =simummic
c=2000;   %画图的起始位置。。。
lamda=10;
mu=1/70;
%customerNum=6000;
serviceNum=900;    %服务器数目
arriveTime=[];
arrive_interval=[];
T=600;         %游乐场关门时间
%serve_state=zeros(1,900);
%initialize,初始化,初始时刻系统的全部服务器均为空闲;
%每个顾客到达的时间间隔arrive_interval;确定在关门前到来了多少顾客数num以及他们的到达时间;
num=1;arriveTime(num)=-log(rand)/lamda;arrive_interval(num)=-log(rand)/lamda;
while arriveTime(num)<T-120
    if  arriveTime(num)>120 &  arriveTime(num)<180
        lamda=20;
    elseif  arriveTime(num)>360 &  arriveTime(num)<420
            lamda=20;
    elseif   arriveTime(num)<60  
        lamda=10;
    else lamda=15;
    end
    num=num+1;
    arrive_interval(num)=-log(rand)/lamda;
    arriveTime(num)=sum(arrive_interval);
end
customerNum=num;
%计算每个乘客接受服务的时间;
serviceTime=zeros(1,customerNum);
for i=1:customerNum
    serviceTime(i)=-log(rand)/mu;
    while serviceTime(i)>T-arriveTime(i) | serviceTime(i)<10
           serviceTime(i)=-log(rand)/mu;
    end
end
waitingTime = zeros(1,customerNum);waitNum=zeros(1,customerNum);leaveTime=zeros(1,customerNum);
%计算每个顾客离开的时间;
%若第i个容纳到达系统时,没有空闲的检票机,则比较在他前面到达的c个人的离开的时刻,最小的离开的时刻就是第i个人接受服务的时刻,也就确定了第i个人接受
%服务的检票机序号j;
serviceFinishTime = zeros(1,serviceNum);beginTime=zeros(1,serviceNum);beginNum=zeros(1,6000);
for i = 1:customerNum
    beginTime(i) = min(serviceFinishTime);%设备开始的时间是所有服务结束时间的最小值;
    Num = find(serviceFinishTime == beginTime(i)); %找到服务结束时间小于下次服务开始的时间的机器。
    beginNum(i) = Num(1);%找到所有上述机器中的最小号;第i号客人在第Num(1)号机器上;
    if arriveTime(i) >= beginTime(i) %如果第i号顾客的到达时间比所有服务器的时间都晚,那么把第i号顾客的到达的时间作为开始的时间;
        waitingTime(i) = 0; %第i号顾客不用等待
        beginTime(i) = arriveTime(i);
        leaveTime(i) = arriveTime(i) + serviceTime(i);%他的离开时间等于他的到达时间和离开时间;
        serviceFinishTime(beginNum(i)) = leaveTime(i);%那么上述被占用的服务器结束服务的时间等于当前顾客离开的时间;
        waitNum(i) = 0;%等候队伍不加长;
    else %如果第i号顾客到达时间比所有服务器的时间都早,即第i号顾客到达的时候没有服务器空闲;
        waitingTime(i) = beginTime(i) - arriveTime(i); %那么第i号顾客等候的时间等于他开始服务的时间减去到达的时间;
        leaveTime(i) = beginTime(i) + serviceTime(i);  %第i号顾客等候的时间等于他开始服务的时间加上服务的时间;
        serviceFinishTime(beginNum(i)) = leaveTime(i); %%那么上述被占用的服务器结束服务的时间等于当前顾客离开的时间;
      
        waitNum(i) = waitNum(i-1)+1;
         m=0;%要减少的队长;
        for k=1:i-1
            if arriveTime(i) > beginTime(k) & arriveTime(i-1) < beginTime(k)
               m=m+1;
            end
         end
         if m<=waitNum(i-1)
             waitNum(i)=waitNum(i)-m;
         else waitNum(i)=0;
         end
    end
end
meanwaitNum=mean(waitNum);
meanwaitingTime=mean(waitingTime);
figure('Name','无quickpass系统','NumberTitle','off')
subplot(2,1,1)
plot(c:customerNum,waitNum(c:customerNum),'r*',c:customerNum,meanwaitNum*ones(1,customerNum-c+1))
ylabel('平均等候队长')
xlabel('顾客')
subplot(2,1,2)
plot(c:customerNum,waitingTime(c:customerNum),'r*',c:customerNum,meanwaitingTime*ones(1,customerNum-c+1))
ylabel('平均等候时间')
xlabel('顾客')
%subplot(3,1,3)
%plot(c:customerNum,leaveTime(c:customerNum))
%ylabel('每个顾客的离开时间')
%xlabel('顾客')

zpjlyc 发表于 2009-9-3 18:49

好东西,谢谢啦!!!

tjiayangge26 发表于 2009-12-17 13:30

非常感谢,正需要这个,我来研究研究~~

mnpfc 发表于 2009-12-31 08:40

谢谢楼主了额!!!!!!!!!!!!!!!

lhml 发表于 2010-2-2 10:32

直接贴到MATALB中怎么乱码啊?无语了

埃德蒙 发表于 2010-2-9 11:21

谢谢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sunrujie688 发表于 2010-2-10 14:48

非常感谢,正需要这个,我来研究研究~~

sunrujie688 发表于 2010-2-10 14:48

非常感谢,正需要这个,我来研究研究~~

jingsmount 发表于 2010-2-10 17:44

回复 1# purplelesly


    看一下,呵呵。。。。。。。。。。。。。。。。。。。。。。。。。。
页: [1]
查看完整版本: m/m/c模型的matlab代码。。。