蚁群算法matlab实现
2024-10-19 04:21:37
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang
以下用matlab实现蚁群算法:
%蚂蚁算法test
%用产生的一个圆上的十个点来检验蚂蚁算法
clc
clear
%参数
alpha = 1 ; %信息素指数
beta = 5 ; %启发指数
rho = 0.5 ; %挥发系数
n = 16 ; %城市个数
k = 20 ; %迭代次数
m = n - 1 ; %蚂蚁只数,这里取比城市数目少一的蚂蚁只数
Q = 100 ;
bestr = inf ;
%产生一个圆上的十个点
x = zeros(1,n) ;
y = x ;
for i = 1 : (n/2)
x(i) = rand * 20 ;
y(i) = sqrt(100 - (x(i) - 10) ^ 2) + 10;
end
for i = (n/2 + 1) : n
x(i) = rand * 20 ;
y(i) = - sqrt(100 - (x(i) - 10) ^ 2) + 10;
end
plot(x,y,'.') ;
%计算距离
d = zeros(n,n) ;
for i = 1 : n
for j = 1 : n
d(i,j) = sqrt( ( x(i) - x(j) ) ^ 2 + ( y(i) - y(j) ) ^ 2) ;
end
end
temp = min(d) ;
dmin = temp(1) ;
tau = ones(n,n) ;
%tau = tau ./ (n * dmin) ; %初始化tau信息素矩阵
%开始迭代
for i = 1 : k
%初始化
visited = zeros(m,n) ; %用visited 来储存所有蚂蚁走过的城市 m×n 其中未到达的城市为0
visited(:,1) = (randperm(n,m))'; %将m只蚂蚁随机放在n座城市 即产生一列1到n的随机数进行第一列数据的更新
for b = 2 : n %所有蚂蚁都走到第b个城市时
current = visited(:,(b-1)) ; %所有蚂蚁现在所在城市 m×1
allow = zeros(m,(n - b + 1)) ;
for a = 1 : m
j = 1 ;
for s = 1 : n
if length(find(visited(a,:) == s)) == 0
allow(a,j) = s ;
j = j + 1 ;
end
end
end
l = n-b+1 ;
for a = 1 : m %分析第a只蚂蚁
p = zeros(1,l) ;
for j = 1 : l %根据下式来选择下一个城市
p(j) = ( ( tau( current(a,1) , allow(a,j) ) ) ^ alpha ) * ( ( 1 / d( current(a,1) , allow(a,j) ) ) ^ beta ) ;
end
p = p ./ sum(p) ; %采用轮盘赌的方式
p = cumsum(p) ;
pick = rand ;
for c = 1 : l
if pick < p(c)
visited(a,b) = allow(a,c) ; %找到符合要求的城市 并 记入蚂蚁a的路径中
break ;
end
end
end
end
%计算每只蚂蚁所走的路径总长
L = zeros(1,m) ;
for a = 1 : m
t = d(visited(a,n),visited(a,1)) ;
for b = 1 : (n - 1)
t = t + d(visited(a,b),visited(a,(b + 1)));
end
L(a) = t ;
end
[newbestr,newbestant] = min(L) ; %寻本次迭代最短路径及其相应蚂蚁
if newbestr < bestr %到目前为止最优值的保存
bestr = newbestr ;
bestroad = visited(newbestant,:) ;
end
%离线更新信息素矩阵
%挥发
for a = 1 : m
tau(visited(a,n),visited(a,1)) = tau(visited(a,n),visited(a,1)) * (1 - rho) ;
for b = 1 : (n - 1)
tau(visited(a,b),visited(a,(b + 1))) = tau(visited(a,b),visited(a,(b + 1))) * (1 - rho) ;
end
end
%加强
tau(visited(newbestant,n),visited(newbestant,1)) = tau(visited(newbestant,n),visited(newbestant,1)) + Q / L(newbestant) ;
for b = 1 : (n - 1)
tau(visited(newbestant,b),visited(newbestant,(b + 1))) = tau(visited(newbestant,b),visited(newbestant,(b + 1))) + Q / L(newbestant) ;
end
end
bestr
bestx = zeros(1,n) ;
besty = zeros(1,n) ;
for i = 1 : n
bestx(i) = x(bestroad(i)) ;
besty(i) = y(bestroad(i)) ;
end
bestx = [bestx,bestx(1)] ;
besty = [besty,besty(1)] ;
plot(bestx,besty,'-') ;
最新文章
- Apache问题处理服务器访问不了
- js 获取当前日期时间3种格式化方法 yyyy-mm-dd hh:MM:ss
- linux centos 6.5 运行MySQL Workbench 6.0找不到 libmysqlclient.so.16和libmysqlclient_r.so.16
- 源代码分析:LayoutParams的wrap_content, match_parent, 而详细的价值观
- nginx+fastcgi php 使用file_get_contents、curl、fopen读取localhost本站点.php异常的情况
- win10 uwp 截图 获取屏幕显示界面保存图片
- 使用代码的方式给EntityFramework edmx 创建连接字符串
- 百度在职 iOS 架构师的成长笔记,送给还在迷茫的你!
- MODBUS协议解析中常用的转换帮助类(C#)
- Oracle使用数据泵 (expdp/impdp)实施迁移
- maven直接饮用jar包的写法
- Eclipse中修改包名,提交SVN时报 is out of date,怎么办?
- day02 运算符和编码
- 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承
- restful_framework之视图组件
- [BZOJ1878][SDOI2009] HH的项链 (树状数组)
- Angular5中提取公共组件之checkbox list
- fn project faas 框架试用
- 【bzoj3930】选数 容斥原理+暴力
- Android 多线程: 完全解析线程池ThreadPool原理&;使用
热门文章
- poj 3628 Bookshelf 2
- 51单片机C语言学习笔记6:51单片机C语言头文件及其使用
- API认证方法一览
- You should rebuild using libgmp >;= 5 to avoid timing attack vulnerability.";, PowmInsecureWarning
- Bonobos | IT桔子
- javaweb笔记2之HTTP协议
- javascript算法挑战
- [教程] 神器i9100刷基带与内核的方法!(兼带ROOT方法)
- (转)OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
- Python笔记:使用pywin32处理excel文件