1. 程式人生 > 其它 >【路徑規劃】基於遺傳演算法求解帶充電站的含時間窗車輛路徑規劃VRPTW問題

【路徑規劃】基於遺傳演算法求解帶充電站的含時間窗車輛路徑規劃VRPTW問題

一、遺傳演算法(GA)


基本思想是種群仿照生物遺傳進化,通過基因交叉、突變繁衍出子代,形成新的種群,然後根據種群中每個個體的適應值,淘汰代價較高的個體,餘下個體繼續繁衍。在VRP問題中具體步驟如下:
(1)設定種群大小,設定繁衍代數,對所有的配送點編號,每個個體對應於所有配送點的一種排序,初始化得到初始種群;
(2)通過交叉、變異操作,形成子代,與原來的父代形成新的種群;
(3)根據載貨量限制,確定何時回貨源取貨,再結合代價標準,對種群中的每個個體計算適應值;
(4)根據適應值,淘汰代價高的父代子代,餘下個體形成新的種群,繁衍代數增加1;
(5)若繁衍代數達到(1)中設定的初值,停止繁衍,返回代價最小的個體,即最為最佳的配送次序;否則,返回(2)。

二、有時間窗車輛路徑問題(TWVRP模型)

有時間窗車輛路徑問題(vehicle routing problems with time windows,VRPTW)車輛路線問題(VRP)最早是由Dantzig和Ramser於1959年首次提出,它是指一定數量的客戶,各自有不同數量的貨物需求,配送中心向客戶提供貨物,由一個車隊負責分送貨物,組織適當的行車路線,目標是使得客戶的需求得到滿足,並能在一定的約束下,達到諸如路程最短、成本最小、耗費時間最少等目的。

三、部分程式碼

%% 包括充電站
clc;
clear all
close all

filename='.\evrptw_instances\c101_21.txt';
[NO,type,XCOORD, YCOORD,DEMAND,READY_TIME,DUE_DATE,SERVICE_TIME]=textread(filename,'%s%s%s%s%s%s%s%s','headerlines',1);
%% 進行經驗求解路徑
K=1:50;%對客戶點隨機排序
M=50;%任務量
capacity = 200;%車子載重
timewindows_yuanshi=[str2num(char(READY_TIME))';str2num(char(DUE_DATE))'];%時間窗
coordinate_yuanshi=[str2num(char(XCOORD)),str2num(char(YCOORD))];%座標資訊
coordinate_chongdianzhan=[coordinate_yuanshi(2:22,1)';coordinate_yuanshi(2:22,2)';]';%充電站座標
demand_yuanshi=str2num(char(DEMAND))';%所有需求
service_yuanshi=str2num(char(SERVICE_TIME))';%所有服務時間
D=distanse(coordinate_yuanshi);%距離
coordinate=[coordinate_yuanshi(1,1),coordinate_yuanshi(K(1:M)+22,1)';coordinate_yuanshi(1,2),coordinate_yuanshi(K(1:M)+22,2)';]';%中心和客戶座標位置
timewindows=[timewindows_yuanshi(1,1),timewindows_yuanshi(1,K(1:M)+22) ;timewindows_yuanshi(1,2),timewindows_yuanshi(2,K(1:M)+22)];%隨機選取的客戶點時間窗
demand=[demand_yuanshi(1),demand_yuanshi(K(1:M)+22)];%隨機選取的客戶點需求
service=[service_yuanshi(1),service_yuanshi(K(1:M))+22];%隨機選取的客戶點服務時間
D2=distanse(coordinate);%距離
renwudian1=[1,K(1:M)+22];%包括起點的任務點
Q=77.751111;%電量
r=0.4;%消耗率
g=0.5;%充電
v=1;%速度

% %% 遺傳引數初始化
C=1000;%C為停止代數,遺傳到第 C代時程式停止,C的具體取值視問題的規模和耗費的時間而定
Pc=0.9;%交叉概率
Pm=0.4;%變異概率
popsize=50;%種群數量
%經驗公式m=[Σgi /aq]+1,粗求車輛數

a = 0.8;   %【3】
k1 = round((sum(abs(demand))./(a*capacity)));    %最小車輛數
k2 = round((sum(abs(demand))./(a*capacity)))+1;    %最大車輛數
original = 200;%初始每輛車的載貨量
minvalue_ga = 1000000;%隨便設定的最優值,不能太小
for k = k1:1:k2 %每種車輛數做一次尋優
   
    [tempR,tempvalue] = Run_VRP(D,D2,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm,service,renwudian1,Q,r,g,v);%運算返回最優路徑R和其總距離Rlength
    if min(tempvalue) < minvalue_ga
        minvalue_ga = min(tempvalue);%如果小於最小適應度值,替代&& min(tempvalue)>100
        R_ga = tempR;%儲存最小路徑
        minvehicle = k;%儲存最小車輛數量
        shiyingdu=tempvalue ;%儲存最小染色體
    end
end
disp(['遺傳求解的適應度值',num2str(minvalue_ga)])
result(D,coordinate_yuanshi,R_ga);
title('遺傳求解')
figure(3)

plot(shiyingdu);
xlabel('代數')
ylabel('適應度值')
title('遺傳迭代圖')

四、模擬結果