货物配送问题的matlab,使用遗传算法求解物流中心配送问题
首先抱歉好久沒來論壇發帖了,以前曾經發過一個關于物流中心配送問題的求助帖,問題雖然在論壇內沒有得到解決,但是后來我閱讀了一些關于遺傳算法的文獻最終解決了該問題,現將MATLAB程序給大家分享一下,有什么不對的地方希望大家多批評指正:
原始問題:
某物流中心擁有一支貨運車隊,每臺貨運車輛的載重量(噸)相同、平均速度(千米/小時)相同,該物流中心用這樣的車為若干個客戶配送物資,物流中心與客戶以及客戶與客戶之間的公路里程(千米)為已知。每天,各客戶所需物資的重量(噸)均已知,并且每個客戶所需物資的重量都小于一臺貨運車輛的載重量,所有送貨車輛都從物流中心出發,最后回到物流中心。物流中心每天的配送方案應當包括:當天出動多少臺車?行駛路徑如何?由此形成的當天總運行里程是多少?一個合格的配送方案要求送貨車輛必須在一定的時間范圍內到達客戶處,早到達將產生等待損失,遲到達將予以一定的懲罰;而一個好的配送方案還應該給出使配送費用最小或總運行里程最短的車輛調度方案。要求:
1. 建立送貨車輛每天總運行里程最短的一般數學模型,并給出求解方法。
2. 具體求解以下算例,并給出你們實際使用的軟件名稱、命令和編寫的全部計算機源程序。
〔算例〕載重量為Q =8 噸、平均速度為v = 50千米/小時的送貨車輛從物流中心(i =0)出發,為編號是i =1,2,…,8 的8個客戶配送物資。某日,第i個客戶所需物資的重量為qi噸(qi < Q),在第i 個客戶處卸貨時間為si小時,第i個客戶要求送貨車輛到達的時間范圍[ai,bi]由表1給出。物流中心與各客戶以及各客戶間的公路里程(單位:千米)由表2給出。問當日如何安排送貨車輛(包括出動車輛的臺數以及每一臺車輛的具體行駛路徑)才能使總運行里程最短。
表1 物資配送任務及其要求
客戶i? ?? ?? ???1? ? 2? ???3? ?4? ? 5? ?6? ? 7? ?8
i q (噸 )2??1.5??4.5??3??1.5??4? ? 2.5??3
i s (小時)1? ?2? ?? ?1? ? 3? ?2??2.5? ?3??0.8
【ai,bi】 [1, 4] [4, 6] [1, 2] [4, 7] [3, 5.5] [2, 5] [5, 8] [1.5, 4]
表2 配送點之間的公路里程(千米)
0 1? ?2??3? ? 4? ?5? ?6? ???7? ???8
0??0 40 60 75 90 200 100 160 80
1 40 0 65 40 100 50 75 110 100
2 60 65 0 75 100 100 75 75 75
3 75 40 75 0 100 50 90 90 150
4 90 100 100 100 0 100 75 75 100
5 200 50 100 50 100 0 70 90 75
6 100 75 75 90 75 70 0 70 100
7 160 110 75 90 75 90 70 0 100
8 80 100 75 150 100 75 100 100 0(0代表出發點)
以下是基于Matlab的遺傳算法程序:
clc,clear
w=20,g=50;%種群大小為20,進化代數為50 代
rand('state',sum(clock));
for i=1:20%選取初始種群
c1=randperm(8);%調用隨機置換向量函數
k1=juli(c1);%調用用戶自定義函數juli
c2=randperm(8);%調用隨機置換向量函數
k2=juli(c2);%調用用戶自定義函數juli
if k1>=k2
J(i,c2)=1:8;%記錄每個點出現在物流鏈中的位置
else
J(i,c1)=1:8
end
end
J=J/8;%染色體編碼
for k=1:g %該層循環進行遺傳算法的操作
A=J;
c=randperm(w);%生成1 到20 的隨機數
for i=1:2:w%該層進行交叉操作
F=ceil(8*rand(1));%調用向正無窮取整函數
temp=A(c(i),[F:8]);%交叉操作
A(c(i),[F:8])=A(c(i+1),[F:8]);%交叉操作
A(c(i+1),[F:8])=temp;%交叉操作
end
by=[];%為了防止下面產生空地址,這里先初始化
while ~length(by)
7
by=find(rand(1,w)<0.1);%%調用產生均勻分布隨機數函數,變異概率小于
0.1
end
B=A(by,:);%提取變異的染色體
for j=1:length(by)%該層進行變異操作
bw=sort(ceil(8*rand(1,3)));%調用向正無窮取整函數
B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:8]);%變異操作
end
G=[J;A;B];%父代和子代種群合在一起
[SG,ind1]=sort(G,2);%將染色體翻譯成整數序列
num=size(G,1);long=zeros(1,num);
for j=1:num
long(j)=juli(ind1(j,:));%調用用戶自定義函數juli
k(j)=lujinshu(ind1(j,:));%調用用戶自定義函數lujinshu
z(j)=long(j)+(k(j)-3)*10000;%適應度公式
end
[slong,ind2]=sort(z);%從小到大排列適應度函數
J=G(ind2(1:w),:); %精選前w 個較短的路徑對應的染色體
end
path=ind1(ind2(1),:), flong=slong(1);
用戶自定義函數juli:
function juli=juli(l); %l 為八維行向量
d=load('distance.txt');%加載距離矩陣
q=[2 1.5 4.5 3 1.5 4 2.5 3];%各物流點所需貨物量
for i=1:8
p(i)=q(l(i));%將需求量矩陣提取出來
end
for a1=1:8%該層進行路徑數目的判斷
if (sum(p(1:a1))<=8&sum(p(1:a1+1))>8)%調用求和函數
k=1;j=a1+1;break;
end
end
for a2=j:8
if (sum(p(j:a2))<=8&sum(p(j:a2+1))>8)
k=2;j=a2+1;break;
end
end
if sum(p(j:8))<=8
8
k=3;L1=zeros(1,12);L1(1)=9;L1(12)=9;L1(a1+2)=9;L1(a2+3)=9;%為了
方便編程,將物流中心編號為9
for i=1:a1%該層循環用于計算三條路徑的里程值之和
L1(i+1)=l(i)
end
for i=a1+1:a2
L1(i+2)=l(i)
end
for i=a2+1:8
L1(i+3)=l(i)
end
for i=1:11
D1(i)=d(L1(i),L1(i+1))
end
juli=sum(D1(1:11));
else
for e=j:8
if (sum(p(j:e))<=8&sum(p(j:e+1))>8)
k=4;a3=e;break;
end
end
L2=zeros(1,13);L2(1)=9;L2(13)=9;L2(a1+2)=9;L2(a2+3)=9;L2(a3+4)=9;%為了
方便編程,將物流中心編號為9
for i=1:a1%計算四條路徑的里程數之和
L2(i+1)=l(i)
end
for i=a1+1:a2
L2(i+2)=l(i)
end
for i=a2+1:a3
L2(i+3)=l(i)
end
for i=a3+1:8
L2(i+4)=l(i)
end
for i=1:12
D2(i)=d(L2(i),L2(i+1))
end
juli=sum(D2(1:12));
end
9
用戶自定義函數lujinshu:
function lujinshu=lujinshu(l);%l 為8 維行向量
d=load('distance.txt');%加載距離矩陣
q=[2 1.5 4.5 3 1.5 4 2.5 3];%各物流點所需貨物量
for i=1:8
p(i)=q(l(i));%提取貨物需求量矩陣
end
for a1=1:8%該層用于判斷路勁數
if (sum(p(1:a1))<=8&sum(p(1:a1+1))>8)
k=1;j=a1+1;break;
end
end
for a2=j:8
if (sum(p(j:a2))<=8&sum(p(j:a2+1))>8)
k=2;j=a2+1;break;
end
end
if sum(p(j:8))<=8
lujinshu=3;
else
lujinshu=4;
end
距離矩陣distance:
000 065 040 100 050 075 110 100 040
065 000 075 100 100 075 075 075 060
040 075 000 100 050 090 090 150 075
100 100 100 000 100 075 075 100 090
050 100 050 100 000 070 090 075 200
075 075 090 075 070 000 070 100 100
110 075 090 075 090 070 000 100 160
100 075 150 100 075 100 100 000 080
040 060 075 090 200 100 160 080 000
最終運行結果:
(1)總共使用3 輛貨車參與物流配送。
(2)3 輛貨車的配送路徑為:0-1-5-6-0;0-2-7-4-0;0-3-8-0。
(3)行駛的總里程數為865Km。
總結
以上是生活随笔為你收集整理的货物配送问题的matlab,使用遗传算法求解物流中心配送问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB求解非线性方程
- 下一篇: 2013年1季度中国汽车品牌口碑研究报告