Excel表exp12_3_1.xls中数据为:

clc
clear all
[xdata,textdata]=xlsread('exp12_3_1.xls'); %加载20个城市的数据,数据按照表格中的位置保存在Excel文件exp12_3_1.xls中
x_label=xdata(:,2); %第二列为横坐标
y_label=xdata(:,3); %第三列为纵坐标
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
end
end
%%==================蚁群算法实现过程======================================================
%%============== 第一步 变量初始化==============
iter_max=100; %最大迭代次数
m=30; % 蚂蚁个数
Alpha=1; % 表征信息素重要程度的参数
Beta=5; % 表征启发式因子重要程度的参数
Rho=0.8; % 信息素蒸发系数
Q=10; % 信息素增加强度系数
Eta=1./D; % Eta为能见度因数,这里设为距离的倒数
Tau=ones(n,n); % Tau为信息素矩阵,初始化全为1
Tabu=zeros(m,n); % 存储并记录路径的生成
nC=1; % 迭代计数器
R_best=zeros(iter_max,n); %各代最短路线,行为最大迭代次数,列为城市个数
L_best=inf.*ones(iter_max,1);%%各代最短路线的长度,inf为无穷大
L_ave=zeros(iter_max,1); % 各代平均路线长度 %%============== 第二步 将m只蚂蚁放到城市上==============
while nC<=iter_max %停止条件之一:达到最大迭代次数
Randpos=[];
for i=1:(ceil(m/n)) %ceil表示向无穷方向取整
Randpos=[Randpos,randperm(n)]; %randperm(n):表示随机产生一个整数排列
end
Tabu(:,1)=(Randpos(1,1:m))'; %每只蚂蚁(m只)都对应有一个位置,Tabu(:,1)为每只蚂蚁走过的第一个城市 %% ============== 第三步 m只蚂蚁按概率函数选择下一座城市,完成各自的周游==============
for j=2:n %城市从第二个开始
for i=1:m
visited=Tabu(i,1:(j-1)); %已访问的城市
J=zeros(1,(n-j+1)); %待访问的城市
P=J; %待访问城市的选择概率分布(初始化)
Jc=1; %循环下标 for k=1:n %利用循环求解待访问城市,如果第k个城市不属于已访问城市,则其为待访问城市
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1; %下表加1,便于下一步存储待访问的城市
end
end for k=1:length(J) % 下面计算待访问城市的概率分布,length(J)表示待访问城市个数
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta); %概率计算公式中的分子
end
P=P/(sum(P)); %概率分布:长度为待访问城市个数
Pcum=cumsum(P); %求累积概率和:cumsum([1 2 3])=1 3 6,目的在于使得Pcum的值总有大于rand的数
Select=find(Pcum>=rand); %按概率选取下一个城市:当累积概率和大于给定的随机数,则选择求和被加上的最后一个城市作为即将访问的城市
if isempty(Select) %若选择城市为空集,则随机将任一城市加入禁忌表中
Tabu(i,j)=round(1+(n-1)*rand);
else
next_visit=J(Select(1)); %next_visit表示即将访问的城市
Tabu(i,j)=next_visit; %将访问过的城市加入禁忌表中
end
end
end if nC>=2;Tabu(1,:)=R_best(nC-1,:);end %若迭代次数大于等于2,则将上一次迭代的最佳路线存入到Tabu的第一行中 %% ==============第四步 记录本次迭代最佳路线==============
L=zeros(m,1);
for i=1:m;
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1)); %求路径距离
end
L(i)=L(i)+D(R(1),R(n)); %加上最后一个城市与第一个城市之间的距离
end
L_best(nC)=min(L); %最优路径为距离最短的路径
pos=find(L==L_best(nC)); %找出最优路径对应的位置:即为哪只蚂蚁
R_best(nC,:)=Tabu(pos(1),:); %确定最优路径对应的城市顺序
L_ave(nC)=mean(L); %求第k次迭代的平均距离
nC=nC+1; %% ==============第五步 更新信息素,此处蚁周系统==============
Delta_Tau=zeros(n,n); %Delta_Tau(i,j)表示所有蚂蚁留在第i个城市到第j个城市路径上的信息素增量
for i=1:m
for j=1:(n-1) %建立了完整路径后在释放信息素
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau; %信息素更新公式 %% ==============第六步 禁忌表清零==============
Tabu=zeros(m,n);
end %% ==============第七步 输出结果==============
Pos=find(L_best==min(L_best)); %找到L_best中最小值所在的位置
Shortest_Route=R_best(Pos(1),:) %提取最短路径
Shortest_Length=L_best(Pos(1)) %提取最短路径长度 %% ==============作图==============
figure(1) %作迭代收敛曲线图
x=linspace(0,iter_max,iter_max);
y=L_best(:,1);
plot(x,y,'-','LineWidth',2);
xlabel('迭代次数'); ylabel('最短路径长度'); figure(2) %作最短路径图
Shortest_Route=[Shortest_Route Shortest_Route(1)];
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)]);
end
xlabel('城市横坐标'); ylabel('城市纵坐标');

  

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

  1. 蚁群算法MATLAB解VRP问题

    Excel  exp12_3_2.xls内容: ANT_VRP函数: function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT ...

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

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

  3. 蚁群算法matlab实现

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

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

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

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

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

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

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

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

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

  8. 蚁群算法求解TSP问题

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

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

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

随机推荐

  1. 安装sklearn的一点事故解决

    安装sklearn过程出现挺多问题的.这里记录下一下问题点避免下次走弯路 1.安装ANACONDA,避免太多插件的手动安装,选用版本Anaconda3-4.3.1-Windows-x86_64.rar ...

  2. java连接SQLserver数据库模板代码

    package cn.mldn.lxh.dbc; import java.sql.Connection; import java.sql.DriverManager; public class Dat ...

  3. 2019-5-21-Roslyn-使用-Directory.Build.props-管理多个项目配置

    title author date CreateTime categories Roslyn 使用 Directory.Build.props 管理多个项目配置 lindexi 2019-05-21 ...

  4. 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法

    1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...

  5. SQL语句中GROUP BY的问题

    今天查询数据库时用到集合函数sum(drp),遇到问题: 百度后,确定如下问题:当select后面查询字段有sum(drp)以外的字段时,必须使用group by函数,对数据进行排序,且查询字段中除s ...

  6. 原生JS实现彩票36选7不重复(优化)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Jmeter分布式测试过程中遇到的问题及摘抄前辈问题汇总

    遇到的常见问题: 1.在Controller端上控制某台机器Run,提示"Bad call to remote host". 解决方法:检查被控制机器上的jmeter-server ...

  8. 使用 windows 批处理指令(BAT文件)进行压缩文件(zip)解压操作

    以下指令包括文件删除.复制.zip文件解压操作.使用7z指令指令进行解压操作前,需要确保 windows 的 path 系统环境变量中存在7z的安装路径. 7z的下载地址:https://www.7- ...

  9. 使用 windows 批处理指令(BAT文件)进行文件删除、复制操作

    以下是做文件删除和复制的批处理指令 ::替换文件需要添加 /y 参数才能直接替换.不然会出现提示是否替换. ::复制Axis2Implementation和WebServices编译后的文件到tomc ...

  10. LINUX超级用户(权限)在系统管理中的作用

    1.对任何文件.目录或进程进行操作: 但值得注意的是这种操作是在系统最高许可范围内的操作:有些操作就是具有超级权限的root也无法完成: 比如/proc 目录,/proc 是用来反应系统运行的实时状态 ...