排隊論演算法的matlab實現
朋友畫了一天寫的排隊論演算法,用來解決如下問題,不忍讓它蒙塵,便發了出來讓有緣人拜讀拜讀。
以下是某城區地理簡圖,直線表示可行路徑——公路,每個方格表示一個區域(邊長都為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) 結合附件研究該城區顧客下單規律,估計顧客的平均等待時間。
(找到一個模型描述顧客等待時間與送餐的關係,然後得到一個平均關係)——(思路是通過模擬建模——蒙特卡洛法 即模擬法)
- Step1 建立送餐地點和時間的概率模型——比較難弄這個。。。
- Step2 :建模 等待時間=F(x1,x2,x3,x4)
- 模擬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;
相關文章
- FFT演算法實現與分析MATLABFFT演算法Matlab
- Matlab與自己實現的平滑演算法對比Matlab演算法
- 蟻群演算法原理及Matlab實現演算法Matlab
- 圖論最短路徑問題與matlab實現圖論Matlab
- 認知無線電切換演算法,基於排隊論原始碼演算法原始碼
- 量子圖形加密演算法的MATLAB程式碼實現加密演算法Matlab
- 基於Redis實現一套支援排隊等待的限流器Redis
- 基於MATLAB的指紋識別演算法模擬實現Matlab演算法
- 基於粒子群演算法的分組揹包MATLAB實現演算法Matlab
- 差分進化演算法介紹及matlab實現演算法Matlab
- verilog的RR輪詢排程演算法的程式碼實現演算法
- 任務排程並行演算法的Java簡單實現並行演算法Java
- 任務排程並行演算法的Python簡單實現並行演算法Python
- 火柴排隊
- XYD 排隊
- 排隊論——隨機服務系統模擬精解隨機
- 樹迴歸|理論與演算法實現演算法
- 資料結構棧和佇列排隊演算法應用的例子【停車場停車位排隊管理系統】資料結構佇列演算法
- 數值積分公式及龍貝格(Romberg)演算法實現matlab公式演算法Matlab
- sobel運算元,matlab實現Matlab
- 水晶藍蓮花(Matlab實現)Matlab
- MATLAB實戰系列(十一)-多種群遺傳演算法的函式優化演算法(附MATLAB程式碼)Matlab演算法函式優化
- 運籌優化(十六)--排隊論基礎及其最優化求解優化
- PHP 程式池與輪詢排程演算法實現多工PHP演算法
- Matlab設定Legend橫排、分塊Matlab
- Matlab 實現介面相應滑鼠事件Matlab事件
- 主成分分析及其matlab實現Matlab
- 奇異值分解以及matlab實現Matlab
- 封裝一個阻塞佇列,輕鬆實現排隊執行任務功能!封裝佇列
- 用js實現快排JS
- 粒子群優化演算法對BP神經網路優化 Matlab實現優化演算法神經網路Matlab
- matlab實現調整圖片的對比度Matlab
- 理論+演算法+實戰,教你如何實現億級流量下的分散式限流演算法分散式
- 如何實現高效的團隊合作?
- 關於實現論壇的回覆評論
- C語言寫的磁碟排程演算法,歡迎大家來討論C語言演算法
- P1223 排隊接水
- CompleteFuture實現簡單的任務編排實踐