蚁群算法matlab vrp问题车辆限重,蚁群算法MATLAB解VRP问题

c0db2b7620c4a39923498594eb0fd491.png

Excel  exp12_3_2.xls内容:

93acae6da0bc8c76f72db7d9afb7060e.png

ANT_VRP函数:

function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q)

%% R_best 各代最佳路线

%% L_best 各代最佳路线的长度

%% L_ave 各代平均距离

%% Shortest_Route 最短路径

%% Shortest_Length 最短路径长度

%% D 城市间之间的距离矩阵,为对称矩阵

%% Demand 客户需求量

%% Cap 车辆最大载重

%% iter_max 最大迭代次数

%% m 蚂蚁个数

%% Alpha 表征信息素重要程度的参数

%% Beta 表征启发式因子重要程度的参数

%% Rho 信息素蒸发系数

%% Q 信息素增加强度系数

n=size(D,1);

T=zeros(m,2*n); %装载距离

Eta=ones(m,2*n); %启发因子

Tau=ones(n,n); %信息素

Tabu=zeros(m,n); %禁忌表

Route=zeros(m,2*n); %路径

L=zeros(m,1); %总路程

L_best=zeros(iter_max,1); %各代最佳路线长度

R_best=zeros(iter_max,2*n); %各代最佳路线

nC=1;

while nC<=iter_max %停止条件

Eta=zeros(m,2*n);

T=zeros(m,2*n);

Tabu=zeros(m,n);

Route=zeros(m,2*n);

L=zeros(m,1);

%%%%%%==============初始化起点城市(禁忌表)====================

for i=1:m

Cap_1=Cap; %最大装载量

j=1;

j_r=1;

while Tabu(i,n)==0

T=zeros(m,2*n); %装载量加载矩阵

Tabu(i,1)=1; %禁忌表起点位置为1

Route(i,1)=1; %路径起点位置为1

visited=find(Tabu(i,:)>0); %已访问城市

num_v=length(visited); %已访问城市个数

J=zeros(1,(n-num_v)); %待访问城市加载表

P=J; %待访问城市选择概率分布

Jc=1; %待访问城市选择指针

for k=1:n %城市

if length(find(Tabu(i,:)==k))==0 %如果k不是已访问城市代号,就将k加入矩阵J中

J(Jc)=k;

Jc=Jc+1;

end

end

%%%%%%%=============每只蚂蚁按照选择概率遍历所有城市==================

for k=1:n-num_v %待访问城市

if Cap_1-Demand(J(1,k),1)>=0 %如果车辆装载量大于待访问城市需求量

if Route(i,j_r)==1 %如果每只蚂蚁在起点城市

T(i,k)=D(1,J(1,k));

P(k)=(Tau(1,J(1,k))^Alpha)*((1/T(i,k))^Beta); %概率计算公式中的分子

else %如果每只蚂蚁在不在起点城市

T(i,k)=D(Tabu(i,j),J(1,k));

P(k)=(Tau(Tabu(i,visited(end)),J(1,k))^Alpha)*((1/T(i,k))^Beta); %概率计算公式中的分子

end

else %如果车辆装载量小于待访问城市需求量

T(i,k)=0;

P(k)=0;

end

end

if length(find(T(i,:)>0))==0 %%%当车辆装载量小于待访问城市时,选择起点为1

Cap_1=Cap;

j_r=j_r+1;

Route(i,j_r)=1;

L(i)=L(i)+D(1,Tabu(i,visited(end)));

else

P=P/(sum(P)); %按照概率原则选取下一个城市

Pcum=cumsum(P); %求累积概率和:cumsum([1 2 3])=1 3 6,目的在于使得Pcum的值总有大于rand的数

Select=find(Pcum>rand); %按概率选取下一个城市:当累积概率和大于给定的随机数,则选择求和被加上的最后一个城市作为即将访问的城市

o_visit=J(1,Select(1)); %待访问城市

j=j+1;

