【路径规划】基于粒子群算法求解VRPTW模型
1 粒子群算法
1.1 研究背景
粒子群算法的發展過程。粒子群優化算法(Partical Swarm Optimization PSO),粒子群中的每一個粒子都代表一個問題的可能解,通過粒子個體的簡單行為,群體內的信息交互實現問題求解的智能性。由于PSO操作簡單、收斂速度快,因此在函數優化、 圖像處理、大地測量等眾多領域都得到了廣泛的應用。 隨著應用范圍的擴大,PSO算法存在早熟收斂、維數災難、易于陷入局部極值等問題需要解決,主要有以下幾種發展方向。
(1)調整PSO的參數來平衡算法的全局探測和局部開采能力。如Shi和Eberhart對PSO算法的速度項引入了慣性權重,并依據迭代進程及粒子飛行情況對慣性權重進行線性(或非線性)的動態調整,以平衡搜索的全局性和收斂速度。2009年張瑋等在對標準粒子群算法位置期望及方差進行穩定性分析的基礎上,研究了加速因子對位置期望及方差的影響,得出了一組較好的加速因子取值。
(2)設計不同類型的拓撲結構,改變粒子學習模式,從而提高種群的多樣性,Kennedy等人研究了不同的拓撲結構對SPSO性能的影響。針對SPSO存在易早熟收斂,尋優精度不高的缺點,于2003年提出了一種更為明晰的粒子群算法的形式:骨干粒子群算法(Bare Bones PSO,BBPSO)。
(3)將PSO和其他優化算法(或策略)相結合,形成混合PSO算法。如曾毅等將模式搜索算法嵌入到PSO算法中,實現了模式搜索算法的局部搜索能力與PSO算法的全局尋優能力的優勢互補。
(4)采用小生境技術。小生境是模擬生態平衡的一種仿生技術,適用于多峰函數和多目標函數的優化問題。例如,在PSO算法中,通過構造小生境拓撲,將種群分成若干個子種群,動態地形成相對獨立的搜索空間,實現對多個極值區域的同步搜索,從而可以避免算法在求解多峰函數優化問題時出現早熟收斂現象。 Parsopoulos提出一種基于“分而治之”思想的多種群PSO算法,其核心思想是將高維的目標函數分解成多個低維函數,然后每個低維的子函數由一個子粒子群進行優化,該算法對高維問題的求解提供了一個較好的思路。
不同的發展方向代表不同的應用領域,有的需要不斷進行全局探測,有的需要提高尋優精度,有的需要全局搜索和局部搜索相互之間的平衡,還有的需要對高維問題進行求解。這些方向沒有誰好誰壞的可比性,只有針對不同領域的不同問題求解時選擇最合適的方法的區別。
1.2 相關模型和思想
粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于對鳥群覓食行為的研究。設想這樣一個場景:一群鳥在隨機搜尋食物,在這個區域里只有一塊食物,所有的鳥都不知道食物在哪里,但是它們知道當前的位置離食物還有多遠。最簡單有效的策略?尋找鳥群中離食物最近的個體來進行搜素。PSO算法就從這種生物種群行為特性中得到啟發并用于求解優化問題。
用一種粒子來模擬上述的鳥類個體,每個粒子可視為N維搜索空間中的一個搜索個體,粒子的當前位置即為對應優化問題的一個候選解,粒子的飛行過程即為該個體的搜索過程.粒子的飛行速度可根據粒子歷史最優位置和種群歷史最優位置進行動態調整.粒子僅具有兩個屬性:速度和位置,速度代表移動的快慢,位置代表移動的方向。每個粒子單獨搜尋的最優解叫做個體極值,粒子群中最優的個體極值作為當前全局最優解。不斷迭代,更新速度和位置。最終得到滿足終止條件的最優解。
算法流程如下:
1、初始化
首先,我們設置最大迭代次數,目標函數的自變量個數,粒子的最大速度,位置信息為整個搜索空間,我們在速度區間和搜索空間上隨機初始化速度和位置,設置粒子群規模為M,每個粒子隨機初始化一個飛翔速度。
2、 個體極值與全局最優解
定義適應度函數,個體極值為每個粒子找到的最優解,從這些最優解找到一個全局值,叫做本次全局最優解。與歷史全局最優比較,進行更新。
3、 更新速度和位置的公式
4、 終止條件
(1)達到設定迭代次數;(2)代數之間的差值滿足最小界限
以上就是最基本的一個標準PSO算法流程。和其它群智能算法一樣,PSO算法在優化過程中,種群的多樣性和算法的收斂速度之間始終存在著矛盾.對標準PSO算法的改進,無論是參數的選取、小生境技術的采用或是其他技術與PSO的融合,其目的都是希望在加強算法局部搜索能力的同時,保持種群的多樣性,防止算法在快速收斂的同時出現早熟收斂。
2 VRP模型
2.1車輛路徑規劃問題介紹
車輛路徑規劃問題,經過60年來的研究與發展,研究的目標對象,限制條件等均有所變化,已經從最初的簡單車輛安排調度問題轉變為復雜的系統問題。最初的車輛路徑規劃問題可以描述為:有一個起點和若干個客戶點,已知各點的地理位置和需求,在滿足各種約束的條件下,如何規劃最優的路徑,使其能服務到每個客戶點,最后返回起點。通過施加不同的約束條件,改變優化的目標,可以衍生出不同種類的車輛路徑規劃問題。同時車輛路徑規劃問題屬于典型的NP-hard問題,其精確算法能求解的規模很小,故啟發式算法也就成了研究熱點。
(2)VRPTW簡介
VRPTW(Vehicle routing problem with time windows)即帶時間窗的車輛路徑規劃問題,其對于每一需求點加入了時間窗的約束,即對于每一個需求點,設定服務開始的最早時間和最晚時間,要求車輛在時間窗內開始服務顧客。
需求點的時窗限制可以分為兩種,一種是硬時間窗(Hard Time Window),即要求車輛必須在時間窗內開始服務顧客,早到必須等待,遲到就拒收,另一種是軟時間窗(Soft Time Window),不一定要在時間窗內開始服務顧客,但是在時間窗外開始服務必須要懲罰,以懲罰代替等待與拒收是軟時間窗和硬時時間窗的最大的區別。
VRPTW的數學模型如下:
(2.2)保證了每個顧客只被訪問1次
(2.3)保證了裝載的貨物不超過容量
(2.4)(2.5)(2.6)確保了每輛車從depot出發最后回到depot
(2.7)(2.8)確保在時間窗內開始服務
3 代碼
%tic clear clc %% 用importdata這個函數來讀取文件 r101=importdata('r101.txt'); cap=200; %車輛最大裝載量 %% 提取數據信息 E=r101(1,5); %配送中心時間窗開始時間 L=r101(1,6); %配送中心時間窗結束時間 vertexs=r101(:,2:3); %所有點的坐標x和y customer=vertexs(2:end,:); %顧客坐標 cusnum=size(customer,1); %顧客數 v_num=25; %車輛最多使用數目 demands=r101(2:end,4); %需求量 a=r101(2:end,5); %顧客時間窗開始時間[a[i],b[i]] b=r101(2:end,6); %顧客時間窗結束時間[a[i],b[i]] s=r101(2:end,7); %客戶點的服務時間 h=pdist(vertexs); dist=squareform(h); %距離矩陣 %% 粒子群算法參數 alpha=10; %違反的容量約束的懲罰函數系數 belta=100; %違反時間窗約束的懲罰函數系數 NIND=50; %粒子數目 MAXGEN=100; %迭代次數 w=1; %慣性因子 wdamp=0.99; %慣性因子衰減率 c1=1.5; %個體學習因子 c2=2.0; %全局學習因子 XvMin=1; %Xv下限 XvMax=v_num; %Xv上限 XrMin=1; %Xr下限 XrMax=cusnum; %Xr上限 VvMin=-(v_num-1); %Vv下限 VvMax=v_num-1; %Vv上限 VrMin=-(cusnum-1); %Vr下限 VrMax=cusnum-1; %Vr上限 %% 初始化粒子群位置 init_vc=init(cusnum,a,demands,cap); %構造初始解 population=initpopCW(init_vc,NIND,cusnum,XvMin,XvMax,XrMin,XrMax,VvMin,VvMax,VrMin,VrMax); ObjV=calObj(population,v_num,cap,demands,a,b,L,s,dist,alpha,belta); %計算各個粒子的目標函數值 gbest_pos=population{1,1}(1:2,:); %假設第一個粒子位置為全局最優位置 gbest_obj=ObjV(1,1); %第一個粒子位置的目標函數值 pbest_pos=cell(NIND,1); %初始化各個粒子的個體最優位置 pbest_obj=ObjV; %初始化各個粒子的個體最優的目標函數值 for i=1:NINDparticle=population{i,1}; %第i個粒子position=particle(1:2,:); %第i個粒子的位置pbest_pos{i,1}=position; %初始化這個粒子的個體最優if pbest_obj(i,1)<gbest_obj%更新初始種群中的全局最優粒子gbest_obj=pbest_obj(i,1);gbest_pos=position;end end globalVC=decode(gbest_pos,v_num); %初始全局最優配送方案 %統計一個配送方案的總成本、車輛使用數目、行駛總距離、違反約束路徑數目、違反約束顧客數目 [cost,NV,TD,vio_NV,vio_cus]=statistic(globalVC,a,b,s,L,dist,demands,cap,alpha,belta); disp(['初始全局最優解總成本為:',num2str(cost),',車輛使用數目為:',num2str(NV),...',行駛總距離為:',num2str(TD),',違反約束路徑數目為:',num2str(vio_NV),',違反約束顧客數目為:',num2str(vio_cus)]); BestCost=zeros(MAXGEN,1); %記錄每次迭代的全局最優目標函數值 %% 主循環 gen=1; %計數器 while gen<=MAXGEN%% 更新各個粒子的位置和速度for i=1:NINDparticle=population{i,1}; %第i個粒子position=particle(1:2,:); %第i個粒子的位置Xv=position(1,:);Xr=position(2,:);velocity=particle(3:4,:); %第i個粒子的速度Vv=velocity(1,:);Vr=velocity(2,:);%% 更新速度velocity=w*velocity+ +c1*rand([2,cusnum]).*(pbest_pos{i,1}-position)...+c2*rand([2,cusnum]).*(gbest_pos-position);%% 速度越界處理velocity(1,:)=max(velocity(1,:),VvMin);velocity(1,:)=min(velocity(1,:),VvMax);velocity(2,:)=max(velocity(2,:),VrMin);velocity(2,:)=min(velocity(2,:),VrMax);%% 更新位置position=position+velocity;position(1,:)=ceil(position(1,:)); %對Xv向上取整%% 速度鏡像影響IsOutside=(position(1,:)<XvMin | position(1,:)>XvMax | position(2,:)<XrMin | position(2,:)>XrMax);velocity(IsOutside)=-velocity(IsOutside);%% 位置越界處理position(1,:)=max(position(1,:),XvMin);position(1,:)=min(position(1,:),XvMax);position(2,:)=max(position(2,:),XrMin);position(2,:)=min(position(2,:),XrMax);%% 對第i個粒子解碼出的配送方案進行relocate操作VC=decode(position,v_num);RVC=relocate(VC,cap,demands,a,b,L,s,dist,alpha,belta);position=change(RVC,cusnum);%% 計算第i個粒子目標函數值cost=costFuction(RVC,a,b,s,L,dist,demands,cap,alpha,belta);%% 更新個體最優if cost<pbest_obj(i,1)pbest_pos{i,1}=position;pbest_obj(i,1)=cost;%% 更新全局最優if pbest_obj(i,1)<gbest_objgbest_pos=pbest_pos{i,1};gbest_obj=pbest_obj(i,1);endend%% 更新第i個粒子的速度和位置particle=[position;velocity];population{i,1}=particle;end%% 記錄各代全局最優解,打印各代全局最優解BestCost(gen)=gbest_obj;globalVC=decode(gbest_pos,v_num); %初始全局最優配送方案%統計一個配送方案的總成本、車輛使用數目、行駛總距離、違反約束路徑數目、違反約束顧客數目[cost,NV,TD,vio_NV,vio_cus]=statistic(globalVC,a,b,s,L,dist,demands,cap,alpha,belta);disp(['第',num2str(gen),'代全局最優解總成本為:',num2str(cost),',車輛使用數目為:',num2str(NV),...',行駛總距離為:',num2str(TD),',違反約束路徑數目為:',num2str(vio_NV),',違反約束顧客數目為:',num2str(vio_cus)]);w=w*wdamp;%% 更新計數器gen=gen+1; end %% 將全局最優粒子解碼為全局最優配送方案 globalVC=decode(gbest_pos,v_num); %% 對全局最優配送方案進行局部搜索 globalVC=relocate_gbest(globalVC,cap,demands,a,b,L,s,dist,alpha,belta); %% 統計全局最優配送方案的總成本、車輛使用數目、行駛總距離、違反約束路徑數目、違反約束顧客數目[cost,NV,TD,vio_NV,vio_cus]=statistic(globalVC,a,b,s,L,dist,demands,cap,alpha,belta);disp(['最終全局最優解總成本為:',num2str(cost),',車輛使用數目為:',num2str(NV),...',行駛總距離為:',num2str(TD),',違反約束路徑數目為:',num2str(vio_NV),',違反約束顧客數目為:',num2str(vio_cus)]); %% 畫出全局最優配送方案路線圖 draw_Best(globalVC,vertexs); %% Results figure; %plot(BestCost,'LineWidth',2); semilogy(BestCost,'LineWidth',2); xlabel('迭代次數'); ylabel('全局最優目標函數值'); grid on; toc?
總結
以上是生活随笔為你收集整理的【路径规划】基于粒子群算法求解VRPTW模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cas-ESM 安装教程
- 下一篇: hcie网上培训的优势什么?