生活随笔
收集整理的這篇文章主要介紹了
matlab遗传算法外卖配送优化(新的约束条件)【matlab优化算法十六】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模型
問題假設
在外賣配送過程中,會出現很多種不確定情況導致配送時間的浪費,如配送過程中物品損傷,如果配送車輛裝載過多,會導致物品擠壓破損;當天天氣情況的不穩定導致配送不及時;某交通路段發生交通事故等不可人為控制的情況。為了減少外部因素對本次配送路徑優化的影響,針對外賣配送過程中出現上述所描述的情況進行如下問題假設:
(1)一個客戶的訂單只能由一個配送員配送,且配送員接受一個訂單后,先完成該訂單才能接另一個客戶訂單。
(2)每條送餐路徑的配送時間小于配送車輛的最大行駛時間。
(3)忽略天氣、車禍、配送車輛行駛過程中無法使用等不可控的外界因素。
(4)確保每輛車從配送中心出發,完成配送任務后,最終返回到配送中心。
(5)每個客戶僅能服務配送一次。
(6)由于配送車輛在行駛過程中的速度是不可控的,為了可以方便計算路線規劃效果,將行駛速度規定為某個固定值。
2.2模型參數
模型主要參數如下:
N = {O}∪N+∪N-:表示所有節點的集合,包括配送中心(O),n個訂單中所有餐館的集合N +以及所有客戶的集合N-;
A = { (i,j) | i ∈ N , j ∈ N} : 表示所有弧的集合
R:表示訂單集合
其中訂單 r = (pr,dr),pr∈N+,dr∈N-
K:配送車輛數;
L:配送車輛最大行駛里程限制
Zrk:表示將訂單分派給車輛k時為1,否則為0
Xijk:表示第k輛車從結點i行駛到結點j時為1,否則為0
v: 表示配送速度
dij =|xi-xj|+|yi-yj|:表示兩點之間的距離
tij:表示結點i到結點j之間的行駛的時間
C1:單位距離成本(KM)
C2:單位懲罰成本(min)
Wi:配送員在節點i的停留時間
Tick:第k個配送員沒有在規定時間到達節點i時受到的懲罰時間
Li:節點i的最晚服務時間
Ti:配送員到達節點i的時間
2.3模型建立
針對本論文的目標,建立如下的模型:
Min Z = ∑k∈K(∑i∈N∑j∈NC1dijXijk) + ∑k∈K (C2 * ∑i∈N Tick) (1)
s.t.
∑k∈K Zrk =1,?r∈R (2)
確保每一張訂單有且只由一輛車來完成
Zrk=∑i∈N Xi(pr)k=X(pr)(dr)k=∑j∈N X (dr)jk ?k∈K (3)
確保每個訂單都能被選中的車進行正確服務
∑k∈K∑j∈N Xijk=1,?i∈N+∪N- (4)
確保每個結點最多被一輛車訪問一次
∑j∈N Xo+jk=∑i∈N Xio-k<= 1,?k∈K (5)
確保每輛車從配送中心出發,并最終返回到配送中心
可以為0或者1,如果是0說明這輛車沒有被使用
∑i∈N Xihk - ∑j∈N Xhjk = 0, ?k∈K,?h∈N (6)
確保車輛到達一個結點(非配送中心結點),一定會從該結點離開
∑ Xijk * dij ≦ L ,?k∈K,?i∈N,?j∈N (7)
車輛最大行駛里程約束
∑k∈K∑j∈N Xo+jk ≦ K (8)
確保分派出去的配送員數量小于配送員總數
Ti+Wi+tij = Tj ,?i∈N,?j∈N (9)
表示配送員從當前節點行駛到下一節點時,到達下一節點的時間為到達前節點的時間、在前節點停留時間和行駛時間之和
T_ick = {█(T_i - L_(i ),T_i - L_(i )>0@0,其他)┤ (10)
表示判斷第k個配送員是否需要接受懲罰
clear
clc
close all
tic
%% 用importdata這個函數來讀取文件
% shuju
=importdata('cc101
.txt'
);
load('zdz'
);
shuju
=c101
;
% bl
=importdata('
103.txt'
);
bl
=0;
cap
=20; %車輛最大裝載量
%% 提取數據信息E
=shuju(1,5); %配送中心時間窗開始時間
L
=shuju(1,6); %配送中心時間窗結束時間
zuobiao
=shuju(:,2:3); %所有點的坐標x和y
% vertexs
= vertexs
./1000;
customer
=zuobiao(2:end
,:); %顧客坐標
cusnum
=size(customer
,1); %顧客數
v_num
=6; %車輛最多使用數目
demands
=shuju(2:end
,4); %需求量
a
=shuju(2:end
,5); %顧客時間窗開始時間
[a
[i
],b
[i
]]
b
=shuju(2:end
,6); %顧客時間窗結束時間
[a
[i
],b
[i
]]
s
=shuju(2:end
,7); %客戶點的服務時間
h
=pdist(zuobiao
);
% dist
=load('dist1
.mat'
);
% dist
=struct2cell(dist
);
% dist
=cell2mat(dist
);
% dist
=dist
./1000; %實際城市間的距離
dist
=squareform(h
); %距離矩陣,滿足三角關系,暫用距離表示花費c
[i
][j]=dist
[i
][j]
%% 遺傳算法參數設置
alpha
=100000; %違反的容量約束的懲罰函數系數
belta
=900; %違反晚到時間窗約束的懲罰函數系數
belta2
=60;%違反早到時間窗約束的懲罰函數系數
chesu
=100;NIND
=100; %種群大小
MAXGEN
=500; %迭代次數
Pc
=0.9; %交叉概率
Pm
=0.05; %變異概率
GGAP
=0.9; %代溝
(Generation gap
)
N
=cusnum
+v_num
-1; %染色體長度
=顧客數目
+車輛最多使用數目
-1
n
=cusnum
/2+v_num
-1;
nn
=cusnum
/2;
% N
=cusnum
;
%% 初始化種群
% init_vc
=init(cusnum
,a
,demands
,cap
); %構造初始解
%% 種群初始化
Chrom
=InitPop(NIND
,n
);
% Chrom
=InitPopCW(NIND
,N
,cusnum
,init_vc
);
%% 輸出隨機解的路線和總距離
disp('初始種群中的一個隨機值
:'
)[VC
,NV
,TD
]=decode(Chrom(1,:),cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,chesu
,bl
,nn
);
% disp(['總距離:'
,num2str(TD
)]);
disp(['車輛使用數目:'
,num2str(NV
),',車輛行駛總距離:'
,num2str(TD
)]);
disp('
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
)
%% 優化
gen
=1;
figure
;
hold on;box
on
xlim([0,MAXGEN
])
title('優化過程'
)
xlabel('代數'
)
ylabel('最優值'
)
ObjV
=calObj(Chrom
,cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,alpha
,belta
,belta2
,chesu
,bl
,nn
); %計算種群目標函數值
preObjV
=min(ObjV
);
while gen
<=MAXGEN
%% 計算適應度ObjV
=calObj(Chrom
,cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,alpha
,belta
,belta2
,chesu
,bl
,nn
); %計算種群目標函數值
line([gen
-1,gen
],[preObjV,min(ObjV)]);pause(0.0001)%畫圖 最優函數preObjV
=min(ObjV
);FitnV
=Fitness(ObjV
);%% 選擇SelCh
=Select(Chrom
,FitnV
,GGAP
);%% OX交叉操作SelCh
=Recombin(SelCh
,Pc
);%% 變異SelCh
=Mutate(SelCh
,Pm
);%% 局部搜索操作
% SelCh
=LocalSearch(SelCh
,cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,alpha
,belta
,belta2
,chesu
,bl
);%% 重插入子代的新種群Chrom
=Reins(Chrom
,SelCh
,ObjV
);%% 刪除種群中重復個體,并補齊刪除的個體
% Chrom
=deal_Repeat(Chrom
);%% 打印當前最優解ObjV
=calObj(Chrom
,cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,alpha
,belta
,belta2
,chesu
,bl
,nn
); %計算種群目標函數值
[minObjV,minInd]=min(ObjV
);disp(['第',num2str(gen
),'代最優解
:'
])[bestVC
,bestNV
,bestTD
]=decode(Chrom(minInd(1),:),cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,chesu
,bl
,nn
);disp(['車輛使用數目:'
,num2str(bestNV
),',車輛行駛總距離:'
,num2str(bestTD
)]);fprintf('\n')%% 更新迭代次數gen
=gen
+1 ;
end
%% 畫出最優解的路線圖
ObjV
=calObj(Chrom
,cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,alpha
,belta
,belta2
,chesu
,bl
,nn
); %計算種群目標函數值
[minObjV,minInd]=min(ObjV
);
%% 輸出最優解的路線和總距離
disp('最優解
:'
)
bestChrom
=Chrom(minInd(1),:);
[bestVC,bestNV,bestTD]=decode(bestChrom
,cusnum
,cap
,demands
,a
,b
,L
,s
,dist
,chesu
,bl
,nn
);
disp(['車輛使用數目:'
,num2str(bestNV
),',車輛行駛總距離:'
,num2str(bestTD
)]);
disp('
-------------------------------------------------------------'
)%% 畫出最終路線圖
draw_Best(bestVC
,zuobiao
,nn
);
% save c101
.mat
% toc
如需幫助V:zhangshu2274
總結
以上是生活随笔為你收集整理的matlab遗传算法外卖配送优化(新的约束条件)【matlab优化算法十六】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。