matlab改进大规模邻域搜索算法求解路径优化
近年來,隨著環境問題的日益突出,越來越多物流配送企業開始使用節能環保的電動物流車。 但是由于續航里程有限及充電設施布局不完善等問題,電動車并不能完全代替燃油車,所以大多物流企業目前主要采用電動車與燃油車混合配送的過渡模式。 與燃油車配送不同,由于電動車需途中進行充電,改變了原有配送系統的配置參數,并對配送時間窗產生影響;此外,實際配送過程中配送中心會在車輛離開后繼續接收新的需求,導致配送系統的狀態不斷發生變化,需要對已有配送方案重新進行調整。 如果不能合理快速地規劃與調整配送路線,不僅會大幅增加企業的運營成本,還會降低顧客服務水平。 因此,研究電動車與燃油車混合配送模式下的動態需求車輛路徑問題具有重要的現實意義。車輛路徑優化(vehicle routing problem,VRP) 一直都是物流配送領域中的熱點問題,從 1959 年 VRP 被 Dantzig 和 Ramser提出后就受到了國內外學者的廣泛關注,目前已有非常豐碩的研究成果。 結合各種現實場景,研究人員開始對基礎的VRP 進行擴展研究,如有載重約束的 VRP(CVRP)[2]、帶時間窗約束的 VRP(VRPTW)[3]、多車型 VRP(HVRP)[4]等。 使用電動物流車的 VRP 稱為電動車車輛路徑問題(EVRP),Conrad等人[5]首次對 EVRP 進行研究,在允許車輛途中充電的條件下,建立使用車輛數目最少以及行駛成本、服務時間成本和充電成本最小的多目標模型;Schneider 等人[6]進一步提出了帶時間窗的 EVRP,建立使用車輛數最小和總行駛成本最小的優化模型,并設計了基于變鄰域搜索和禁忌搜索的混合算法;葛顯龍等人[7]考慮到充電時間對時間窗的違反會存在影響,提出帶軟時間窗的 EVRP,建立了行駛成本、路徑成本以及車輛使用成本為目標函數的數學模型,并設計了節約里程算法加改進的禁忌搜索算法進行求解;Keskin 等人[8]針對帶時間窗的電動車車輛路徑問題,考慮電動車在充電站采取部分充電的情況,設計了自適應大規模鄰域搜索算法進行求解;Pelletier 等人[9]考慮電動車耗電為非線性的情況,研究天氣、道路情況以及司機行為等不確定因素背景下的電動車車輛路徑問題,通過將問題定義為魯棒混合整數線性規劃模型,并設計一種基于大規模鄰域搜索的兩階段啟發式算法進行求解;Alesian 等人[10]提出了可以多次訪問充電站的電動車車輛路徑問題,并采用一種帶有學習策略的進化遺傳算法找到最小化成本(與行駛時間、充電時間、能源消耗相關) 的車輛配送路線;Yang 等人[11]考慮了分時電價的情況,采用可學習的遺傳算法實現對車輛路徑以及充電時間的同時優化。 如果在同一配送系統中同時使用不同類型的車輛進行配送,考慮因素更多,問題更加復雜。Goeke 等人[12]首次對帶時間窗的電動車與燃油車的混合配送問題(EVRPTWMF)進行研究,并設計了自適應大規模鄰域搜索算法進行求解;Hiermann 等人[13]考慮帶時間窗的同時使用傳統燃油車、插電式混合動力車以及電動車三種車型的車輛路徑問題,并設計基于遺傳算法以及局部和大規模鄰域搜索算法的混合啟發式算法進行求解。以上研究均屬于靜態 VRP,即所有客戶需求可以事先確定。 但在實際配送過程中,配送中心會在車輛運行途中繼續接收新客戶的配送需求,并對已有車輛路線重新進行規劃,此類問題即動態需求的 VRP(DDVRP)。 Hong[14]研究帶硬時間窗的 DDVRP,并將動態問題分為一系列的靜態問題,設計了改進的大規模鄰域搜索算法對該問題進行求解;De Armas 等人[15]將車輛工作時間不同、顧客有多個時間窗、顧客之間存在優先級等現實因素考慮到動態車輛路徑問題中,并用變鄰域搜索算法求解;Chen 等人[16]進一步采用自適應大規模鄰域搜索算法進行 DDVRP 的求解;張文博等人[17]針對帶時間窗的 DDVRP 設計了遺傳算法以及模擬退火結合的兩階段算法;李陽等人[18]針對帶載重約束的動態需求車輛路徑問題,提出了一種延遲服務機制,且采用混合變鄰域人工蜂群算法進行多階段求解。綜上所述,目前 DDVRP 已有一定的研究成果,但是這些研究都是基于傳統燃油車。 邵賽等人[19]首次將電動車引入動態需求車輛路徑問題中,研究了不考慮客戶時間窗的電動車配送的 DDVRP。 通過國內外的文獻檢索,目前還沒有發現其他針對電動車的 DDVRP 的研究,此外也未有針對電動車與燃油車混合配送模式下的 DDVRP 的研究。 不同于單一燃油車或電動車 DDVRP,混合配送模式將電動車與燃油車這兩種具有不同配送特點的車輛納入同一配送系統同步考慮,限制因素更多,尤其需同時考慮動態需求和客戶時間窗,模型構建與求解將更為復雜。 考慮到該類問題在企業日常運營中會越來越普遍,本文研究了電動車與燃油車混合配送模式下帶時間窗的動態需求車輛路徑問題(electric vehicle routing problem with timewindows and mixed fleet considering dynamic demands,EVRPTWMF?DD)。 此外,考慮到動態需求對實時性要求較高,而本文研究的 EVRPTWMF?DD 又屬于 NP?hard 問題,用精確算法求解較為困難且時間成本高。 因此,本文根據所建模型的特點設計了改進的自適應大規模鄰域搜索算法,以期在較短的時間內獲得較優的配送方案。1 問題描述EVRPTWMF?DD 可描述為某物流企業使用電動車和燃油車為 N 個有時間窗要求的顧客提供配送服務。 首先,對上一工作日的預約靜態客戶制定配送路線并進行送貨,在配送過程中,若出現新的客戶需求,需要對正在配送的車輛路徑進行重新規劃或派出新車進行服務。 此外,電動車由于續航里程有限,在配送過程中需要到公共充電站充電才能繼續進行配送任務。 該問題的求解目標是尋找車輛行駛總成本最小化的最優路徑。 模型的假設條件如下:a) 每個客戶點只能被一輛車服務,每輛車可以服務多個客戶點,車輛在完成配送服務后要駛回配送中心;b)電動車從配送中心出發時電池為滿電,并且允許在行駛過程中采用滿充的方式進行多次充電,充電站可以被多次訪問。 為了更好地描述問題,給出如圖 1 所示的簡單示例。 本文建立了 EVRPTWMF?DD 的兩階段 0? 1 整數規劃模型,包括初始階段優化模型和動態階段優化模型。2 模型構建2 1 初始階段優化模型初始階段主要對已經預約的靜態客戶點進行路線設計,得到初始的配送路徑優化方案。 模型所用參數與變量如表 1 所示。 初始階段優化模型構建如下:
本;式(2)表示每個客戶只能被訪問一次;式(3) 為流守恒約束;式(4)表示每輛車最多服務一條路徑且從配送中心出發;式(5)表示電動車配送的任務總量不能超過其最大載重;式(6)表示燃油車的配送任務總量不能超過其最大載重量;式(7)表示要滿足客戶點i 的服務時間窗要求;式(8)表示從點i到 j 的行駛時間為兩點之間距離與速度的比值;式(9)表示電動車在充電站充電時間的計算;式(10)表示車輛在到達和離開點 i 的時間關系;式(11)表示車輛到達點j 的時間為前邊行駛時間的累計;式(12)表示電動車到達和離開客戶點的電量不發生改變;式(13)表示電動車在充電站滿充;式(14)表示電動車從點 i 行駛到點 j 的電量消耗關系;式(15)表示電動車到達每一個點的電量都要大于 0;式(16)為 0?1 變量約束條件式(1)為目標函數,最小化包含電動車與燃油車的運輸成
(1)為目標函數,最小化包含電動車與燃油車的運輸成
主程序
tic clear clc %% 輸入數據 dataset=importdata('input.txt'); %數據中,每一列的含義分別為[序號,x坐標,y坐標] x=dataset(:,2); %x坐標 y=dataset(:,3); %y坐標 vertexes=dataset(:,2:3); %提取各個城市的xy坐標 h=pdist(vertexes); dist=squareform(h); %距離矩陣 %% 參數初始化 MAXGEN=300; %最大迭代次數 %% 構造初始解 [Sinit,init_len]=construct_route(dist); %貪婪構造初始解 init_length=route_length(Sinit,dist); str1=['初始總路線長度 = ' num2str(init_length)]; disp(str1) %% 初始化當前解和全局最優解 Scurr=Sinit; curr_length=init_length; Sbest=Sinit; best_length=init_length; %% 主循環 gen=1; BestL=zeros(MAXGEN,1); %記錄每次迭代過程中全局最優個體的總距離 while gen<=MAXGEN%% “破壞”解[Sdestroy,removed]=destroy(Scurr);%% “修復”解[Srepair,repair_length]=repair(removed,Sdestroy,dist);if repair_length<curr_lengthScurr=Srepair;curr_length=repair_length;endif curr_length<best_lengthSbest=Scurr;best_length=curr_length; end%% 打印當前代全局最優解disp(['第',num2str(gen),'代最優路線總長度 = ' num2str(best_length)])BestL(gen,1)=best_length;%% 計數器加1gen=gen+1; end str2=['搜索完成! 最優路線總長度 = ' num2str(best_length)]; disp(str2) %% 畫出優化過程圖 figure; plot(BestL,'LineWidth',1); title('優化過程') xlabel('迭代次數'); ylabel('總距離'); %% 畫出全局最優路線圖 plot_route(Sbest,x,y); toc改進算法構造初始解
%% 貪婪算法構造TSP的初始解 %輸入dist: 距離矩陣 %輸出init_route: 貪婪算法構造的初始路線 %輸出init_len: init_route的總距離 function [init_route,init_len]=construct_route(dist) N=size(dist,1); %城市數目 %先將距離矩陣主對角線上的0賦值為無窮大 for i=1:Nfor j=1:Nif i==jdist(i,j)=inf;endend endunvisited=1:N; %初始未被安排的城市集合 visited=[]; %初始已被安排的城市集合min_dist=min(min(dist)); %找出距離矩陣中的最小值 [row,col]=find(dist==min_dist); %在dist中找出min_dist所對應的行和列 first=row(1); %將min_dist在dist中所對應行序號作為起點unvisited(unvisited==first)=[]; %將first從unvisit中刪除 visited=[visited,first]; %把first添加到visit中 pre_point=first; %將fisrt賦值給pre_point while ~isempty(unvisited)pre_dist=dist(pre_point,:); %pre_point與其它城市的距離pre_dist(visited)=inf; %將pre_point與已經添加進來的城市之間的距離設位無窮大[~,pre_point]=min(pre_dist); %找出pre_dist中的最小值unvisited(unvisited==pre_point)=[]; %將pre_point從unvisit中刪除visited=[visited,pre_point]; %把pre_point添加到visit中 end init_route=visited; init_len=route_length(init_route,dist); %計算init_route的總距離 end
代碼下載連接
總結
以上是生活随笔為你收集整理的matlab改进大规模邻域搜索算法求解路径优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 10彻底关闭window
- 下一篇: UG模具设计结构的设计过程!