一、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)随机需求车辆路线问题

4 解决方案
(1)数学解析法
(2)人机交互法
(3)先分组再排路线法
(4)先排路线再分组法
(5)节省或插入法
(6)改善或交换法
(7)数学规划近似法
(8)启发式算法

5 VRP与VRPTW对比

二、蚁群算法简介

1 蚁群算法(ant colony algorithm,ACA)起源和发展历程
Marco Dorigo等人在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,于是在1991年在其博士论文中首次系统地提出一种基于蚂蚁种群的新型智能优化算法“蚂蚁系统(Ant system,简称AS)”,后来,提出者及许多研究者对该算法作了各种改进,将其应用于更为广泛的领域,如图着色问题、二次分配问题、工件排序问题、车辆路径问题、车间作业调度问题、网络路由问题、大规模集成电路设计等。近些年来,M.Dorigo等人把蚂蚁算法进一步发展成一种通用的优化技术“蚁群优化(Ant Colony Optimization,简称ACO)”,并将所有符合ACO框架的算法称为“蚁群优化算法(ACO algorithm)”。


具体来说,各个蚂蚁在没有事先告知食物在什么地方的前提下开始寻找食物。当一只找到食物以后,它会向环境释放一种挥发性分泌物pheromone (称为信息素,该物质随着时间的推移会逐渐挥发消失,信息素浓度的大小表征路径的远近)信息素能够让其他蚂蚁感知从而起到一个引导的作用。通常多个路径上均有信息素时,蚂蚁会优先选择信息素浓度高的路径,从而使浓度高的路径信息素浓度更高,形成一个正反馈。有些蚂蚁并没有像其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果另开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。最终,信息素浓度最高的路径即是最终被蚂蚁选中的最优路径。
与其他算法相比,蚁群算法是一种比较年轻的算法,具有分布式计算、无中心控制、个体之间异步间接通信等特点,并且易于与其他优化算法相结合,经过不少仁人志士的不断探索,到今天已经发展出了各式各样的改进蚁群算法,不过蚁群算法的原理仍是主干。

2 蚁群算法的求解原理
基于上述对蚁群觅食行为的描述,该算法主要对觅食行为进行以下几个方面模拟:
(1)模拟的图场景中包含了两种信息素,一种表示家,一种表示食物的地点,并且这两种信息素都在以一定的速率进行挥发。
(2)每个蚂蚁只能感知它周围的小部分地方的信息。蚂蚁在寻找食物的时候,如果在感知范围内,就可以直接过去,如果不在感知范围内,就要朝着信息素多的地方走,蚂蚁可以有一个小概率不往信息素多的地方走,而另辟蹊径,这个小概率事件很重要,代表了一种找路的创新,对于找到更优的解很重要。
(3)蚂蚁回窝的规则与找食物的规则相同。
(4)蚂蚁在移动时候首先会根据信息素的指引,如果没有信息素的指引,会按照自己的移动方向惯性走下去,但也有一定的机率改变方向,蚂蚁还可以记住已经走过的路,避免重复走一个地方。
(5)蚂蚁在找到食物时留下的信息素最多,然后距离食物越远的地方留下的信息素越少。找到窝的信息素留下的量的规则跟食物相同。蚁群算法有以下几个特点:正反馈算法、并发性算法、较强的鲁棒性、概率型全局搜索、不依赖严格的数学性质、搜索时间长,易出现停止现象。
蚂蚁转移概率公式:

公式中:是蚂蚁k从城市i转移到j的概率;α,β分别为信息素和启发式因子的相对重要程度;为边(i,j)上的信息素量;为启发式因子;为蚂蚁k下步允许选择的城市。上述公式即为蚂蚁系统中的信息素更新公式,是边(i,j)上的信息素量;ρ是信息素蒸发系数,0<ρ<1;为第k只蚂蚁在本次迭代中留在边(i,j)上的信息素量;Q为一正常系数;为第k只蚂蚁在本次周游中的路径长度。
在蚂蚁系统中,信息素更新公式为:

3 蚁群算法的求解步骤:
(1)初始化参数在计算之初,需要对相关参数进行初始化,如蚁群规模(蚂蚁数量)m、信息素重要程度因子α、启发函数重要程度因子β、信息素会发银子ρ、信息素释放总量Q、最大迭代次数iter_max、迭代次数初值iter=1。
(2)构建解空间将各个蚂蚁随机地置于不同的出发点,对每个蚂蚁k(k=1,2,3…m),按照(2-1)计算其下一个待访问城市,直到所有蚂蚁访问完所有城市。
(3)更新信息苏计算每个蚂蚁经过路径长度Lk(k=1,2,…,m),记录当前迭代次数中的最优解(最短路径)。同时,根据式(2-2)和(2-3)对各个城市连接路径上信息素浓度进行更新。
(4) 判断是否终止若iter<iter_max,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。
(5)判断是否终止若iter<iter_max,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。3. 判断是否终止若iter<iter_max,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。

三、部分源代码

function varargout = AntColonyVRPGUI(varargin)
% ANTCOLONYVRPGUI M-file for AntColonyVRPGUI.fig
%      ANTCOLONYVRPGUI, by itself, creates a new ANTCOLONYVRPGUI or raises the existing
%      singleton*.
%
%      H = ANTCOLONYVRPGUI returns the handle to a new ANTCOLONYVRPGUI or the handle to
%      the existing singleton*.
%
%      ANTCOLONYVRPGUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in ANTCOLONYVRPGUI.M with the given input arguments.
%
%      ANTCOLONYVRPGUI('Property','Value',...) creates a new ANTCOLONYVRPGUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before AntColonyVRPGUI_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to AntColonyVRPGUI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help AntColonyVRPGUI% Last Modified by GUIDE v2.5 11-Jun-2015 00:13:48% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @AntColonyVRPGUI_OpeningFcn, ...'gui_OutputFcn',  @AntColonyVRPGUI_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before AntColonyVRPGUI is made visible.
function AntColonyVRPGUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to AntColonyVRPGUI (see VARARGIN)
% Choose default command line output for AntColonyVRPGUI
handles.output = hObject;%% change !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
handles.ismdvrp = true; %!!!
%%
if handles.ismdvrp == true[handles.initClusters, handles.coordinates] = INIT;handles.clusters = handles.initClusters;set(handles.uipanelBases,'Visible','on');create_init_plot_MDVRP(handles.coordinates, handles.clusters);
else%initialization[vehicles,demands,dist_stations,dist_bases] = INIT_VRP;handles.vehicles = vehicles;handles.demands = demands;handles.distances_stations = dist_stations;handles.distances_bases = dist_bases;set(handles.uipanelBases,'Visible','off');
end
% Update handles structure
guidata(hObject, handles);% UIWAIT makes AntColonyVRPGUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = AntColonyVRPGUI_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on selection change in algorithmPopupmenu.
function algorithmPopupmenu_Callback(hObject, eventdata, handles)
% hObject    handle to algorithmPopupmenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: contents = cellstr(get(hObject,'String')) returns algorithmPopupmenu contents as cell array
%        contents{get(hObject,'Value')} returns selected item from algorithmPopupmenu%set invisible error messages
set(handles.errorMandatoryEditFields,'Visible','off');
%erase text in edit fields
set(handles.evaporationPheromoneEdit,'String','');
set(handles.attractStationEdit,'String','');
set(handles.increasePheromoneEdit,'String','');
set(handles.amountPheromoneEdit,'String','');
set(handles.eliteAntsEdit,'String','');
%set disabled all edit fields
set(handles.evaporationPheromoneEdit,'Enable','off');
set(handles.attractStationEdit,'Enable','off');
set(handles.increasePheromoneEdit,'Enable','off');
set(handles.amountPheromoneEdit,'Enable','off');
set(handles.eliteAntsEdit,'Enable','off');
%set disabled run button
set(handles.runButton,'Enable','off');
%set to 0 all results
set(handles.lengthWayText,'String','-');
set(handles.subroutesNText,'String','-');
set(handles.timeSpentText,'String','-');
if handles.ismdvrp == true%set invisible bases' listboxset(handles.listboxBases,'Visible','off');set(handles.totalLengthText,'Visible','off');set(handles.totalLengthText,'String','-');set(handles.totalLengthLabel,'Visible','off');%clear plotcla;create_init_plot_MDVRP(handles.coordinates, handles.clusters);
end
%clear plot
%cla;
%clear legend
legend('off');
val = get(hObject,'Value');
if val ~= 1 %not placeholder's text (not be executed)if val ~= 2 %not Clark-Wright algorithm%enable edit fields if val == 5 %AntAlg with elite antsset(handles.eliteAntsEdit,'Enable','on');endset(handles.evaporationPheromoneEdit,'Enable','on');set(handles.attractStationEdit,'Enable','on');set(handles.increasePheromoneEdit,'Enable','on');set(handles.amountPheromoneEdit,'Enable','on');end%enable run buttonset(handles.runButton,'Enable','on');
end% --- Executes during object creation, after setting all properties.
function algorithmPopupmenu_CreateFcn(hObject, eventdata, handles)
% hObject    handle to algorithmPopupmenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
endfunction evaporationPheromoneEdit_Callback(hObject, eventdata, handles)
% hObject    handle to evaporationPheromoneEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of evaporationPheromoneEdit as text
%        str2double(get(hObject,'String')) returns contents of evaporationPheromoneEdit as a double% --- Executes during object creation, after setting all properties.
function evaporationPheromoneEdit_CreateFcn(hObject, eventdata, handles)
% hObject    handle to evaporationPheromoneEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
endfunction attractStationEdit_Callback(hObject, eventdata, handles)
% hObject    handle to attractStationEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of attractStationEdit as text
%        str2double(get(hObject,'String')) returns contents of attractStationEdit as a double% --- Executes during object creation, after setting all properties.
function attractStationEdit_CreateFcn(hObject, eventdata, handles)
% hObject    handle to attractStationEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
endfunction increasePheromoneEdit_Callback(hObject, eventdata, handles)
% hObject    handle to increasePheromoneEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of increasePheromoneEdit as text
%        str2double(get(hObject,'String')) returns contents of increasePheromoneEdit as a double% --- Executes during object creation, after setting all properties.
function increasePheromoneEdit_CreateFcn(hObject, eventdata, handles)
% hObject    handle to increasePheromoneEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
endfunction amountPheromoneEdit_Callback(hObject, eventdata, handles)
% hObject    handle to amountPheromoneEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of amountPheromoneEdit as text
%        str2double(get(hObject,'String')) returns contents of amountPheromoneEdit as a double% --- Executes during object creation, after setting all properties.
function amountPheromoneEdit_CreateFcn(hObject, eventdata, handles)
% hObject    handle to amountPheromoneEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
endfunction eliteAntsEdit_Callback(hObject, eventdata, handles)
% hObject    handle to eliteAntsEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of eliteAntsEdit as text
%        str2double(get(hObject,'String')) returns contents of eliteAntsEdit as a double% --- Executes during object creation, after setting all properties.
function eliteAntsEdit_CreateFcn(hObject, eventdata, handles)
% hObject    handle to eliteAntsEdit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end% --- Executes on button press in runButton.
function runButton_Callback(hObject, eventdata, handles)
% hObject    handle to runButton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)%clear legend
legend('off');
%clear plot
%cla;
%set invisible error messages
set(handles.errorMandatoryEditFields,'Visible','off');indexAlg = get(handles.algorithmPopupmenu,'Value');
if indexAlg ~= 1 %not placeholder's text (not be executed)if indexAlg ~= 2 %not Clark-Wright algorithmif indexAlg == 5 %AntAlg with elite antsif isempty(get(handles.eliteAntsEdit,'String'))set(handles.errorMandatoryEditFields,'Visible','on');return;endendif  ( isempty(get(handles.evaporationPheromoneEdit,'String')) || ...isempty(get(handles.attractStationEdit,'String')) || ...isempty(get(handles.increasePheromoneEdit,'String')) || ...isempty(get(handles.amountPheromoneEdit,'String')) )set(handles.errorMandatoryEditFields,'Visible','on');return;endend%set disabled run buttonset(handles.runButton,'Enable','off');if handles.ismdvrp == trueclusters = runAlgorithmMDVRP(indexAlg, handles);handles.clusters = clusters;listbox=findall(gcf,'tag','listboxBases');guidata(listbox,handles);%select first value in bases' listbox set(handles.listboxBases,'Value',1);listboxBases_Callback(listbox, eventdata, handles);elserunAlgorithmVRP(indexAlg, handles);    end%set enabled run buttonset(handles.runButton,'Enable','on');%set enabled zoom toolsset(handles.toolZoomIn,'Enable','on');set(handles.toolZoomOut,'Enable','on');%set enabled pan toolset(handles.toolPan,'Enable','on');zoom reset;
endfunction [clusters] = runAlgorithmMDVRP(index, handles)if index ~= 1if index ~= 2e = str2double(get(handles.evaporationPheromoneEdit,'String'));alpha = str2double(get(handles.attractStationEdit,'String'));beta = str2double(get(handles.increasePheromoneEdit,'String'));tau0 = str2double(get(handles.amountPheromoneEdit,'String'));E = str2double(get(handles.eliteAntsEdit,'String'));endtrytStart = tic; %start spent timeclusters = handles.initClusters;handles.clusters = clusters;basesName = cell(1,length(clusters)+1);basesName{1} = 'Full view';for c = 1:length(clusters)switch indexcase 2 %Clark-Wright[ Route, RouteLength, vehicles ] = Clark_Wright_VRP( ...clusters(c).demands, clusters(c).diststations, ...clusters(c).distbases, clusters(c).vehicles_capacity );case 3 %Ant-minpath[Route, RouteLength, vehicles] = ANT_colony_algorithm_VRP_minpath( ...clusters(c).diststations, clusters(c).distbases, ...clusters(c).demands, [e alpha beta tau0], clusters(c).vehicles_capacity );case 4 %Ant-partition[Route, RouteLength, vehicles] = ANT_colony_algorithm_VRP( ...clusters(c).diststations, clusters(c).distbases, ...clusters(c).demands, [e alpha beta tau0], clusters(c).vehicles_capacity );case 5 %Ant-elite ants[Route, RouteLength, vehicles] = ANT_colony_algorithm_VRP_with_elite_ants( ...clusters(c).diststations, clusters(c).distbases, ...clusters(c).demands, [e alpha beta tau0 E], clusters(c).vehicles_capacity );endhandles.clusters(c).mdvrp = changeStations(clusters, vehicles, RouteLength, Route, c);basesName{c + 1} = sprintf('Base #%d',c); %saving bases that need to be added to listboxendtElapsed = toc(tStart); %end spent timecatch MEmsgbox(strcat('Error occured: ',ME.message),'Error','error');endclusters = handles.clusters;%clear plotcla;create_plot_route_with_vehicles_MDVRP(handles.coordinates, handles.clusters);set(handles.timeSpentText,'String',sprintf('%fs',tElapsed));set(handles.listboxBases, 'String', basesName);set(handles.listboxBases, 'Visible','on');set(handles.totalLengthText,'String',num2str(getTotalLength(handles.clusters)));set(handles.totalLengthText,'Visible','on');set(handles.totalLengthLabel,'Visible','on');endfunction [mdvrp] = changeStations(clusters, vehicles, LR, R, clusterN)mdvrp = struct('length_route',[],'vehicles',[],'simpleVehicles',[],'num_of_subroutes',[]);len = length(vehicles);mdvrp.simpleVehicles = vehicles;for v = 1:lenvehicles(v).route(vehicles(v).route == 1) = 0;len_route = length(vehicles(v).route);for vr = 1:len_routeif vehicles(v).route(vr) ~= 0 %羼腓 礤 徉玎vehicles(v).route(vr) = clusters(clusterN).stations(vehicles(v).route(vr)-1);endendendmdvrp.num_of_subroutes = number_of_subroutes(R);mdvrp.length_route = LR;mdvrp.vehicles = vehicles;function [tlength] = getTotalLength(clusters)tlength = 0;clen = length(clusters);for c = 1:clentlength = tlength + clusters(c).mdvrp.length_route;endfunction runAlgorithmVRP(index, handles)if index ~= 1if index ~= 2e = str2double(get(handles.evaporationPheromoneEdit,'String'));alpha = str2double(get(handles.attractStationEdit,'String'));beta = str2double(get(handles.increasePheromoneEdit,'String'));tau0 = str2double(get(handles.amountPheromoneEdit,'String'));E = str2double(get(handles.eliteAntsEdit,'String'));endtrytStart = tic; %start spent timeswitch indexcase 2 %Clark-Wright[Route,RouteLength,vehicles] = Clark_Wright_VRP( handles.demands, ...handles.distances_stations, handles.distances_bases, handles.vehicles );case 3 %Ant-minpath[Route,RouteLength,vehicles] = ANT_colony_algorithm_VRP_minpath( handles.distances_stations,...handles.distances_bases, handles.demands, [e alpha beta tau0], handles.vehicles);case 4 %Ant-partition[Route,RouteLength,vehicles] = ANT_colony_algorithm_VRP( handles.distances_stations, ...handles.distances_bases, handles.demands, [e alpha beta tau0], handles.vehicles);case 5 %Ant-elite ants[Route,RouteLength,vehicles] = ANT_colony_algorithm_VRP_with_elite_ants( ...handles.distances_stations, handles.distances_bases, handles.demands, ...[e alpha beta tau0 E], handles.vehicles);endtElapsed = toc(tStart); %end spent timecreate_plot_route_with_vehicles( add_bases_to_distances(handles.distances_stations, ...handles.distances_bases), vehicles, [0 handles.demands] );catch MEmsgbox(strcat('Error occured: ',ME.message),'Error','error');endset(handles.lengthWayText,'String',num2str(RouteLength));set(handles.subroutesNText,'String',num2str(number_of_subroutes(Route)));set(handles.timeSpentText,'String',sprintf('%fs',tElapsed));end% --------------------------------------------------------------------
function dataTooltip_ClickedCallback(hObject, eventdata, handles)
% hObject    handle to dataTooltip (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% --------------------------------------------------------------------
function algorithmTooltip_ClickedCallback(hObject, eventdata, handles)
% hObject    handle to algorithmTooltip (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% --- Executes on selection change in listboxBases.
function listboxBases_Callback(hObject, eventdata, handles)
% hObject    handle to listboxBases (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: contents = cellstr(get(hObject,'String')) returns listboxBases contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listboxBases%clear legend
legend('off');
%clear plot
cla;index = get(handles.listboxBases,'value') - 1;
if index == 0 %if user want to see the full graph of routescreate_plot_route_with_vehicles_MDVRP(handles.coordinates, handles.clusters);set(handles.lengthWayText,'String','-');set(handles.subroutesNText,'String','-');
elsecreate_plot_of_base_MDVRP(handles.coordinates, handles.clusters, index);set(handles.lengthWayText,'String',num2str(handles.clusters(index).mdvrp.length_route));set(handles.subroutesNText,'String',num2str(handles.clusters(index).mdvrp.num_of_subroutes));
end% --- Executes during object creation, after setting all properties.
function listboxBases_CreateFcn(hObject, eventdata, handles)
% hObject    handle to listboxBases (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: listbox controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end% --------------------------------------------------------------------
function aboutMenu_Callback(hObject, eventdata, handles)
% hObject    handle to aboutMenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)About %call gui About.m% --------------------------------------------------------------------
function fileMenu_Callback(hObject, eventdata, handles)
% hObject    handle to fileMenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% --------------------------------------------------------------------
function anotherVRPSubmenu_Callback(hObject, eventdata, handles)
% hObject    handle to anotherVRPSubmenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% --------------------------------------------------------------------
function newDataSubmenu_Callback(hObject, eventdata, handles)
% hObject    handle to newDataSubmenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

四、运行结果

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【TWVRP】基于matlab蚁群算法求解带时间窗的多中心车辆路径规划问题【含Matlab源码 112期】相关推荐

  1. 【TWVRP】基于matlab蚁群算法求解带时间窗车辆路径规划问题【含Matlab源码 1930期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  2. 【TWVRP】基于matlab蚁群算法求解带时间窗的车辆路径规划(成本最低)【含Matlab源码 2514期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  3. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题(总成本最低)【含Matlab源码 2590期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  4. 【TWVRP】蚁群算法求解带时间窗的车辆路径规划问题【含Matlab源码 1406期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  5. 【TWVRP】蚁群算法求解带时间窗车辆路径规划问题【含Matlab源码 1930期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  6. 时间窗车辆路径问题matlab代码,【图片】蚁群算法求解有时间窗约束的车辆路径问题matlab程序_蚁群算法吧_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 蚁群算法求解有时间窗约束的车辆路径问题matlab程序 1 简介 带时间窗的车辆路径问题(VRPTW)一般描述为从某一物流配送中心出发,用多台车辆向多个顾 ...

  7. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  8. 【路径规划】基于头脑风暴优化算法求解带时间窗和同时取送货的车辆路径问题附matlab代码

    1 内容介绍 本文主要研究广州番禺配送中心的车辆路径规划问题,首先针对之前车辆运行中的先送货后取货模式,产生车辆运行路线的迂回,以及车辆在回程中的空载,路径规划不合理,送货时间长的问题,采用集成的观点 ...

  9. 【路径规划】基于粒子群算法求解带时间窗的车辆路径规划问题VRPTW模型matlab源码

    1 模型简介 将粒子群算法(PSO)应用于带时间窗车辆路径优化问题(VRPTW),构造车辆路径问题的粒子表达方法,建立了此问题的粒子群算法,并与遗传算法作了比较.实验结果表明,粒子群算法可以快速,有效 ...

  10. 【SDPTWVRP】基于matlab头脑风暴算法求解带时间窗和同时取送货车辆路径问题【含Matlab源码 1990期】

    ⛄一.头脑风暴优化算法(BSO)简介 头脑风暴(BSO)是一种将搜索空间不断缩减的算法.此算法通过不断迭代,最终将局部最优解慢慢精确至全局最优解.其基本过程如图1所示. 图1 头脑风暴算法流程 1 种 ...

最新文章

  1. 什么是薪火相传,民族复兴接力运动员
  2. 创建型模式--多例模式
  3. 零基础可以学python吗-初学者必知:零基础学习Python真的能学会吗?
  4. 未来社会是什么样子的?您猜对了吗?
  5. HTML 中表单form 的相关知识
  6. linux history命令显示时间_每天一条Linux命令(29) more (分页显示内容)
  7. zookeeper结构和命令详解
  8. Java并发编程实战————恢复中断
  9. zabbix mysql 平台_监控平台-zabbix
  10. EXTJS Date 的转换格式化字符
  11. PCL_基于多项式拟合的法线估计、点云平滑和数据重采样_报错
  12. Argparse 使用
  13. Matlab遗传算法工具箱的使用(解决连续性优化问题)
  14. python开发cms_基于Django的Python CMS---wagtail介绍
  15. Windows XP IIS 500错误
  16. android studio中的模拟器,使用Android Studio创建Andorid模拟器
  17. RAB与RB的关系详解
  18. 修改docker容器中的配置文件
  19. AMD phenom(翼龙) x4 955 黑苹果(El Capital 10.11.6)安装成功记录
  20. 如何创建对搜索引擎更加友好的内容

热门文章

  1. Linux 中断下半部
  2. Swift 2.0 自定义cell和不同风格的cell
  3. UVAlive3662 Another Minimum Spanning Tree 莫队算法
  4. canvas绘制圆和弧(三)
  5. 更改VS.NET 默认SCM Provider的方法
  6. 第4章 最基础的分类算法-k近邻算法 kNN 学习笔记 上
  7. 181102每日一句
  8. Atitti.数字证书体系cer pfx attilax总结
  9. Atitit selenium3 新特性
  10. Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27