【路徑規劃】基於遺傳演算法求解帶充電站的含時間窗車輛路徑規劃VRPTW問題
阿新 • • 發佈:2021-08-13
一、遺傳演算法(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('遺傳迭代圖')
四、模擬結果