排隊論演算法的matlab實現

xyxstuing發表於2020-10-23
   朋友畫了一天寫的排隊論演算法,用來解決如下問題,不忍讓它蒙塵,便發了出來讓有緣人拜讀拜讀。

以下是某城區地理簡圖,直線表示可行路徑——公路,每個方格表示一個區域(邊長都為1公里),所有區域都進行了編號,共47個區域,其中46、47區為天然屏障,無法直接穿越。該城區僅有的送餐公司C總部現設在25區,有送餐員6名。現統計了某天該城區的顧客下單情況(見附件)。假設送餐員每次送餐結束後,總是先返回公司總部,(等待)領取下一個訂單(先到先得,按下單時間順序領取),然後再前往訂單中指定的餐館取餐,最後到下單顧客的地址送餐。送餐員在公路上的行駛速度為30公里每小時,在到達一個區的邊界後停下,從打聽顧客具體位置到最終完成送餐所需平均時間是3分鐘、方差為1分鐘。
1 2 3 4 5 6 7 8 9 10
11 46 46 14 15 16 17 18 19 20
21 22 46 24 25 26 27 47 47 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 12 13 23 28 29

1) 結合附件研究該城區顧客下單規律,估計顧客的平均等待時間。
(找到一個模型描述顧客等待時間與送餐的關係,然後得到一個平均關係)——(思路是通過模擬建模——蒙特卡洛法 即模擬法)

  1. Step1 建立送餐地點和時間的概率模型——比較難弄這個。。。
  2. Step2 :建模 等待時間=F(x1,x2,x3,x4)
  3. 模擬10000+次 ,從而確定平均時間
p=zeros(256,1);
c=6;
z=ones(c,1);
w=zeros(256,1);
f=zeros(256,1);
p(1:6,1)=0;
w(1:6,1)=0;
s=zeros(1000,1);
for i=1:c
    j=1;  
    M=10000;
    L=10000;  %執行次數
    x1=guwei(i,1);  
    y1=guwei(i,2);
    gw=zeros(M,2);   
    gw(:,1)=x1;
    gw(:,2)=y1;  %得到顧客的位置矩陣
    cw=gw+cgxd;  %得到該顧客位置下餐館的隨機位置矩陣
    while(j<=L)
        if cw(j,1)<1||cw(j,1)>10||cw(j,2)<1||cw(j,2)>5   %將餐館隨機位置矩陣中不符合實際條件的位置剔除
            cw=[cw(1:j-1,:);cw(j+1:L,:)];
            L=L-1;
        else
            j=j+1;
        end
    end
[m,~]=size(cw);   %得到處理後的餐館隨機位置矩陣的行數
zw=zeros(m,2);    
zw(:,1)=3;
zw(:,2)=5;       %得到總部位置矩陣
gw=zeros(m,2);   
gw(:,1)=x1;
gw(:,2)=y1;       %得到顧客位置矩陣
czxd=abs(cw-zw);  %得到餐館與總部的相對距離矩陣(分x方向與y方向)
gcxd1=abs(gw-cw);   %得到顧客與餐館的相對距離矩陣 
gzxd=abs(gw-zw);
juli=czxd(:,1)+czxd(:,2)+gcxd1(:,1)+gcxd1(:,2)+gzxd(:,1)+gzxd(:,2);   %總距離矩陣
f(i)=sum(juli)/m/0.5;   %得到該顧客位置下的一個平均距離,將其放到矩陣mj中
end
for j=1:c
    s(j)=f(j)+t(j);   %前c個人無需排隊
end
for i=c+1:256;   %從第c+1個人開始模擬
    j=1;  
    M=10000;
    L=10000;  %執行次數
    x1=guwei(i,1);  
    y1=guwei(i,2);
    gw=zeros(M,2);   
    gw(:,1)=x1;
    gw(:,2)=y1;  %得到顧客的位置矩陣
    cw=gw+cgxd;  %得到該顧客位置下餐館的隨機位置矩陣
    while(j<=L)
        if cw(j,1)<1||cw(j,1)>10||cw(j,2)<1||cw(j,2)>5   %將餐館隨機位置矩陣中不符合實際條件的位置剔除
            cw=[cw(1:j-1,:);cw(j+1:L,:)];
            L=L-1;
        else
            j=j+1;
        end
    end