j_r=j_r+1;

Tabu(i,j)=o_visit; %待访问城市

Route(i,j_r)=o_visit;

Cap_1=Cap_1-Demand(o_visit,1); %车辆装载剩余量

L(i)=L(i)+T(i,Select(1)); %路径长度

end

end

L(i)=L(i)+D(Tabu(i,n),1); %%路径长度

end

L_best(nC)=min(L); %最优路径为距离最短的路径

pos=find(L==min(L)); %找出最优路径对应的位置:即为哪只蚂蚁

R_best(nC,:)=Route(pos(1),:); %确定最优路径对应的城市顺序

L_ave(nC)=mean(L)'; %求第k次迭代的平均距离

Delta_Tau=zeros(n,n); %Delta_Tau(i,j)表示所有蚂蚁留在第i个城市到第j个城市路径上的信息素增量

L_zan=L_best(1:nC,1);

post=find(L_zan==min(L_zan));

Cities=find(R_best(nC,:)>0);

num_R=length(Cities);

for k=1:num_R-1 %建立了完整路径后在释放信息素

Delta_Tau(R_best(nC,k),R_best(nC,k+1))=Delta_Tau(R_best(nC,k),R_best(nC,k+1))+Q/L_best(nC);

end

Delta_Tau(R_best(nC,num_R),1)=Delta_Tau(R_best(nC,num_R),1)+Q/L_best(nC);

Tau=Rho*Tau+Delta_Tau;

nC=nC+1;

end

Shortest_Route=zeros(1,2*n); %提取最短路径

Shortest_Route(1,:)=R_best(iter_max,:);

Shortest_Route=Shortest_Route(Shortest_Route>0);

Shortest_Route=[Shortest_Route Shortest_Route(1,1)];

Shortest_Length=min(L_best); %提取最短路径长度

%L_ave=mean(L_best);

求解程序:

clc;clear all

%% ==============提取数据==============

[xdata,textdata]=xlsread('exp12_3_2.xls'); %加载20个城市的数据,数据按照表格中位置保存在Excel文件exp12_3_1.xls中

x_label=xdata(:,2); %第二列为横坐标

y_label=xdata(:,3); %第三列为纵坐标

Demand=xdata(:,4); %第四列为需求量

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; %计算两城市之间的距离

else

D(i,j)=0; %i=j, 则距离为0;

end

D(j,i)=D(i,j); %距离矩阵为对称矩阵

end

end

Alpha=1;Beta=5;Rho=0.75;iter_max=100;Q=10;Cap=1;m=20; %Cap为车辆最大载重

[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q); %蚁群算法求解VRP问题通用函数,详见配套光盘

Shortest_Route_1=Shortest_Route-1 %提取最优路线

Shortest_Length %提取最短路径长度

%% ==============作图==============

figure(1) %作迭代收敛曲线图

x=linspace(0,iter_max,iter_max);

y=L_best(:,1);

plot(x,y);

xlabel('迭代次数'); ylabel('最短路径长度');

figure(2) %作最短路径图

plot([C(Shortest_Route,1)],[C(Shortest_Route,2)],'o-');

grid on

for i =1:size(C,1)

text(C(i,1),C(i,2),[' ' num2str(i-1)]);

end

xlabel('客户所在横坐标'); ylabel('客户所在纵坐标');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java线程6种状态转换,Java线程的生命周期和各种状态转换详解

在Java中&#xff0c;任何对象都有生命周期&#xff0c;线程也不例外&#xff0c;它也有自己的生命周期。当Thread对象创建完成时&#xff0c;线程的生命周期便开始了&#xff0c;当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时&#…

matlab里dcgain,制系统的时域分析

一个动态系统的性能常用典型输入作用下的响应来描述。响应是指零初始值条件下某种典型的输入函数作用下对象的响应&#xff0c;控制系统常用的输入函数为单位阶跃函数和脉冲激励函数(即冲激函数)。在MATLAB的控制系统工具箱中提供了求取这两种输入下系统响应的函数。一、时域分…

