蚁群优化算法的JAVA实现_优化算法|蚁群算法的理解及实现
蚁群算法
1. 蚁群算法基本原理
蚁群算法(Ant Colony Algorithm, ACA)由Marco Dorigo于1992年提出。
蚁群原理:
蚁群算法的基本原理来源于自然界觅食的最短路径原理。根据昆虫学家的观察,蚂蚁可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。
蚂蚁是怎么做到这一点的呢?
蚁群算法有自己的优化策略:正反馈的信息机制、信息素浓度的更新、蚂蚁对能够访问的路径的筛选。
2. 蚁群算法实现
% 蚁群算法找最大值
% 核心思路:
% 和粒子群算法有些相似,都是靠团队的力量共同去找目标!
% 蚁群算法中特殊的是它的"信息素"挥发! 这个效果是其他算法中没有的!
clc;
clear;
% f的最大值就是-前面的数值;这里是2.4
f = inline('2.4-(x.^4 + 3*y.^4 - 0.2*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.6)');
x = -1:0.001:1;
y = -1:0.001:1;
[X,Y] = meshgrid(x,y);
F = f(X,Y);
figure(1);
mesh(X,Y,F);
xlabel('横坐标x'); ylabel('纵坐标y'); zlabel('空间坐标z');
hold on;
% 坐标/搜索范围的设置:
lower_x = -1;
upper_x = 1;
lower_y = -1;
upper_y = 1;
% 模型初始参数设置:
ant = 80; % 蚂蚁总数300只太多了,不到100只松松解决问题
times = 30; % 每只蚂蚁搜寻80次
rou = 0.9; % 信息素挥发速率
p0 = 0.2; % 蚂蚁转移的概率常数
% 初始蚂蚁位置(空间内随机)、适应度计算:
ant_x = zeros(1,ant); % 每只蚂蚁位置的x坐标
ant_y = zeros(1,ant); % 每只蚂蚁位置的y坐标
tau = zeros(1,ant); % 适应度/函数数值
Macro = zeros(1,ant); % Macro和tau共同使用的中间过渡量而已
for i=1:ant
ant_x(i) = (upper_x-lower_x)*rand() + lower_x;
ant_y(i) = (upper_y-lower_y)*rand() + lower_y;
tau(i) = f(ant_x(i),ant_y(i)); % 初始适应度/函数值
plot3(ant_x(i),ant_y(i),tau(i),'k*'); % 起始群都用黑色*标记
hold on;
Macro = zeros(1,ant);
end
fprintf('蚁群搜索开始(找最大值):\n');
T = 1;
tau_best = zeros(1,times); % 记录每轮寻找后的群体中的最大值!
p = zeros(1,ant); % 每只蚂蚁状态转移的概率,都与p0比较
while T < times
lamda = 1/T;
% 这里是查看极值的地方!!
[tau_best(T),bestindex] = max(tau);
% 精度足够高,提前结束!
% 这里我有个策略: 当前适应度值 与 前两轮的值对比!而不是与上一轮值对比!
% 因为相邻两次循环的值很可能因为有一定的相关性而彼此接近!
if T >= 3 && abs((tau_best(T) - tau_best(T-2))) < 0.000001
fprintf('精度足够高,提前结束!\n');
% 小心思:最后一次画图放在这里,可以把最后一个点标成蓝色而不是红色!
plot3(ant_x(bestindex), ant_y(bestindex), f(ant_x(bestindex),ant_y(bestindex)), 'b*');
break;
end
plot3(ant_x(bestindex), ant_y(bestindex), f(ant_x(bestindex),ant_y(bestindex)), 'r*');
hold on;
for i = 1:ant
p(i) = (tau(bestindex) - tau(i))/tau(bestindex); % 每一只蚂蚁的转移概率
end
% 位置更新: 新算的临时坐标tempx与tempy不一定用!
for i = 1:ant
% 小于p0进行局部搜索:
if p(i) < p0
tempx = ant_x(i) + (2*rand-1)*lamda;
tempy = ant_y(i) + (2*rand-1)*lamda;
% 大于p0进行全局搜索:
else
tempx = ant_x(i) + (upper_x-lower_x)*(rand-0.5);
tempy = ant_y(i) + (upper_y-lower_y)*(rand-0.5);
end
% 不能越界,做一个越界判断:
if tempx < lower_x
tempx = lower_x;
end
if tempx > upper_x
tempx = upper_x;
end
if tempy < lower_y
tempy = lower_y;
end
if tempy > upper_y
tempy = upper_y;
end
% 判断蚂蚁是否移动,即tempx和tempy是否采用
% tau(i)是上一轮的值;Macro是及时更新的值!!
if f(tempx,tempy) > tau(i)
ant_x(i) = tempx;
ant_y(i) = tempy;
Macro(i) = f(tempx,tempy);
end
end
% 适应度更新:
for i = 1:ant
tau(i) = (1-rou)*tau(i) + Macro(i);
end
% 搜索进入下一轮:
T = T + 1;
end
hold off;
fprintf('蚁群搜索到的最大值点:(%.5f,%.5f,%.5f)\n',...
ant_x(bestindex), ant_y(bestindex), f(ant_x(bestindex),ant_y(bestindex)));
fprintf('搜索次数:%d\n',T)
标签:tau,lower,end,蚁群,ant,算法,优化,bestindex
来源: https://blog.csdn.net/welcome_yu/article/details/112159078
蚁群优化算法的JAVA实现_优化算法|蚁群算法的理解及实现相关推荐
- 维特比算法的java实现_原创:维特比算法
看了宗成庆博士的<统计自然语言处理(中文信息处理)>的第六章,对维特比算法有着非常精辟的讲解.把其中的讲解上传上来,个人感觉比较正统. 今天用Java实现了这个算法,也可以转换为C代码: ...
- em算法的java实现_机器学习——python模拟EM算法
<统计学习方法> 李航著 第九章 EM算法 我是小白一个:本文代码转载地址文末有注释:除代码和部分注释外大部分自己书写,有问题请多指教 模拟课本第一个例子,即用EM算法估计三个硬币模型的参 ...
- 维特比算法的java实现_维特比算法通俗明白
维特比算法说白了就是动态规划实现最短路径,只要知道"动态规划可以降低复杂度"这一点就能轻松理解维特比算法维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个 ...
- 用python做算法需要哪些技能_成为一名CV算法工程师,你需要具备哪些能力?
算法工程师应该是这两年国内外最热门的IT岗位了. 在2019年,阿里,字节跳动(抖音)等大厂的校招社招中,开出的offer及待遇可真的是一骑绝尘啊,校招就送股票,随随便便就年薪百万. 在国内,工作经验 ...
- 【限流算法】java实现redis分布式时间窗口计数器算法
本文实现一种基于java的分布式固定时间窗口计数器算法 //每次请求进来,查询一下当前的计数值,如果超出请求数阈值,则拒绝请求,返回系统繁忙提示 private long limitFlow(Stri ...
- l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法
一.BFGS算法 BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令 ,则得到: 二.BGFS算法存在的问题 在BFGS算法中.每次都要存储近似Hesse矩阵 ...
- 距离矢量路由算法的java代码_八大排序算法比较(附Java代码)
冒泡排序 /*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法 ...
- 聚类算法的java实现_聚类算法之BIRCH(Java实现)
BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)天生就是为处理超大规模(至少要让你的内存容不下)的数据集而设计的, ...
- paxos算法java实现_基于python的Paxos算法实现
理解一个算法最快,最深刻的做法,我觉着可能是自己手动实现,虽然项目中不用自己实现,有已经封装好的算法库,供我们调用,我觉着还是有必要自己亲自实践一下. 这里首先说明一下,python这种动态语言,对不 ...
最新文章
- 论新时代软件测试人员的工作之道(三)让Code Review常态化
- XAML实例教程系列 - 命名空间(NameSpace)
- CentOS6.5挂载windows共享文件夹
- 蛋白对接_【分子对接教程】蛋白/核酸/多肽-小分子对接(DOCK 6.9)
- Vim技能修炼教程(16) - 浮点数计算函数
- Web 开发时需要注意到的一些性能问题
- HTML5 API详解(15):History 不刷新也可以实现网页跳转
- java stringutils api_StringUtils工具类常用api 转
- C#不同窗体间通信,数据传递
- html模拟word目录,word临时文件目录
- linux分享二:Linux如何修改字符集
- SQL datediff()函数 时间差
- rpm -ivh rpm包名
- 知乎网软件测试和识,扩容检测工具_闪迪东芝内存卡_金士顿内存卡 知乎
- 英国退出欧盟,欧盟还是欧盟吗?
- 华为的冬天 任正非
- Windows文件夹或文件名过长无法删除
- R语言读取文件报错之二:Error in read.table(“xxxx.txt“, header = TRUE) : 列的数目比列的名字要多
- 什么是算法?数据结构与算法概念
- 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现