Excel  exp12_3_2.xls内容:

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('客户所在纵坐标');

  

蚁群算法MATLAB解VRP问题的更多相关文章

  1. 蚁群算法MATLAB解TSP问题

    Excel表exp12_3_1.xls中数据为: clc clear all [xdata,textdata]=xlsread('exp12_3_1.xls'); %加载20个城市的数据,数据按照表格 ...

  2. 蚁群算法matlab实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下用matlab实现蚁群算法:   %蚂蚁算法test   %用产生的一个圆上的十个点来检验蚂蚁 ...

  3. 蚁群算法 matlab程序(已执行)

    下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处. 我经过改动添加了凝视,已经执行过,无误, function [R_best,L_best,L_av ...

  4. 蚁群算法和简要matlab来源

    1 蚁群算法原理 从1991由意大利学者 M. Dorigo,V. Maniezzo 和 A. Colorni 通过模拟蚁群觅食行为提出了一种基于群体的模拟进化算法--蚁群优化.极大关注,蚁群算法的特 ...

  5. 蚁群算法求解旅行商问题(附c和matlab源代码)

    前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单 ...

  6. [matlab] 8.蚁群算法解决TSP问题

    城市坐标数据下载  密码:07d5 求遍历这52座城市后最后回到最初城市的最短距离 %% 第9章 蚁群算法及MATLAB实现——TSP问题 % 程序9-1 %% 数据准备 % 清空环境变量 clear ...

  7. ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现

    本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...

  8. 蚁群算法(Java)tsp问题

      1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...

  9. 蚁群算法求解TSP问题

    一.蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知 ...

随机推荐

  1. 0617Python-介绍、三种运行方式、变量、标识符和关键字、获取属性

    一.什么是自动化测试? 1.定义 自动:让机器自己动,就是自动 自动化:让机器按照人类的要求,把软件的所有功能遍历一遍 2.传统测试和自动化测试的区别 传统测试:繁琐.机械.门槛低.工资低 自动化测试 ...

  2. Python运算符,逻辑运算

    运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运算.赋值运算 ...

  3. Spring Cloud Eureka 使用外网IP和端口号进行服务注册

    应用场景如下: 服务提供方(即要注册到服务中心的服务)的内网地址,外界无法访问(或者使用docker等做了应用端口等的配置),做了IP映射后,公网IP49.10.22.106映射到服务提供方的内网ip ...

  4. wsoj「G2016 SCOI2018 Round #12」建筑师

    传送门 小半个月前的测试,现在翻出来. 考试时我和sxyA了这题. 当时随便搞了个dp,dp[i][j]表示i个数能看到j个的情况数,考虑新加入一个比之前i-1个数都小的数,能看到它的情况是它加到第一 ...

  5. 在sqlserver 的函数或存储过程中抛出异常(raiserror )

      raiserror的作用: raiserror 是用于抛出一个错误 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,sev ...

  6. 转:linux进程间通信的几种机制的比较及适用场合

    源地址:http://blog.csdn.net/f_x_p0324/article/details/6878081 socket 1. # 管道( pipe ):管道是一种半双工的通信方式,数据只能 ...

  7. 如何使用JMeter 进行压力测试

    文件转载至:https://jingyan.baidu.com/album/a681b0de5b85db3b184346b9.html?picindex=2 1.打开JMeter, 更改语言为中文,官 ...

  8. python学习笔记2_二元运算符和比较运算

    一.二元操作符 a+b : a加b a-b :  a减b a*b :  a乘b a/b : a除以b a//b:a整除以b,表示的是返回a除以b的结果的整数部分,而不是证明了a能被b整除.要证明a能被 ...

  9. AIX系统搭建NFS服务器

    本文使用场景:aix6.1升级到aix7.1之后,需要打补丁aix7.1 TL4的补丁,补丁文件有将近10G,当多个系统都升级时,此时搭建nfs服务器,只需要一次上传,其余需升级系统作为客户端只需通过 ...

  10. 2019.10.29 csp-s模拟测试92 反思总结

    今天快乐的墨雨笙因为什么而几乎爆零了呢? 顾此失彼+不会对拍+无脑的复杂度 今天高兴的墨雨笙又因为什么调了一个下午呢? 不明题意+不想范围+板子低级错误 R.I.P. T1: //唉 //害怕TLE, ...