在oracle数据库中显示异常,Oracle数据库出现ORA-01034错误的解决方案

类型&#xff1a;数据库类大小&#xff1a;42.1M语言&#xff1a;中文 评分&#xff1a;5.0标签&#xff1a;立即下载使用Oracle数据库的朋友经常会碰到的错误ORA-3113 "end of fileon communication channel" 就是这样的一个&#xff0c;我们可以简单的把这个错误理…

oracle数据库内核,深入内核:Oracle数据库里SELECT操作Hang解析

崔华&#xff0c;网名 dbsnakeOracle ACE Director&#xff0c;ACOUG 核心专家编辑手记&#xff1a;感谢崔华授权我们独家转载其精品文章&#xff0c;也欢迎大家向“Oracle”社区投稿。我们都知道在 Oracle 数据库里是“读不阻塞写&#xff0c;写不阻塞读”&#xff0c;那么是否…

oracle 如何形成死锁,Oracle数据表中的死锁情况解决方法

在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定:1.查找被锁定的表:select object_name,session_id,os_user_name,oracle_username,process,locked_mode,statusfrom v$loc…

linux设备分层优点,Linux设备驱动的分层设计思想

代码清单8第2行获取platform_data&#xff0c;而platform_data实际上是定义GPIO按键硬件信息的数组&#xff0c;第31行的for循环工具这些信息申请GPIO并初始化中断&#xff0c;对于LDD6140电路板而言&#xff0c;这些信息如代码清单10。代码清单10 LDD6410开发板GPIO按键的plat…

linux 关闭桌面环境,Ubuntu 14.04上的Cinnamon桌面环境PPA被关闭

今天Cinnamon桌面环境的开发者宣布关闭Cinnamon桌面环境的PPA&#xff0c;这意味着以后在Ubuntu上安装Cinnamon桌面环境将变得很难。关于为什么要关闭PPA&#xff0c;Cinnamon PPA的维护者Gwendal Le Bihan做出了以下解释&#xff1a;“稳定的Cinnamon PPA将不再提供&#xff0…

genymotion linux 32,Ubuntu Linux 32bit - 不是Genymotion虚拟设备

