数模比赛中,经常见到有同学“套用”启发式算法(数模中常称为智能优化算法)去求解一些数模问题,事实上,很大一部分问题是不需要用到启发式算法求解的,Matlab中内置的函数足够我们使用了。但是如果遇到的优化问题特别复杂的话,启发式算法就是我们求解问题的一大法宝。
今天我们就来学习第一个智能算法:粒子群算法,其全称为粒子群优化算法(ParticleSwarmOptimization,PSO)。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。本节我们主要侧重学习其思想,并将其用于求解函数的最值问题,下一节我们会使用粒子群算法求解几类较难处理的优化类问题。
注:“智能算法"是指在工程实践中提出的一些比较"新颖"的算法或理论,因此智能算法的范围要比启发式算法更大一点,如果某种智能算法可以用来解决优化问题,那么这种算法也可能认为是启发式算法。
启发式算法百度百科上的定义:一个基于直观或经验构造的算法,在可接受的花费下给出待解决优化问题的一个可行解。
2)什么是优化问题?工程设计中优化问题(optimizationproblem)指在一定约束条件下,求解一个目标函数的最大值(或最小值)问题。注:实际上和我们之前学过的规划问题的定义一样,称呼不同而已。
3)什么是可行解?得到的结果能用于工程实践(不一定非要是最优解)
常见的启发式算法:粒子群、模拟退火、遗传算法、蚁群算法、禁忌搜索算法等等(启发式算法解决的问题大同小异,只要前三个算法学会了在数学建模中就足够了)
从最简单的优化问题说起:
思考:怎么找到这个一元函数的最大值?(只有一个上下界约束,即函数的定义域)
假设图中的a=1,b=10,我们要找出连续函数y=f(x)在[1,10]的最大值。
有什么问题?
爬山法的缺陷:特别容易找到局部最优解
按照预定的策略实行搜索,在搜索过程中获取的中间信息不用来改进策略,称为盲目搜索;反之,如果利用了中间信息来改进搜索策略则称为启发式搜索。
例如:蒙特卡罗模拟用来求解优化问题就是盲目搜索,还有大家熟悉的枚举法也是盲目搜索。
1995年,美国学者Kennedy和Eberhart共同提出了粒子群算法,其基本思想源于对乌类群体行为进行建模与仿真的研究结果的启发。
它的核心思想是:利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的可行解。
最初提出的论文:KennedyJ,EberhartR.Particleswarmoptimization[c]//ProceedingsofICNN'95-InternationalConferenceonNeuralNetworks.IEEE,1995.
设想这样一个场景:一群鸟在搜索食物
假设:
那么想一下这时候会发生什么?
首先,离食物最近的鸟会对其他的鸟说:兄弟们,你们快往我这个方向来,我这离食物最近与此同时,每只鸟在搜索食物的过程中,它们的位置也在不停变化,因此每只鸟也知道自己离食物最近的位置,这也是它们的一个参考。最后,鸟在飞行中还需要考虑一个惯性。
图形的进一步解释
注意,这里我们没有在变量说明的表格中放入r1和r2这两个随机数,是因为他们表示的含义不太重要,我们只需要简单的交代一下就行
在最初提出粒子群算法的论文中指出,个体学习因子和社会(或群体)学习因子取2比较合适。(注意:最初提出粒子群算法的这篇论文没有惯性权重)
最初提出的论文:KennedyJ,EberhartR.Particleswarmoptimization[C]//ProceedingsofICNN'95‐InternationalConferenceonNeuralNetworks.IEEE,1995.
论文中得到的结论:惯性权重取0.9‐1.2是比较合适的,一般取0.9就行
引入惯性权重的论文:SHI,Y.AModifiedParticleSwarmOptimizer[C]//Proc.ofIEEEICECconference,Anchorage.1998.
注意:用粒子群算法求解函数最小值时,粒子适应度的计算我们仍设置为目标函数值,但是此时我们希望找到适应度最小的解。因此希望大家不要用我们中文的内涵去理解这里的“适应度”(中文的内涵就是越适应越好),为了避免混淆你可以就直接用目标函数值来代替适应度的说法。
与原来的相比,现在惯性权重和迭代次数有关
参考论文:Shi,Y.andEberhart,R.C.(1999)EmpiricalStudyofParticleSwarmOptimization.Proceedingsofthe1999CongressonEvolutionaryComputation,WashingtonDC,6‐9July1999,1945‐1950.
其中:
与原来的相比,现在惯性权重和迭代次数以及每个粒子适应度有关
一个较大的惯性权值有利于全局搜索
而一个较小的权值则更利于局部搜索
假设现在一共五个粒子ABCDE,此时它们的适应度分别为1,2,3,4,5取最大惯性权重为0.9,最小惯性权重为0.4那么,这五个粒子的惯性权重应该为:0.4,0.65,0.9,0.9,0.9适应度越小,说明距离最优解越近,此时更需要局部搜索适应度越大,说明距离最优解越远,此时更需要全局搜索
假设现在一共五个粒子ABCDE,此时它们的适应度分别为1,2,3,4,5取最大惯性权重为0.9,最小惯性权重为0.4那么,这五个粒子的惯性权重应该为:0.9,0.9,0.9,0.65,0.4适应度越小,说明距离最优解越远,此时更需要全局搜索适应度越大,说明距离最优解越近,此时更需要局部搜索
个体学习因子c1和社会(群体)学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒子运行轨迹的影响,其反映了粒子群之间的信息交流。设置c1较大的值,会使粒子过多地在自身的局部范围内搜索,而较大的c2的值,则又会促使粒子过早收敛到局部最优值。为了有效地控制粒子的飞行速度,使算法达到全局搜索与局部搜索两者间的有效平衡,Clerc构造了引入收缩因子的PSO模型,采用了压缩因子,这种调整方法通过合适选取参数,可确保PSO算法的收敛性,并可取消对速度的边界限制。
下面我们就来用粒子群算法求解这四个测试函数
张玮,王华奎.粒子群算法稳定性的参数选择策略分析[J].系统仿真学报,2009,21(014):4339‐4344.
纪震等《粒子群算法及应用》科学出版社,2009,P13‐14
注意:
Matlab中particleswarm函数采用的是自适应的邻域模式
惯性权重InertiaRange默认设置的范围为:[0.1,1.1],注意,在迭代过程中惯性权重会采取自适应措施,随着迭代过程不断调整。
个体学习因子SelfAdjustmentWeight默认设置为:1.49(和压缩因子的系数几乎相同)
社会学习因子SocialAdjustmentWeight默认设置为:1.49(和压缩因子的系数几乎相同)
邻域内粒子的比例MinNeighborsFraction默认设置为:0.25,由于采取的是邻域模式,因此定义了一个“邻域最少粒子数目”:minNeighborhoodSize=max{2,(粒子数目*邻域内粒子的比例)的整数部分},在迭代开始后,每个粒子会有一个邻域,初始时邻域内的粒子个数(记为Q)就等于“邻域最少粒子数目”,后续邻域内的粒子个数Q会自适应调整。
速度初始化:和我们之前的类似,只不过最大速度就是上界和下界的差额vmax=ub–lb;v=‐vmax+2vmax.rand(n,narvs);
位置初始化:和我们之前的类似会将每个粒子的位置均匀分布在上下界约束内
计算每个粒子的适应度适应度仍设置为我们要优化的目标函数,由于该函数求解的是最小值问题,因此,最优解应为适应度最小即目标函数越小的解。
初始化个体最优位置和我们自己写的代码一样,因为还没有开始循环,因此这里的个体最优位置就是我们初始化得到的位置。
初始化所有粒子的最优位置因为每个粒子的适应度我们都已经求出来了,所以我们只需要找到适应度最低的那个粒子,并记其位置为所有粒子的最优位置。
在每次迭代中,我们要分别更新每一个粒子的信息。例如:对于现在要更新的粒子i,我们要进行以下几个操作: