多目标蚁群算法路径规划(2.5)------番外篇
系列前言(一定要看)
- 本系列为总结本人近一年多关于启发式算法解决路径规划的相关内容。主要从以下几个主题内容进行系列写作1.常见的数据获取方式与处理过程、,2、算法的基础流程,3.常见算法改进,4.多目标排序、5.基于应用场景的改进、6.其他相关问题、7、批量运行测试数据本系列全程免费提供相关代码。
- 本系列代码来源主要参考网上相关博客与文献、根据不同实际需求重构的代码。
- 本文所有提供的代码与文字说明仅供参考,不作为商业目的。
- 对内容有疑问或是错误部分可以留言或私信。
- 有偿定制特定功能, qq:1602480875。价格范围60—500。(建议优先看完系列内容,尝试系列中的代码,这些都是免费且能解决大部分问题。),具体代码后续会以完整形式上传百度云。
更新时间:2021年5月21日
1.1 本章内容说明
- 包含时间、成本、载货需求变动的路径规划
- 算法设计的流程
- 路径规划主函数
- 路径规划的结果图
1.2 本章主要分享内容简介(摘要)
本章是对路径规划-从数据设计到毕业论文系列系列文章第二章
的一个补充说明,扩散具有的程序的具体设计过程。补充算法
的流程图,完善了结果的展示过程。对算例使用的数据进行呈现
,并描述使用的数据特点。
- 本章代码会于6.20号后补充完整
- 详细讲解会在后续更新过程不断完善。
1.3 算法思路详细流程图
1.4 主函数
%% 输入数据
%% 1602480875@qq.com
%% 版本0.1
clc
clear
close all
S2= xlsread('编队数据.xlsx','Sheet3');
Un = xlsread('编队数据.xlsx','补给时间与价值','A1:C10'); % 可提供的服务时间 消耗时间 消耗的物质的量
microsoftexcel = xlsread('编队数据.xlsx','舰船坐标','A1:B9');
qidian_where=[0 0]; %补给船起始坐标
S3=[microsoftexcel;qidian_where];
%% 清除临时变量
clearvars raw;
%% 数据整理
xdata=S3;
x_label=xdata(1:end,1);
y_label=xdata(1:end,2);
Demand=Un; %补给时间与价值矩阵
C=[x_label y_label]; %坐标矩阵
n=size(C,1); %n表示节点(作战舰船)个数
% ==============计算距离矩阵==============
D=zeros(n,n); %D表示完全图的赋权邻接矩阵,即距离矩阵D初始化
for i=1:n
for j=1:n
if i~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; %计算两舰船之间的距离
if D(i,j)==0
D(i,j)=eps; %对不可直接到达的地方一个赋予一个极小值
end
else
D(i,j)=eps; %i=j, 则距离为0;赋予一个极小值
end
D(j,i)=D(i,j); %距离矩阵为对称矩阵
end
end
v=37; % 30km/h 速度约束矩阵
Alpha=1;%
Beta=5; %
Rho=0.75; % 信息挥发程度
iter_max=100; %迭代次数
Q=10; %
Cap=S2; %最大补给时间限制矩阵
m=size(D,1); %起始放置数目
qidian=m; % qidian起点坐标
[R_best,L_best,L_ave,Shortest_Route,~,L_ave_long]=ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q,qidian,v); %蚁群算法求解VRP问题有约束函数
Shortest_Route_1=Shortest_Route; %提取最优路线
cc=find(Shortest_Route_1==qidian);
xx_1=[];
best_route_2=[];
for i=1:length(cc)-1
if i~=length(cc);
cs_1=length(Shortest_Route_1(cc(i):cc(i+1)));
xx_1(i,1:cs_1)=Shortest_Route_1(cc(i):cc(i+1)); %路线
else
end
best_route_1=0;
for j=1:length(xx_1(i,1:cs_1))-1 %计算每条路径的距离/成本
best_route_1=D(xx_1(i,j),xx_1(i,j+1))+best_route_1;
end
best_route_vaule=0;
for j=1:length(xx_1(i,1:cs_1))-1 %计算每条路径的距离/成本
best_route_vaule=Demand(xx_1(i,j),2)+best_route_vaule;
end
best_route_2(i,1)= best_route_1; %每条路径的长度
best_route_2(i,2)= best_route_vaule; %每条路径的长度
end
[~,n]=max(best_route_2(:,2));
Shortest_Length=best_route_2(n,2); %提取最短路径长度
%% ==============作图==============
figure(1)%作迭代收敛曲线图
x=linspace(0,iter_max,iter_max);
y=L_best(:,1);
plot(x,y);
xlabel('迭代次数'); ylabel('最大补给价值');
title('最大补给价值迭代图')
figure(2) %作最短路径图
[~,m]=max(best_route_2(:,2));
Shortest_Route=xx_1(m,:);
plot(C(:,1),C(:,2),'*');
hold on
plot(C(Shortest_Route,1),C(Shortest_Route,2),'*-');
axis ( [-60 60 -20 100] ); %坐标绘制范围
grid on
%% 设置导入选项并导入数据
S1={'航空母舰','驱逐舰1','驱逐舰2','护卫舰1','护卫舰2','护卫舰3','护卫舰4','驱逐舰3','驱逐舰4','补给船'};
for i =1:size(C,1)
% text(C(i,1),C(i,2),[' ' num2str(i)]);
text(C(i,1),C(i,2),[' ' S1(i)]);
end
xlabel('编队舰船横坐标'); ylabel('编队舰船纵坐标');
title('最大价值路径图')
figure(3)%作迭代收敛曲线图
axis ( [-60,60,-20,100] );
x=linspace(0,iter_max,iter_max);
y=L_ave_long;
plot(x,y);
xlabel('迭代次数'); ylabel('每代最优路径');
title('补给路程迭代图')
xlswrite('相关参数与结果.xlsx',[xx_1,best_route_2],'路径结果','A2')
clc
beak_length=D(Shortest_Route(end-1),Shortest_Route(end));
all_time=sum(Demand(Shortest_Route))+best_route_2(n,1)/v+beak_length/v;
disp(strcat('迭代次数:',num2str(iter_max)))
disp(strcat('最大补给价值为:',num2str(Shortest_Length)))
disp(strcat('最大补给价值路径长度为:',num2str(best_route_2(n,1))))
disp(strcat('返程路径长度:',num2str(beak_length)))
disp(strcat('返程路径消耗时间:',num2str(beak_length/v),'小时'))
disp(strcat('约束时间:',num2str(S2(1)),'小时'))
disp(strcat('剩余时间:',num2str(S2(1)-all_time),'小时'))
disp(strcat('剩余时间可服务距离:',num2str(v*(S2(1,1)-all_time)),'km'))
disp(strcat('总共消耗时间:',num2str(all_time),'小时'))
disp(strcat('运输货物量:',num2str(sum(Demand(Shortest_Route,3))),'单位'))
disp(strcat('运输货物剩余量:',num2str(S2(1,3)-sum(Demand(Shortest_Route,3))),'单位'))
1.4 运算的示例数据