蚁群算法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)时&#…

window10怎么卸载php,window_win10怎么卸载程序?win10卸载程序教程,当win10正式版发布以后,不少 - phpStudy...

win10怎么卸载程序&#xff1f;win10卸载程序教程当win10正式版发布以后&#xff0c;不少用户将电脑升级为Windows10系统后&#xff0c;不知道该如何卸载程序&#xff0c;本篇将为大家带来win10卸载程序教程&#xff0c;希望能够帮助到大家。win10怎么卸载程序方法一&#xff1…

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

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

php 添加音乐,PHP网站插入音乐

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你找对地方了&#xff0c;我是IT之家大神光卡蒋一欣。我把代码发给你&#xff0c;直接运行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在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…

php 分布式数据库查询,分布式数据库 · Thinkphp5.0完全开发手册 · 看云

# 分布式数据库ThinkPHP内置了分布式数据库的支持&#xff0c;包括主从式数据库的读写分离&#xff0c;但是分布式数据库必须是相同的数据库类型。配置database.deploy 为1 可以采用分布式数据库支持。如果采用分布式数据库&#xff0c;定义数据库配置信息的方式如下&#xff1…

matlab 电力系统动态仿真,基于Matlab的电力系统动态仿真分析

本文通过两个简单实例介绍了利用 !"#$"% &’(! )*, -./对电力系统进行仿真研究的方法! 包括"热工自动调节控制系统的仿真分析和电力电器系统的仿真分析# 0 热工调节控制系统仿真分析 对热工调节控制系统的性能分析包括静态特性和动态特性两个方面# 这里主要…

oracle read by other session,AWR报告中,read by other session ,如何解决?

你看你的top sql里全是动态采样的sql&#xff0c;默认10g以后optimizer_dynamic_sampling参数为level 2&#xff0c;一般为缺失统计信息会造成每次使用动态采样&#xff0c;虽然动态采样会在表频繁发生大批量改变时&#xff0c;一般可以生成更好的执行计划&#xff0c;但是也不…

oracle insert into as select,比较create table as select * 与 insert into table select *

实验环境&#xff1a;SYSaaron> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE …

unix 安装oracle,linux上安装Oracle

当前位置:我的异常网 Linux/Unix linux上安装Oraclelinux上安装Oraclewww.myexceptions.net 网友分享于&#xff1a;2013-09-03 浏览&#xff1a;26次linux下安装Oracle1.Linux下安装 jdk(Linux)建议从sun的主页上下载bin文件,运行后在/usr/会建立好java目录的Linux下相关命…

linux ftp用户指定多个目录,linux ftp服务器下用户限制目录的方法

我们使用服务器都要站在安全方面进行考虑&#xff0c;有必要将ftp服务下的用户限制在适当的范围内&#xff0c;那么linux ftp服务器下用户限制目录的方法有哪些呢?一起跟着爱站技术频道小编的步伐来了解一下吧!linux ftp服务器下用户只能在自己目录下的方法&#xff1a;第一步…

查找空目录Linux,Linux中find批量删除空文件及空文件夹脚本

find . -name "*" -type f -size 0c | xargs -n 1 rm -f #linux下批量删除空文件(大小等于0的文件)删除指定大小的文件&#xff0c;只要修改对应的 -size 参数就行&#xff1a;find . -name "*" -type f -size 1024c | xargs -n 1 rm -f #删除1k大小的文件…

linux关闭timewait端口,linux 如何强制关闭 time_wait 连接

匿名用户1级2016-04-16 回答# netstat -an|awk /tcp/ {print $6}|sort|uniq -c68 CLOSE_WAIT2 CLOSING136 ESTABLISHED38 FIN_WAIT116 FIN_WAIT22 LAST_ACK8 LISTEN71 SYN_RECV2936 TIME_WAIT#状态&#xff1a;描述CLOSED&#xff1a;无连接是活动的或正在进行LISTEN&#xff1…

memset头文件 linux,error: ‘memset’ was not declared in this scope

http://blog.sina.com.cn/s/blog_79d599dc0100r2vz.html昨天一同事把代码准备重新全新布置到新的环境上去的时候&#xff0c;代码报错了&#xff0c;先开始报错如下&#xff1a;error: ‘memset’ was not declared in this scopeerror: ‘strcat’ was not declared in this s…

linux中ls文件内存大小,Linux下用ls和du命令查看文件以及文件夹大小

webdriver零碎知识点#零碎知识点,用于记录平时遇到的比较杂的知识点 driver.current_url 获取当前url phantomjs 实现无浏览器界面自动化测试(driver webdriver.Phanto ...ORACLE删除当前用户下所有的表的方法1.如果有删除用户的权限,则可以: drop user user_name cascade; 加…

linux物理内存地址与iomem,一种Linux系统物理内存镜像文件分析方法_4

模块信息&#xff0c;如图7所示&#xff0c;给出了本发明的实施例中 模块结构关系图&#xff0c;modules变量指向某一个已加载模块结构体module地址&#xff0c;所有已加载模 块其module形成一个双向链表&#xff0c;如图7所示&#xff0c;据此可以获取到所有已加载模块。[0099…

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…