[m,~]=size(cw);   %得到處理後的餐館隨機位置矩陣的行數
zw=zeros(m,2);    
zw(:,1)=3;
zw(:,2)=5;       %得到總部位置矩陣
gw=zeros(m,2);   
gw(:,1)=x1;
gw(:,2)=y1;       %得到顧客位置矩陣
czxd=abs(cw-zw);  %得到餐館與總部的相對距離矩陣(分x方向與y方向)
gcxd1=abs(gw-cw);   %得到顧客與餐館的相對距離矩陣
gzxd=abs(gw-zw);
juli=czxd(:,1)+czxd(:,2)+gcxd1(:,1)+gcxd1(:,2)+gzxd(:,1)+gzxd(:,2);   %總距離矩陣
f(i)=sum(juli)/m/0.5;   %得到該顧客位置下的一個平均距離,將其放到矩陣f中
     if p(i-1)>0    %當隊長大於零時
        for j=1:c   %對服務檯狀態進行分析
            if s(j)<t(i)||s(j)==t(i)
                z(j)=0;
                s(j)=0;
            end         %挑出空閒服務檯
        end
                k=p(i-1);  %隊長賦值給k
                while k>0
                    j=1;
                    while j<=c
                        if z(j)==0
                           z(j)=1;
                           s(j)=t(i-k)+w(i-k)+f(i-k);
                           break;
                        end
                        j=j+1;
                    end
                    if j==c+1
                        break;
                    end
                    k=k-1;
                end       %處理第i個人之前等待人的狀態
                if k>0
                    if p(i-1)-k>0
                    for j=1:k
                        s(c+j)=s(c+p(i-1)-k+j);
                    end
                    s((c+k+1):(c+p(i-1)))=0;
                    end
                    temp=s;
                    for l=1:k
                        temmin=temp(1);
                        tag=1;
                        for j=1:c
                        if temmin>temp(j)
                            temmin=temp(j);
                            tag=j;    
                        end
                        end
                        temp=[temp(1:(tag-1),1);temp((tag+1):(c+k-l+1),1)];
                    end
                    temmin=temp(1);
                    for j=1:c
                        if temmin>temp(j)
                            temmin=temp(j);
                        end
                    end
                    w(i)=temmin-t(i);
                    p(i)=k+1;
                    s(c+k+1)=t(i)+w(i)+f(i);      %得到等待時間,更新s,p,w
                else
                    s(7:c+p(i-1))=0;
                    for j=1:c
                    if s(j)<t(i)||s(j)==t(i)
                        z(j)=0;
                        s(j)=0;
                    end
                    end
                    j=1;
                    while j<=c
                        if z(j)==0
                            z(j)=1;
                            s(j)=t(i)+f(i);
                            w(i)=0;
                            p(i)=0;
                            break;
                        end
                        j=j+1;
                    end
                    if j==c+1
                        temmin=s(1);
                        for j=1:c
                            if temmin>s(j)
                                temmin=s(j);
                            end
                        end
                        w(i)=temmin-t(i);
                        p(i)=1;
                        s(c+1)=t(i)+w(i)+f(i);
                    end
                end
    else
         for j=1:c
            if s(j)<t(i)&&z(j)~=0
                z(j)=0;
                s(j)=0;
            end
         end
         j=1;
         while j<=c
             if z(j)==0
                 z(j)=1;
                 s(j)=t(i)+f(i);
                 w(i)=0;
                 break;
             end
               j=j+1;
         end
         if j==c+1
             p(i)=p(i-1)+1;
             temmin=s(1);
             for j=1:c
                 if temmin>s(j)
                     temmin=s(j);
                 end
             end
             w(i)=temmin-t(i);
             s(c+1)=t(i)+w(i)+f(i);
         else
             p(i)=0;
         end
    end
end
mu=sum(w)/256;
mutime=sum(f)/256+sum(w)/256;

相關文章