MATLAB笔记[5]-蚁群算法
保命声明:笔者代码能力有限,若行文中有错漏之处欢迎大家指出。
智能优化算法
元启发式算法
[https://zhuanlan.zhihu.com/p/66699937]
计算机科学的两大基础目标,就是发现可证明其执行效率良好且可得最佳解或次佳解的算法。而启发式算法则试图一次提供一或全部目标。
“元启发式算法”:用来构造启发式算法的一般框架
“启发式算法”:利用元启发式算法,结合被求解问题的特征,设计出来的面向特定问题的算法
启发式算法=元启发式算法+问题特征
粒子群优化算法
粒子群算法(Particle Swarm Optimization,PSO)是解决优化问题的经典智能算法之一。
1995年,Eberhart和Kennedy从鸟群等群体社会模型中获得启发,抽象出粒子群算法,其特点是强调群体的信息共享。PSO概念简单,很容易与其他优秀的算法和技巧结合,被广泛应用于工程、计算机科学、行为管理科学等领域。
核心思想:
粒子群可能是最简单的元启发式算法,我从一个简化的粒子群算法开始说明。
一开始,粒子在搜索空间中任意位置随机出生,每个粒子坐标都能计算出一个解,其中最优解的粒子坐标就是这个群体当前认为的最佳位置。
如果把这个最优解理解成食物最多,粒子群算法强调群体的直接信息共享,因此,所有粒子都立马知道了这里食物最多,全聚集过来了。
蚁群算法
[https://mp.weixin.qq.com/s/TXliymSLxvpn0Z9g6Tmc4Q]
蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物——信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响他们以后的行为。
当一些路径上通过的蚂蚁越来越多时,其留下的信息素也越来越多,以致信息素强度增大,所以蚂蚁选择选该滤镜的概率也越高,从而更增加了该路径的信息素强度,这种选择过程被称为蚂蚁的自催化行为。
由于其原理是一种正反馈机制,因此,也可将蚂蚁王国理解为所谓的增强型学习系统。
蜂群算法
[https://www.cnblogs.com/ybl20000418/p/11366576.html]
[https://zhuanlan.zhihu.com/p/253220840]
人工蜂群算法是模仿蜜蜂行为提出的一种优化方法,是集群智能思想的一个具体应用,它的主要特点是不需要了解问题的特殊信息,只需要对问题进行优劣的比较,通过各人工蜂个体的局部寻优行为,最终在群体中使全局最优值突现出来,有着较快的收敛速度。
人工蜂群算法就是模拟蜜蜂的采蜜过程而提出的一种新型智能优化算法,它也是由食物源、雇佣蜂和非雇佣蜂三部分组成。
食物源:食物源即为蜜源。在任何一个优化问题中,问题的可行解都是以一定形式给出的。在人工蜂群算法中,食物源就是待求优化问题的可行解,是人工蜂群算法中所要处理的基本对象。食物源的优劣即可行解的好坏是用蜜源花蜜量的大小即适应度来评价的。
雇佣蜂:雇佣蜂即为引领蜂与食物源的位置相对应,一个食物源对应一个引领蜂。在人工蜂群算法中,食物源的个数与引领蜂的个数相等;引领蜂的任务是发现食物源信息并以一定的概率与跟随蜂分享;概率的计算即为人工蜂群算法中的选择策略,一般是根据适应度值以轮盘赌的方法计算。
非雇佣蜂:非雇佣蜂包括跟随蜂和侦査蜂跟随蜂在蜂巢的招募区内根据引领蜂提供的蜜源信息来选择食物源,而侦查蜂是在蜂巢附近寻找新的食物源。在人工蜂群算法中,跟随蜂依据引领蜂传递的信息,在食物源附近搜索新食物源,并进行贪婪选择。若一个食物源在经过次后仍未被更新,则此引领蜂变成侦査蜂,侦查蜂寻找新的食物源代替原来的食物源。
模拟退火算法
[https://baike.sogou.com/v319751.htm?fromTitle=模拟退火算法]
Simulate Anneal Arithmetic (SAA, 模拟退火算法)
根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时 的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟 组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的 模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。
MATLAB实现蚁群算法
[https://www.bilibili.com/video/BV1Tg411W7gB]
蚁群算法.m
%蚁群算法
%% 清空环境变量
clc
clear
close all
%% 导入数据
citys= [[1304,2312];[3639,1315];[4177,2244];[3712,1399];...
[3488,1535];[3326,1556];[3238,1229];[4196,1004];[4312,790];...
[4386,570];[3007,1970];[2562,1756];[2788,1491];[2381,1676];...
[1332,695];[3715,1678];[3918,2179];[4061,2370];[3780,2212];...
[3676,2578];[4029,2838];[4263,2931];[3429,1908];[3507,2367];...
[3394,2643];[3439,3201];[2935,3240];[3140,3550];[2545,2357];[2778,2826];[2370,2975]];
%% 初始化
% 计算各个城市之间的距离
n = length(citys);
d = zeros(n);
for i = 1:n
for j = 1:n
if i == j
d(i,j) = eps;
else
d(i,j) = norm(citys(i,:)-citys(j,:),2);
end
end
end
% 启发函数
v = 1./d;
% 参数
m = 50; % 蚂蚁数量
maxiter = 500; % 最大迭代次数
a = 1; % 信息素重要程度因子
b = 5; % 启发函数重要程度因子
r = 0.1; % 信息素挥发因子
Q = 1; % 常系数(信息素释放量)
t = ones(n); % 信息素浓度
R = zeros(m,n); % 每个蚂蚁每次迭代的路径
citys_index = 1:n; % 给每个城市编号
MinL = inf; % 最短路径长度
cov = zeros(maxiter,1); % 收敛曲线
covmean = zeros(maxiter,1); % 平均适应度曲线
%% 迭代寻优
for iter = 1:maxiter
start = randi(n,m,1);
R(:,1) = start;
for k = 1:m
for i = 2:n
ta = R(k,1:i-1);
allow_index = ~ismember(citys_index,ta);
allow = citys_index(allow_index);
P = allow;
for j = 1:length(allow)
P(j) = t(ta(end),allow(j))^a * v(ta(end),allow(j))^b;
end
P = P/sum(P);
Pc = cumsum(P);
tar_index = find(Pc>=rand);
tar = allow(tar_index(1));
R(k,i) = tar;
end
end
L = zeros(m,1);
for k = 1:m
for i = 1:n-1
L(k) = L(k) + d(R(k,i),R(k,i+1));
end
L(k) = L(k) + d(R(k,n),R(k,1));
end
dt = zeros(n);
for k = 1:m
for j = 1:n-1
dt(R(k,j),R(k,j+1)) = dt(R(k,j),R(k,j+1)) + Q/L(k);
end
dt(R(k,n),R(k,1)) = dt(R(k,n),R(k,1)) + Q/L(k);
end
t = (1-r)*t + dt;
%% 更新最短路径
[minL,index] = min(L);
if minL<MinL
MinL = minL;
MinR = R(index,:);
end
cov(iter) = MinL;
covmean(iter) = mean(L);
end
%% 绘图
figure
plot(cov);hold on
plot(covmean);
xlabel('迭代次数');
ylabel('路径长度');
legend('收敛曲线','平均适应度曲线');
figure
for i = 1:n-1
plot([citys(MinR(i),1),citys(MinR(i+1),1)],[citys(MinR(i),2),citys(MinR(i+1),2)],'bo-');hold on
end
plot([citys(MinR(n),1),citys(MinR(1),1)],[citys(MinR(n),2),citys(MinR(1),2)],'bo-');
xlabel('x');
ylabel('y');
title('最终路径');
运行结果: