蚁群算法MATLAB解TSP问题
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问题的更多相关文章
- 蚁群算法MATLAB解VRP问题
Excel exp12_3_2.xls内容: ANT_VRP函数: function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT ...
- ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现
本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...
- 蚁群算法matlab实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下用matlab实现蚁群算法: %蚂蚁算法test %用产生的一个圆上的十个点来检验蚂蚁 ...
- 蚁群算法 matlab程序(已执行)
下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处. 我经过改动添加了凝视,已经执行过,无误, function [R_best,L_best,L_av ...
- [matlab] 8.蚁群算法解决TSP问题
城市坐标数据下载 密码:07d5 求遍历这52座城市后最后回到最初城市的最短距离 %% 第9章 蚁群算法及MATLAB实现——TSP问题 % 程序9-1 %% 数据准备 % 清空环境变量 clear ...
- 蚁群算法和简要matlab来源
1 蚁群算法原理 从1991由意大利学者 M. Dorigo,V. Maniezzo 和 A. Colorni 通过模拟蚁群觅食行为提出了一种基于群体的模拟进化算法--蚁群优化.极大关注,蚁群算法的特 ...
- 蚁群算法(Java)tsp问题
1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...
- 蚁群算法求解TSP问题
一.蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知 ...
- 蚁群算法求解旅行商问题(附c和matlab源代码)
前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单 ...
随机推荐
- java线程队列
工作原理 1.线程池刚创建时,里面没有一个线程.任务队列是作为参数传进来的.不过,就算队列里面有任务,线程池也不会马上执行它们. 2.当调用 execute() 方法添加一个任务时,线程池会做如下判断 ...
- AutoMapper简介
先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已. 为什么要用DTO? 1.DTO更注重数据,对领域对 ...
- ASCII对照
标准表 Bin (二进制) Oct (八进制) Dec (十进制) Hex (十六进制) 缩写/字符 解释 0000 0000 00 0 0x00 NUL(null) 空字符 0000 0001 01 ...
- Find- Linux必学的60个命令
1.作用 find命令的作用是在目录中搜索文件,它的使用权限是所有用户. 2.格式 find [path][options][expression] path指定目录路径,系统从这里开始沿着目录树向下 ...
- 【核心核心】8.Spring【AOP】注解方式
1.引入jar包 sprig框架基础包+JUntil整合包+日志包+AOP包 spring的传统AOP的开发的包 spring-aop-4.2.4.RELEASE.jar com.springsour ...
- python登录aspx网站
1.安装模块 2.准备aspx登录页面 3.示例代码 #coding:utf-8 import re from bs4 import BeautifulSoup import gzip import ...
- ArcSDE 10.0与ArcSDE10.1的又一个区别
ArcSDE10.0 安装后直接在创建sde表空间和sde用户的时候创建了sde服务:而sde10.1可以直接先通过ArcMap10.1直连数据库,创建sde表空间.sde用户.然后在有必要的情况下再 ...
- 深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则[转]
在这个小结里面重点讨论原子操作的原理和设计思想. 由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念. 在Java Concurrency in Practice中是这样定义线程安全的: ...
- 常用 docker 容器 使用
mongo: 单点 docker run -idt --name=mongo --restart=always -p : -v /home/hylas/opt/mongo/data:/data/db ...
- hbase连接linux开发过程
最近近公司被安排做hbase开发,太久没做今天记录下过程 import java.io.IOException; import org.apache.hadoop.conf.Configuration ...