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)