【DCTWVRP】基於matlab遺傳算法求解帶容量+距離+距離的VRP問題【含Matlab源碼 1211期】

1、VRP簡介

1 VRP基本原理 車輛路徑規劃問題(Vehicle Routing Problem,VRP)是運籌學裏重要的研究問題之一。VRP關注有一個供貨商與K個銷售點的路徑規劃的狀況,能夠簡述爲:對一系列發貨點和收貨點,組織調用必定的車輛,安排適當的行車路線,使車輛有序地經過它們,在知足指定的約束條件下(例如:貨物的需求量與發貨量,交發貨時間,車輛容量限制,行駛里程限制,行駛時間限制等),力爭實現必定的目標(如車輛空駛總里程最短,運輸總費用最低,車輛按必定時間到達,使用的車輛數最小等)。 VRP的圖例以下所示: 在這裏插入圖片描述 2 問題屬性與常見問題 車輛路徑問題的特性比較複雜,總的來講包含四個方面的屬性: (1)地址特性包括:車場數目、需求類型、做業要求。 (2)車輛特性包括:車輛數量、載重量約束、可運載品種約束、運行路線約束、工做時間約束。 (3)問題的其餘特性。 (4)目標函數多是總成本極小化,或者極小化最大做業成本,或者最大化準時做業。算法

3 常見問題有如下幾類: (1)旅行商問題 (2)帶容量約束的車輛路線問題(CVRP) 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 該模型很難拓展到VRP的其餘場景,而且不知道具體車輛的執行路徑,所以對其模型繼續改進。 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 (3)帶時間窗的車輛路線問題 因爲VRP問題的持續發展,考慮需求點對於車輛到達的時間有所要求之下,在車輛途程問題之中加入時窗的限制,便成爲帶時間窗車輛路徑問題(VRP with Time Windows, VRPTW)。帶時間窗車輛路徑問題(VRPTW)是在VRP上加上了客戶的被訪問的時間窗約束。在VRPTW問題中,除了行駛成本以外, 成本函數還要包括因爲早到某個客戶而引發的等待時間和客戶須要的服務時間。在VRPTW中,車輛除了要知足VRP問題的限制以外,還必需要知足需求點的時窗限制,而需求點的時窗限制能夠分爲兩種,一種是硬時窗(Hard Time Window),硬時窗要求車輛必需要在時窗內到達,早到必須等待,而遲到則拒收;另外一種是軟時窗(Soft Time Window),不必定要在時窗內到達,可是在時窗以外到達必需要處罰,以處罰替代等待與拒收是軟時窗與硬時窗最大的不一樣。 在這裏插入圖片描述 在這裏插入圖片描述 模型2(參考2017 A generalized formulation for vehicle routing problems): 該模型爲2維決策變量 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 (4)收集和分發問題 (5)多車場車輛路線問題 參考(2005 lim,多車場車輛路徑問題的遺傳算法_鄒彤, 1996 renaud) 在這裏插入圖片描述 因爲車輛是同質的,這裏的建模在變量中沒有加入車輛的維度。 在這裏插入圖片描述 在這裏插入圖片描述 (6)優先約束車輛路線問題 (7)相容性約束車輛路線問題 (8)隨機需求車輛路線問題markdown

4 解決方案 (1)數學解析法 (2)人機交互法 (3)先分組再排路線法 (4)先排路線再分組法 (5)節省或插入法 (6)改善或交換法 (7)數學規劃近似法 (8)啓發式算法函數

5 VRP與VRPTW對比 在這裏插入圖片描述優化

2、遺傳算法簡介

1 引言 在這裏插入圖片描述 在這裏插入圖片描述 2 遺傳算法理論 2.1 遺傳算法的生物學基礎 在這裏插入圖片描述 在這裏插入圖片描述 2.2 遺傳算法的理論基礎 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 2.3 遺傳算法的基本概念 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 2.4 標準的遺傳算法 在這裏插入圖片描述 在這裏插入圖片描述 2.5 遺傳算法的特色 在這裏插入圖片描述 在這裏插入圖片描述 2.6 遺傳算法的改進方向 在這裏插入圖片描述 3 遺傳算法流程 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 4 關鍵參數說明 在這裏插入圖片描述spa

3、部分源代碼