因为4天我没有找到解决方案我的genymotion有问题 我正在使用Ubuntu 12.04 32位(architecure&#xff1a;i686)并安装android studio并将genymotion的插件放入其中succefully ......现在我的问题&#xff0c;当点击genymotion设备管理器&#xff0c;列表是空的&#xff0c;当我试…

grub linux rootfs,rootfs文件系统(笔记)(草稿)

文件系统简介文件系统就是个软件&#xff0c;帮用户来管理一些二进制的信息&#xff0c;管理外存上存储的这些二进制各种文件在内存中都是以二进制的形式来存在的&#xff0c;如果没有文件系统&#xff0c;用户就需要自己去决定这些二进制的东西是什么&#xff0c;需要自己去和…

linux 如何查看属性,linux 下查看系统属性

linux 下查看系统属性(2009-06-28 19:01:34)标签&#xff1a;linux杂谈分类&#xff1a;OSlinux下查看系统属性1、查看cpu信息查看所有cpu信息&#xff1a;cat /proc/cpuinfo查看cpu类型&#xff1a; grep "model name" /proc/cpuinfo2、查看内存信息&#xff1a;查看…

gnu linux中 使用,在Linux上使用GNU sed的方法

grep 命令grep 在文件(或命令输出)中搜索指定正则表达式&#xff0c;并且在标准输出中输出匹配的行。样例显示文件 /etc/passwd 中用户 gacanepa 的信息&#xff0c;忽略大小写。#grep-i gacanepa /etc/passwd显示 /etc 文件夹下所有 rc 开头并跟随任意数字的内容。#ls-l /etc …

android 自动 键盘,关于Android中的软键盘

InputMethodService为我们的输入法创建了一个Dialog&#xff0c;并且将该Dialog的Window的某些参数(如Gravity)进行了设置&#xff0c;使之能够在底部或者全屏显示。当我们点击输入框时&#xff0c;系统对活动主窗口进行调整&#xff0c;从而为输入法腾出相应的空间&#xff0c…

Android渠道包自动发布市场,Android Gradle实现打包指定渠道后自动上传到fir

fir分三个主要步骤1.获取fir上传凭证2.上传APKAPP logo图标3.获取最新的下载地址供别人下载注&#xff1a;python使用的是requests网络请求库1.获取fir上传凭证image.png代码如下&#xff1a;# 第一步&#xff1a;获取fir上传凭证print("get fir upload certificate"…

android 基类fragment,Android DialogFragment 基类的定制

鸿洋博客介绍&#xff1a;DialogFragment的基本使用好处&#xff1a;1&#xff1a;使用DialogFragment来管理对话框&#xff0c;当旋转屏幕和按下后退键时可以更好的管理其声明周期&#xff0c;它和Fragment有着基本一致的生命周期2.DialogFragment也允许开发者把Dialog作为内嵌…

升级鸿蒙系统无法选择应用,申请鸿蒙系统有一个应用选择怎么选择呢

[分享交流]申请鸿蒙系统有一个应用选择怎么选择呢34364电梯直达huafen774590890新学乍练发表于 2020-12-18 22:19:17来自&#xff1a;HUAWEI Mate 30 Pro 5G最新回复 2020-12-19 09:31:55要怎么选择大家知道吗&#xff1f;想着你的狼自成一派发表于 2020-12-18 22:22:29来自&am…

html5中的css特性,浅谈HTML5 CSS3的新交互特性

本文标题的这副图片&#xff0c;是用phosotshop制作的。但是&#xff0c;在搜索引擎中你却无法搜索到它&#xff0c;搜索引擎还没有强大到能够识别图片里面的文字。并且由于图片的体积不算太小&#xff0c;可能网速慢的网友在浏览的时候不得不耐心的等待图片的刷新。那么&#…

计算机专业知识多选题证监会,2019年国家公务员考试中国证监会(计算机类)专业科目考试大纲...

2019年国家公务员考试中国证监会(计算机类)专业科目考试大纲由国家公务员考试网公告解读栏目由提供&#xff0c;更多关于2019国家公务员考试大纲,计算机类国考考试大纲,证监会国考考试大,国家公务员考试公告解读的内容&#xff0c;请关注国家公务员考试网/广东公务员考试网&…

计算机和网络老是断开,电脑插上网线还是显示断开连接怎么办

在网络故障处理中遇到过千奇百怪的问题&#xff0c;这里就说一个比较怪异的问题。一个网线插口&#xff0c;有的电脑插上网线可以正常上网&#xff0c;而有的电脑插上就显示断开连接。试了好多办法&#xff0c;换了网线&#xff0c;换了插口&#xff0c;换了路由器&#xff0c;…

计算机网络的资源共享功能包,计算机网络的资源共享功能包括

资源共享是现代计算机网络的最主要的作用&#xff0c;它包括软件共享、硬件共享及数据共享。在网络中&#xff0c;多台计算机或同一计算机中的多个用户&#xff0c;同时使用硬件和软件资源。通常多用户同时需要的资源总是超过系统实际物理资源的数量&#xff0c;但采用逻辑(或虚…

计算机学院嘉年华标题,“芯动盛夏 AI创南航” 计算机学院举办第八届计算机嘉年华...

当前&#xff0c;我们正迎来一个科技主导的全智能时代&#xff0c;为激发大家学习探索人工智能的兴趣&#xff0c;切身感受AI科技的魅力所在&#xff0c;计算机科学与技术学院/人工智能学院于6月20日在体育馆广场举办了“芯动盛夏 AI创南航”第八届计算机嘉年华活动。活动中&am…