C/C++教程

【VRP问题】基于蚁群算法求解带容量限制车辆路径CVRP问题matlab源码

本文主要是介绍【VRP问题】基于蚁群算法求解带容量限制车辆路径CVRP问题matlab源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、算法介绍

 

二、模型

VRPTW的数学模型如下:

 

(2.2)保证了每个顾客只被访问1次

(2.3)保证了装载的货物不超过容量

(2.4)(2.5)(2.6)确保了每辆车从depot出发最后回到depot

(2.7)(2.8)确保在时间窗内开始服务

三、代码

clc %清空命令行窗口
clear %从当前工作区中删除所有变量,并将它们从系统内存中释放
close all %删除其句柄未隐藏的所有图窗
tic % 保存当前时间
%% 蚁群算法求解CDVRP
%输入:
%City           需求点经纬度
%Distance       距离矩阵
%Demand         各需求点需求量
%AntNum         种群个数
%Alpha          信息素重要程度因子
%Beta           启发函数重要程度因子
%Rho            信息素挥发因子
%Q              常系数
%Eta            启发函数
%Tau            信息素矩阵
%MaxIter        最大迭代次数


%输出:
%bestroute      最短路径
%mindisever     路径长度

%% 加载数据
load('../test_data/City.mat')	      %需求点经纬度,用于画实际路径的XY坐标
load('../test_data/Distance.mat')	  %距离矩阵
load('../test_data/Demand.mat')       %需求量
load('../test_data/Travelcon.mat')	  %行程约束
load('../test_data/Capacity.mat')     %车容量约束

%% 初始化问题参数
CityNum = size(City,1)-1;    %需求点个数

%% 初始化参数
AntNum = 8;                            % 蚂蚁数量
Alpha = 1;                              % 信息素重要程度因子
Beta = 5;                               % 启发函数重要程度因子
Rho = 0.1;                              % 信息素挥发因子
Q = 1;                                  % 常系数
Eta = 1./Distance;                      % 启发函数
Tau = ones(CityNum+1);                  % (CityNum+1)*(CityNum+1)信息素矩阵  初始化全为1
Population = zeros(AntNum,CityNum*2+1);  % AntNum行,(CityNum*2+1)列 的路径记录表
MaxIter = 100;                           % 最大迭代次数
bestind = ones(1,CityNum*2+1);	% 各代最佳路径
MinDis = zeros(MaxIter,1);              % 各代最佳路径的长度

%% 迭代寻找最佳路径
Iter = 1;                               % 迭代次数初值

end

%% 找出历史最短距离和对应路径
mindisever = MinDis(MaxIter); % 取得历史最优适应值的位置、最优目标函数值
bestroute = bestind; % 取得最优个体

%删去路径中多余1
for i=1:length(bestroute)-1
    if bestroute(i)==bestroute(i+1) %相邻位都为1时
        bestroute(i)=0;  %前一个置零
    end
end
bestroute(bestroute==0)=[];  %删去多余零元素

bestroute=bestroute-1;  % 编码各减1,与文中的编码一致

%% 计算结果数据输出到命令行
disp('-------------------------------------------------------------')
toc %显示运行时间
fprintf('Total Distance = %s km \n',num2str(mindisever))
TextOutput(Distance,Demand,bestroute,Capacity)  %显示最优路径
disp('-------------------------------------------------------------')

%% 迭代图
figure
plot(MinDis,'LineWidth',2) %展示目标函数值历史变化
xlim([1 Iter-1]) %设置 x 坐标轴范围
set(gca, 'LineWidth',1)
xlabel('Iterations')
ylabel('Min Distance(km)')
title('ACO Process')

%% 绘制实际路线
DrawPath(bestroute,City)

四、演示结果

 

这篇关于【VRP问题】基于蚁群算法求解带容量限制车辆路径CVRP问题matlab源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!