clear all
close all
clc
tic
%% 基礎參數輸入
NIND=100;             %種羣大小
MAXGEN=200;          %遺傳代數
GGAP=0.9;            %代溝
Pc=0.75;             %交叉機率
Pm=0.1;             %變異機率
const=20;            %客戶個數
X=[3.2,14.1;3.8,5.5;15.2,10.9;18.6,12.9;11.9,8.2;10.2,9.5;5.3,9.6;0.6,9.9;6.1,18.0;7.6,19.2
    16.0,15.7;15.3,15.2;1.6,14.7;9.0,9.2;5.4,13.3;7.8,10.0;18.6,7.8;14.5,4.3;15.0,18.7;9.8,5.0;1.4,6.9];   %需求點位置座標,1號點爲出發點
carload_min=3;                %小型車的載重限制
demand=[0.8,0.6,0.4,1.4,0.8,0.6,1.9,1.3,1.8,1.5,0.4,1.6,1.1,1.6,1.0,0.8,1.4,1.2,0.4,1.4];           %服務點需求
D=Distanse(X);
%% 種羣初始化
Chrom=zeros(NIND,const);
for i=1:NIND
    Chrom(i,:)=randperm(const);   %種羣初始化
end
%% 畫出隨機解的路徑圖
[ObjV,route]=PathLength(D,Chrom); %計算路線長度和路徑
preObjV=min(ObjV);                %初始種羣的最優個體
route_initial=routemake(route,1); %第一個個體的路徑
% DrawPath(route_initial,X);
% hold off
% pause(0.0001);
%% 輸出隨機解的路徑和總距離
disp('初始種羣中的一個隨機值:')
OutputPath(route_initial);
disp(['總成本:',num2str(ObjV(1))]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 計算目標函數
%% 優化
gen=0;
MinY=inf;
trace=zeros(MAXGEN,1);
h=waitbar(0,'程序啓動中,請等待...');
while gen<MAXGEN
    %% 計算適應度
    [ObjV,route]=PathLength(D,Chrom); %計算路線長度
    %line([gen-1,gen],[preObjV,min(ObjV)]);
    %pause(0.0001)
    %preObjV=min(ObjV);
    % 適應度函數計算
    FitnV=Fitness(ObjV);
    % 選擇
    SelCh=Select(Chrom,FitnV,GGAP);
    % 交叉操做
    SelCh=Recombin(SelCh,Pc);
    % 變異
    SelCh=Mutate(SelCh,Pm);
    % 逆轉操做
    SelCh=Reverse(SelCh,D);
    % 重插入子代的新種羣
    Chrom=Reins(Chrom,SelCh,ObjV);
    % 更新迭代次數
    gen=gen+1;
    % 最優解保存
    [minObjV,minInd]=min(ObjV);          %計算最優解
    route_new=routemake(route,minInd);   %最終路徑
    if minObjV<MinY
        MinY=minObjV;
        best_route=route_new;
        trace(gen,1)=MinY;
    else
        trace(gen,1)=trace(gen-1,1);
    end
    str=['程序正常運行中,','已迭代',num2str(gen),'次'];
    waitbar(gen/MAXGEN,h,str);
    pause(0.05);
end
%% 繪製
plot(1:gen,trace);
title('優化過程');
xlabel('迭代次數');
ylabel('最優值');
hold off
%% 畫出最優解的路線圖
[car1_num,car2_num]=car_type(best_route,demand,carload_min);%輸出各類車型的數量
Num_car=car1_num+car2_num;
DrawPath(best_route,X);
hold off
%% 輸出最優解的路徑和總距離
disp('最優解:')
p=OutputPath(route_new);
disp(['總成本:',num2str(minObjV)]);
disp(['車輛分配:','大車',num2str(car1_num),'輛',';','小車',num2str(car2_num),'輛',';']);
disp('------------------------------------');
toc


複製代碼

4、運行結果

在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述

5、matlab版本及參考文獻

1 matlab版本 2014a3d

2 參考文獻 [1] 包子陽,餘繼周,楊杉.智能優化算法及其MATLAB實例(第2版)[M].電子工業出版社,2016. [2]張巖,吳水根.MATLAB優化算法源代碼[M].清華大學出版社,2017.code

相關文章
相關標籤/搜索