近期学习整理(优化算法)
群智能算法
群体中的每一个主体无智能,但是有相同的目标,通过共享信息达成间接的合作,从而达到整体的目标。
比较常见的是蚁群算法和粒子群算法。
对于蚁群算法,共享信息为信息素,每只蚂蚁在行走自己的路径时会分泌信息素,而所有的信息素的浓度分布反映了最短路径。
对于粒子群算法,共享信息为每一个粒子的位置信息所公选出的群体最优位置信息,每个粒子会受到记忆(惯性)、自身经验(个体最优位置)和其他个体/群体的影响(群体最优位置)的共同作用,从而决定下一次的飞行(迭代),最终收敛于全局最优。
二者的差别在于,蚁群算法是离散的,每只蚂蚁所经过的城市是预先设置好的,算法的目的是找出最短路径。
而粒子群算法是在连续的空间中,粒子可以以连续的速度在连续的位置中移动,最终找到最优解。
由于都含有随机因子,二者都可以在一定程度上克服贪婪算法陷于局部最优的问题。
但是二者有一个共同的缺点在于,只能解决单一优化问题,无法解决多目标优化(除非改进或配合其他算法)。
(信息共享是基于所有个体有且仅有一个相同的目标,所共享的信息才能有效,否则会造成混淆)
粒子群算法
概念
模拟鸟群寻找食物的过程。
飞行空间 → 搜索空间
每只鸟(抽象为每个粒子)的所属位置 → 所有的可行解,待优化的变量数为粒子维数
食物源 → 最优解
算法流程
以例题6.2为例。
求函数 f(x, y) = 3cos(xy) + x + y2的最小值,其中 x 的取值范围为[-4, 4],y 的取值范围为[-4, 4]。
函数图像:
算法流程:
迭代结果曲线:
关键参数
(1)种群规模 N
搜索空间越大,所需要的粒子数目越多;越多的粒子数越易于发现全局最优解,但是也会使得算法的运行时间越长。
一般设置粒子数目20 ~ 50。
(2)惯性权重 w
控制算法的开发和探索能力。w 大则全局寻优能力强(更容易脱离最优位置),w 小则局部寻优能力强。
为了提高算法的灵活性,常常设置 w 为动态的,在进化过程中逐步减小。这样可以使种群快速寻找到最优解的可能区域,然后在精细化地搜索。我认为这对于很多工程问题是有很大意义的,因为往往较优的解并不是随机分布或均匀分布,可能是渐进性或聚集性的分布,先大略搜索,再精细搜索,可以节省很多时间。
(3)加速常数 c1 和 c2
反映粒子群之间的信息交流。c1调节粒子受自身经验的影响,c2调节粒子受群体最优的影响。
一般可取c1 = c2 = 1.5
(4)粒子的最大速度 vmax
决定问题空间的搜索力度。如果 vmax 太小,则容易陷入局部最优,如果太大,则容易错过最优解。
(5)停止准则
可取最大迭代次数、计算精度、最优解的最大停滞步数Δt。
算法改进
压缩粒子群算法
离散粒子群算法
将离散问题映射到连续的空间,粒子的位置只取0或1,速度表示位置取值的概率。
以例题6.4为例。0-1背包问题:有N件物品放入一个容量为V的背包,求解将哪些物品放入背包可使物品的体积总和不超过背包的容量,且价值总和最大。假设物品数量为10, 背包容量为300,每件物品的体积为[95, 75, 23, 73, 50, 22, 6, 57, 89, 98],每件物品的价值为[89, 59, 19, 43, 100, 72, 44, 16, 7, 64]。
clear all;
close all;
clc;
%% 初始化
N = 100; % 群体粒子个数
D = 10; % 粒子维数
T = 200; % 最大迭代次数
c1 = 1.5; % 学习因子1
c2 = 1.5; % 学习因子2
Wmax = 0.8; % 惯性权重最大值
Wmin = 0.4; % 惯性权重最小值
Vmax = 10; % 速度最大值
Vmin = -10; % 速度最小值
V = 300; % 背包容量
C = [95, 75, 23, 73, 50, 22, 6, 57, 89, 98]; % 物品体积
W = [89, 59, 19, 43, 100, 72, 44, 16, 7, 64]; % 物品价值
afa = 2; % 惩罚函数系数
%% 初始化种群个体
x = randi([0, 1], N, D); % 初始化二进制编码的初始种群
v = rand(N, D)*(Vmax - Vmin) + Vmin;
%% 初始化个体最优位置和最优值
p = x;
pbest = ones(N, 1);
for i = 1: N
pbest(i) = func(x(i, :), C, W, V, afa);
end
%% 初始化全局最优位置和最优值
g = ones(1, D);
gbest = eps;
for i = 1: N
if(pbest(i) > gbest)
g = p(i, :);
gbest = pbest(i);
end
end
gb = ones(1, T);
%% 迭代
for i = 1: T
for j = 1: N
%% 更新个体最优位置和最优值
if(func(x(j, :), C, W, V, afa) > pbest(j))
p(j, :) = x(j, :);
pbest(j) = func(x(j, :), C, W, V, afa);
end
%% 更新全局最优位置和最优值
if(pbest(j) > gbest)
g = p(j, :)
gbest = pbest(j);
end
%% 计算动态惯性权重值
w = Wmax - (Wmax - Wmin)*i/T;
%% 更新粒子速度值
v(j, :) = w*v(j, :) + c1*rand*(p(j, :)-x(j, :))+ c2*rand*(g - x(j, :));
%% 边界条件处理
for ii = 1: D
if (v(j, ii) > Vmax) | (v(j, ii) < Vmin)
v(j, ii) = rand*(Vmax - Vmin) + Vmin; % 重新随机
end
end
%% 更新粒子位置值
vx(j, :) = 1./(1 + exp(-v(j, :)));
for jj = 1: D
if vx(j, jj) > rand
x(j, jj) = 1;
else
x(j, jj) = 0;
end
end
end
%% 记录历代全局最优值
gb(i) = gbest;
end
g; % 最优个体
figure
plot(gb)
xlabel('迭代次数')
ylabel('适应度值')
title('适应度进化曲线')
适应度进化曲线:
个人思考
粒子的迭代过程:
for i = 1 : T
for j = 1 : N
...
如果粒子 N = 100,迭代次数 T = 200,那么这个for嵌套就要循环100*200次。
假如有的粒子初始位置就离最优解很远,可能这么多次迭代粒子也不会飞到全局最优处,它的数据就意义很小。
能不能设置多个种群,比如5个?并放置在5个相距较远的地方,每一个种群都去寻找它们的极值,可以迭代次数少一些,最后得到最好的解。感觉这样对所有粒子的综合利用率会大一些。
而且,只有一个种群的话,虽然在迭代记录中可以看到一些次优解,但分辨不出哪些是非最值的极值,如果设置多个种群可能能各自收敛到该区域的极值。
另外感觉粒子群算法在各种算法中是比较简单的,核心只在于粒子速度和位置的更新。
蚁群算法
概念
模仿蚁群从蚁巢寻找食物源的过程。信息素影响选择路径的概率,从而形成正反馈,收敛于最优解。
每只蚂蚁所走的路径代表一个可行解;每一次迭代,找出路径最短的那一条为该次迭代的最优解。
人工蚁群和自然蚁群在搜索过程中有一个不同,自然蚁群只受信息素的影响,而人工蚁群的转移概率还受到可见度(先验值)的影响。
算法流程
以例题5.1为例。旅行商问题:假设有一个商人要拜访全国31个省会城市,限制每个城市只能拜访一次,最后要回到原来出发的城市,求所选路径最小的路程。
算法流程:
路径优化结果:
迭代曲线:
关键参数
(1)信息素启发式因子 α
表示信息素浓度对是否选取当前路径的影响程度,反映了在路径搜索中随机因素作用的强度。α 越大,蚂蚁选择之前走过的路径的可能性越大,搜索的随机性减弱;α 过小时,则容易使得蚁群搜索陷入局部最优。
一般取 α 为[1, 4]时,性能较好。
(2)期望启发因子 β
反映了蚁群在搜索过程中先验性和确定性因素的作用强度。β 越大,蚂蚁在某个局部点上选择局部最短路径的可能性越大虽然此时算法的收敛速度加快,但是搜索的随机性减弱,易于陷入局部最优。
一般取 β 为[3, 5]时,性能较好。
(3)信息素蒸发系数 ρ
ρ 影响算法是收敛速度和全局搜索性能。ρ 过小时,信息素蒸发少,以前被搜索过的路径易被再次选择,减弱了搜索的随机性和全局搜索能力;ρ 过大时,虽然可以提高随机搜索性能和全局搜索能力,但是可能会产生较多的无用搜索,降低收敛速度。
(4)蚂蚁数目 m
m 越大,可以提高全局搜索能力和算法的稳定性,但过大会使信息素的变化趋于平均,正反馈效果减弱,收敛速度减慢;m 过小,则信息素不足,搜索的随机性减弱,降低全局搜索性能,算法稳定性差,容易出现过早停滞现象。
m 一般取10 ~ 50。
(5)最大进化代数 G
算法运行结束条件的参数。一般取100 ~ 500。
算法改进
精英蚂蚁系统
最大最小蚂蚁系统
基于排序的蚂蚁算法
自适应蚁群算法
个人思考
为什么蚂蚁选择路径的时候不仅受信息素影响,还受到启发式因子(在蚁群算法中为距下一地点的距离的倒数)的影响。
%% 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 % 遍历n个所有的城市
if length(find(visited == k)) == 0 % 如果第k个城市不在已访问的城市中
J(Jc) = k; % 则将第k个城市加入到待访问的城市中
Jc = Jc + 1;
end
end
%% 计算待选城市的概率分布
for k = 1: length(J) % 逐一计算
P(k) = (Tau(visited(end), J(k))^Alpha)*(Eta(visited(end), J(k))^Beta);
end
P = P/sum(P);
%% 按概率原则选取下一个城市
Pcum = cumsum(P); % 元素累加求和
Select = find(Pcum >= rand); % 若计算的概率大于原来的就选择这条路线
to_visit = J(Select(1));
Tabu(i, j) = to_visit;
end
end
进化类算法
遗传算法
概念
种群代表一组问题解,每个个体为一个可行解,具有包含遗传信息的染色体(可行解的编码),染色体是含有多个基因分量的向量(可行解编码的分量)。
群体特性通过遗传来保持,遗传操作为交叉(个体间交换基因产生新个体)、变异(个体基因信息突变产生新个体)、选择(自然选择出适应性强的个体,适应性越大概率越高),从而一次次由父代迭代至子代筛选出优秀的基因。
本质是一种并行、高效、全局搜索的方法。
算法流程
以例题2.1为例。用标准遗传算法求函数 f(x) = x + 10sin(5x) + 7cos(4x) 的最大值,其中 x 的取值范围是[0, 10]。
函数图像:
算法流程:
适应度进化曲线:
关键参数
(1)种群规模 Np
种群规模影响算法的结果和效率。较大的种群规模可以减小陷入局部最优的可能,但也使得计算复杂度较高。
一般 Np 取10 ~ 200。
(2)交叉概率 Pc
若交叉概率太低,则算法会变得迟钝;较大的交叉概率可以增强开辟新搜索区域的能力,但有可能会破坏原有较好的性状。
一般 Pc 取0.25 ~ 1。
(3)变异概率 Pm
低频率的变异可防止重要基因丢失,高频率的变异可能会使算法的随机性过高。
一般 Pm 取0.001 ~ 0.1。
(4)终止进化代数 G
视具体问题而定。一般取 G 在100 ~ 1000。
差分进化算法
概念
利用随机偏差扰动产生新个体的方式,进行自适应迭代寻优。
与遗传算法不同的是,差分进化算法的操作为:
变异:随机选取种群中两个成员,其加权差向量加到第三个成员上,产生新的向量(变异向量)。
交叉:将变异向量与上一代种群向量按概率各取部分,产生新的向量(测试向量)。
选择:一对一比较测试向量与上一代种群向量的适应度,产生当前一代具有最优适应度的向量。
遗传算法先计算个体的适应度,优适应度的个体有更高的概率作为父代参与交叉、变异操作产生子代。
差分进化算法先通过随机偏差扰动,形成新的测试种群,然后一对一比较逐个筛选个体,产生新的种群。在算法中,每一个个体都参与到了运算,不过这个随机扰动的原理实在不太理解。
算法流程
以例题3.2为例。求函数 f(x, y) = 3cos(xy) + x + y 的最小值,其中 x 的取值范围为[-4, 4],y 的取值范围为[-4, 4]。
函数图像:
算法流程:
迭代曲线:
关键参数
(1)种群数量 Np
种群规模越大,寻优能力越强,但是计算难度增加。
一般 Np 在5D ~ 10D之间(D为维数),且必须满足 Np >= 4,以确保具有足够的不同的变异向量。
(2)变异算子 F
决定偏差向量的缩放比例。F 过小,可能造成算法陷入局部最优;F 过大,使差分向量的扰动大于两个个体之间的距离时,会造成算法的收敛能力减小。
F ∈ [0, 2],一般初始时选择 F = 0.5。若种群过早收敛,应增大 F 或 Np 的值。
(3)交叉算子 CR
控制测试向量中的个体来自变异向量的概率。CR 越大,发生交叉的概率越大,较大的 CR 会加速收敛。
CR ∈ [0, 1],常常选取 0.1。若初期欲知算法是否可能得到快速解,可尝试 CR = 0.9 或 1.0。
(4)最大进化代数 G
一般 G 取100 ~ 500。
(5)终止条件
除了可以用最大进化代数作为终止条件外,还可以使用其他判定准则,如当适应度函数值小于阈值时终止程序,阈值常选10-6。
模拟退火算法
算法流程
以例题7.2为例。求函数 f(x, y) = 5cos(xy) + x + y 3的最小值,其中 x 的取值范围为[-5, 5],y 的取值范围为[-5, 5]。
函数图像:
算法流程:
目标函数迭代曲线:
关键参数
(1)初温 T
控制退火的走向。初温越大,获得高质量解的概率越大,但初温过高会使计算时间增加。
(2)马尔科夫链的长度 L
马尔科夫链的长度时在等温条件下进行迭代优化的次数。一般 L 取100 ~ 1000。