蚁群算法及TSP问题的matlab代码记录
计算城市距离函数Distance.man
function D = Distance(citys)
%% 计算两两城市之间的距离
% 输入:各城市的位置坐标(citys)
% 输出:两两城市之间的距离(D)n = size(citys, 1);
D = zeros(n, n);
for i = 1: nfor j = i + 1: n %第i个城市与其后的其他城市之间的距离,会形成一个上半角矩阵。D(i, j) = sqrt((citys(i, 1) - citys(j, 1))^2 + (citys(i, 2) - citys(j, 2))^2);D(j, i) = D(i, j);endD(i, i) = 1e-4; %对角线的值为0,但由于后面的启发因子要取倒数,因此用一个很小数代替0
end
蚁群算法及作图 ant.m
%% I. 清空环境
clc
clear all
%% II. 符号说明
% C -- n个城市的坐标
% NC_max -- 最大迭代次数
% m -- 蚁群中蚂蚁的数量,一般设置为城市的1.5倍
% D(i, j) -- 两城市i和之间的距离
% Eta(i, j) = 1 ./ D(i, j) -- 启发函数
% alpha -- 表征信息素重要程度的参数
% beta -- 表征启发函数重要程度的参数
% rho -- 信息素挥发因子
% Q --
% rBest -- 各代最佳的路线
% lBest -- 各代最佳路线的长度
% lAverage --各代的平均长度%% III. 导入城市位置数据
citys = [18.4700 95.100016.4700 94.640020.0900 94.540014.3900 93.370025.2300 97.240022.0000 93.050023.4700 92.020016.2000 96.290017.3000 97.380013.0500 98.120015.5300 97.380024.5200 95.590016.4100 97.130015.0900 92.5500];%% IV. 计算距离矩阵
D = Distance(citys); % 计算距离矩阵
n = size(D, 1); % 城市的个数%% V. 初始化参数
NC_max = 200; % 最大迭代次数,取100~500之间
m = 22; % 蚂蚁的个数,一般设为城市数量的1.5倍
alpha = 1; % α 选择[1, 4]比较合适
beta = 4; % β 选择[3 4 5]比较合适
rho = 0.2; % ρ 选择[0.1, 0.2, 0.5]比较合适
Q = 20;
NC = 1; % 迭代次数,一开始为1Eta = 1 ./ D; % η = 1 / D(i, j) ,这里是矩阵
Tau = ones(n, n); % Tau(i, j)表示边(i, j)的信息素量,一开始都为1
Table = zeros(m, n); % 路径记录表rBest = zeros(NC_max, n); % 记录各代的最佳路线
lBest = inf .* ones(NC_max, 1); % 记录各代的最佳路线的总长度 初始为无穷大
lAverage = zeros(NC_max, 1); % 记录各代路线的平均长度%% VI. 迭代寻找最佳路径
while NC <= NC_max% 第1步:随机产生各个蚂蚁的起点城市start = zeros(m, 1);for i = 1: mtemp = randperm(n); %返回行向量,其中包含从 1 到 n 没有重复元素的整数随机排列。start(i) = temp(1);endTable(:, 1) = start; % Tabu表的第一列即是所有蚂蚁的起点城市citys_index = 1: n; % 所有城市索引的一个集合% 第2步:逐个蚂蚁路径选择for i = 1: m% 逐个城市路径选择for j = 2: ntabu = Table(i, 1: (j - 1)); % 蚂蚁i已经访问的城市集合(称禁忌表)allow_index = ~ismember(citys_index, tabu); %如果 A 中某位置的数据能在 B 中找到,Lia = ismember(A,B) 将返回一个在该位置包含逻辑值 1 (true) 的数组。数组中的其他位置将包含逻辑值 0 (false)。Allow = citys_index(allow_index); % Allow表:存放待访问的城市P = Allow; %复制Allow表,用来后续计算每个可访问城市的概率,以便轮盘赌时使用。% 计算从城市j到剩下未访问的城市的转移概率for k = 1: size(Allow, 2) % 待访问的城市数量P(k) = Tau(tabu(end), Allow(k))^alpha * Eta(tabu(end), Allow(k))^beta;endP = P / sum(P); % 归一化% 轮盘赌法选择下一个访问城市(为了增加随机性)Pc = cumsum(P); %如果 A 是向量,则 cumsum(A) 返回包含 A 元素累积和的向量。target_index = find(Pc >= rand);target = Allow(target_index(1));Table(i, j) = target; endend% 第3步:计算各个蚂蚁的路径距离length = zeros(m, 1);for i = 1: mRoute = Table(i, :);%第i只蚂蚁的路线for j = 1: (n - 1)length(i) = length(i) + D(Route(j), Route(j + 1));%第i只蚂蚁从路线中第一个城市到最后一个城市的路线长度和endlength(i) = length(i) + D(Route(n), Route(1));%总长度等于上述长度+返回初始城市的长度end% 第4步:计算最短路径距离及平均距离if NC == 1[min_Length, min_index] = min(length); % 返回本代22只蚂蚁中路线最短的的路线的长度和索引lBest(NC) = min_Length; % 存入本代的最短路线长度lAverage(NC) = mean(length); % 存入本代的路线长度平均值rBest(NC, :) = Table(min_index, :); % 存入本代的最短路线else[min_Length, min_index] = min(length); % 返回本代22只蚂蚁中路线最短的的路线的长度和索引lBest(NC) = min(lBest(NC - 1), min_Length); % 存入本代的最短路线长度与上代最短路线长度相比的较小者作为本代最短lAverage(NC) = mean(length); % 存入本代的路线长度平均值if lBest(NC) == min_Length % 若本代最短路线长度比上代最短路线长度小,则存入本代最短路线rBest(NC, :) = Table(min_index, :);else %否则仍将上代最短路线作为本代最短路线rBest(NC, :) = rBest((NC - 1), :);endend% 第5步:更新信息素Delta_tau = zeros(n, n);for i = 1: m for j = 1: (n - 1)Delta_tau(Table(i, j), Table(i, j + 1)) = Delta_tau(Table(i, j), Table(i, j + 1)) + Q / length(i);endDelta_tau(Table(i, n), Table(i, 1)) = Delta_tau(Table(i, n), Table(i, 1)) + Q / length(i);endTau = (1 - rho) .* Tau + Delta_tau;% 第6步:迭代次数加1,并且清空路径记录表NC = NC + 1;Table = zeros(m, n);
end
%% VII. 结果显示
[shortest_Length, shortest_index] = min(lBest);
shortest_Route = rBest(shortest_index, :);
disp(['最短距离:' num2str(shortest_Length)]);
disp(['最短路径:' num2str([shortest_Route shortest_Route(1)])]);%% VIII. 绘图
figure(1)
plot([citys(shortest_Route,1); citys(shortest_Route(1),1)],...[citys(shortest_Route,2); citys(shortest_Route(1),2)],'o-');
grid on
for i = 1: size(citys, 1)text(citys(i, 1), citys(i, 2), [' ' num2str(i)]);
end
text(citys(shortest_Route(1), 1), citys(shortest_Route(1), 2), ' 起点');
text(citys(shortest_Route(end), 1), citys(shortest_Route(end), 2), ' 终点');
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法优化路径(最短距离: ' num2str(shortest_Length) ')'])
figure(2)
plot(1: NC_max, lBest, 'b', 1: NC_max, lAverage, 'r:')
legend('最短距离', '平均距离')
xlabel('迭代次数')
ylabel('距离')
title('各代最短距离与平均距离对比')
命令窗口输出结果:
最短距离:35.6082
最短路径:3 6 7 12 5 9 13 8 11 10 4 14 2 1 3
图形结果:
蚁群算法及TSP问题的matlab代码记录相关推荐
- 蚁群算法解决TSP问题(matlab代码实现)
- 蚂蚁算法求解tsp问题matlab,蚁群算法解决TSP问题的MATLAB程序
蚁群算法TSP(旅行商问题)通用matlab程序 function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_m ...
- 蚁群算法原理详解和matlab代码
1原理: 蚂蚁在寻找食物源的时候,能在其走过的路径上释放一种叫信息素的激素,使一定范围内的其他蚂蚁能够察觉到.当一些路径上通过的蚂蚁越来越多时,信息素也就越来越多,蚂蚁们选择这条路径的概率也就越高,结 ...
- 【预测模型-ELM预测】基于蚁群算法优化极限学习机预测matlab代码
1 简介 针对变压器故障的特征,结合变压器油中气体分析法以及三比值法.提出了基于蚁群算法改进极限学习机的故障诊断方法.由于输入层与隐含层的权值和阈值是随机产生.传统的极限学习机可能会使隐含层节点过多, ...
- 人工智能实验:蚁群算法求解TSP问题(Python代码实现,附有详细实验报告地址)
项目简介 这是人工智能实验课的一次作业,项目文件中包含两个py文件,其中Main.py是算法的主体,而其他一些实现则放在AidFunctions.py文件中.代码注释比较详细,可以对照实验报告进行阅览 ...
- 实验6:蚁群算法在TSP问题中的实现
实验目的 (1)理解蚁群算法的原理以及优缺点 (2)能够用蚁群算法解决实际问题 实验内容 旅行商问题(TSP,traveling salesman problem):一商人去n个城市销货,所有城市走- ...
- 机器学习(MACHINE LEARNING)MATLAB蚁群算法解决TSP问题
文章目录 1 蚁群算法 2 蚁群算法与TSP问题的关系 3 代码实现 1 蚁群算法 基本原理: (1)蚂蚁在携带等量的信息素一路释放 (2)信息素浓度会和路径的长度成反比 (3)下次蚂蚁来到该路口会选 ...
- 用蚁群算法求解TSP问题
TSP是什么?TSP全称Travelling salesman problem.中文名:旅行商问题.就是模拟退火中讲到的14个城市之间巡回旅行,求路径最短的问题. 为什么偏偏找他呢?因为这是一个衡量算 ...
- 蚁群算法解决tsp问题c语言,蚁群算法解决TSP问题程序.doc
蚁群算法解决TSP问题程序 蚁群算法用于求解TSP问题,经过仿真测试,发现此程序的优化效率和鲁棒性都非常好. 这与在无线多媒体传感器网络路由算法应用到的寻找最佳路径的蚁群算法非常相似. functio ...
最新文章
- centos7 安装postgresql11
- 【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )
- Spring Security 匿名认证
- 【Linux】11.将ubuntu电脑设置为一台可远程ssh或sftp访问的服务器
- 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
- Django中使用ajax技术概述
- 回溯法遵循深度优先吗_回溯算法(一)
- phpcmsV9重装 - 踩坑篇
- RSA 数字签名算法(Java版)
- 关于在CVS下无法获取更新的解决方法!!!
- 命令查看IPV6的IP,路由,邻居信息
- Android popupwindow 失去焦点或者点击空白区域时消失的解决方法
- 7-7 字符转换 (15 point(s))
- Javascript对象数组排序
- CanBus的数据帧的获取和初始解析
- SPIR-V教程 -- SPIR-V介绍(一)
- idea 注释 rendered view
- 年仅28岁的程序员郭宇,宣布从字节跳动辞职,实现财富自由!
- Python爬虫练习-查询lol隐藏分
- SQL语句中where 1=0是什么意思