优化算法
最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最优的一些学科的总称。工程设计中最优化问题(optimalization problem)的一般提法是要选择一组参数(变量),在满足一系列有关的限制条件(约束)下,使设计指标(目标)达到最优值。因此,最优化问题通常可以表示为数学规划形式的问题。进行工程优化设计时,应将工程设计问题用上述形式表示成数学问题,再用最优化的方法求解。这项工作就是建立优化设计的数学模型。
根据自己对最优化的理解,采用最优化算法解决实际问题主要分为下列两步:
- 建立数学模型。对可行方案进行编码(变量),约束条件以及目标函数的构造。
- 最优值的搜索策略。在可行解(约束条件下)搜索最优解的方法,有穷举、随机和启发式搜索方法。
最优化算法有三要素:变量(Decision Variable)、约束条件(Constraints)和目标函数(Objective function)。最优化算法,其实就是一种搜索过程或规则,它是基于某种思想和机制,通过一定的途径或规则来得到满足用户要求的问题的解。
1.梯度优化
- 梯度下降是最基础的优化算法之一,它通过迭代的方式沿着目标函数梯度的负方向移动,逐步逼近最小值点。
- 存在标准梯度下降、随机梯度下降,以及小批量梯度下降等变种。
2.遗传算法
进化算法求解优化问题的一般步骤:
(1)随机给定一组初始解;
(2)评价当前这组解的性能;
(3)若当前解满足要求或进化过程达到一定代数,计算结束;
(4)根据(2)的评价结果,从当前解中选择一定数量的解作为基因操作对象;
(5)对所选择的解进行基因操作(如交叉、变异等),得到一组新解,转到(2)。
进化算法求解优化问题的特殊之处:
(1)进化算法不直接作用在解空间上,而是利用解的某种编码表示;
(2)进化算法从一个群体即多个点而不是一个点开始搜索,这是它能以较大概率找到整体最优解的主要原因之一;
(3)进化算法只使用解的适应性信息(即目标函数值),并在增加收益和减少开销之间进行权衡,而传统搜索算法一般要使用导数等其他辅助信息;
(4)进化算法使用随机转移规则而不是确定性的转移规则。
目前研究的进化算法主要有四种:遗传算法(GAs)、进化规划(EP)、进化策略(ES)和遗传编程(GP)
遗传算法概述
遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
选择的方法:轮盘赌选择、随机采样、确定性采样、混合选择、锦标赛选择
交叉的方法:1-断点交叉、双断点交叉、多段点交叉、算术交叉、模拟二进制交叉、单峰正态交叉
变异的方法:均与变异、非均匀变异、边界变异、高斯变异
创建初始种群:初始种群是随机选择的一组有效候选解(个体)。由于遗传算法使用染色体代表每个个体,因此初始种群实际上是一组染色体。
计算适应度:适应度函数的值是针对每个个体计算的。对于初始种群,此操作将执行一次,然后在应用选择、交叉和突变的遗传算子后,再对每个新一代进行。由于每个个体的适应度独立于其他个体,因此可以并行计算。
由于适应度计算之后的选择阶段通常认为适应度得分较高的个体是更好的解决方案,因此遗传算法专注于寻找适应度得分的最大值。如果是需要最小值的问题,则适应度计算应将原始值取反,例如,将其乘以值(-1)。选择、交叉和变异:将选择,交叉和突变的遗传算子应用到种群中,就产生了新一代,该新一代基于当前代中较好的个体。
选择(selection)操作负责当前种群中选择有优势的个体。
交叉(crossover,或重组,recombination)操作从选定的个体创建后代。这通常是通过两个被选定的个体互换他们染色体的一部分以创建代表后代的两个新染色体来完成的。
变异(mutation)操作可以将每个新创建个体的一个或多个染色体值(基因)随机进行变化。突变通常以非常低的概率发生。算法终止条件:在确定算法是否可以停止时,可能有多种条件可以用于检查。两种最常用的停止条件是:
已达到最大世代数。这也用于限制算法消耗的运行时间和计算资源。
在过去的几代中,个体没有明显的改进。这可以通过存储每一代获得的最佳适应度值,然后将当前的最佳值与预定的几代之前获得的最佳值进行比较来实现。如果差异小于某个阈值,则算法可以停止。
其他停止条件:
自算法过程开始以来已经超过预定时间。
消耗了一定的成本或预算,例如CPU时间和/或内存。
最好的解已接管了一部分种群,该部分大于预设的阈值。
遗传算法优点
经典优化算法的特点:算法往往是基于梯度的,靠梯度方向来提高个体性能;渐进收敛;单点搜索;局部最优。遗传算法具有如下优点:
(1)遗传算法直接以目标函数值作为搜索信息。传统的优化算法往往不只需要目标函数值,还需要目标函数的导数等其他信息,这样对于许多目标函数无法求导或很难求导的函数,遗传算法就比较方便
(2)遗传算法同时进行解空间的多点搜索。传统的优化算法往往从解空间的一个初始点开始搜索,这样容易陷人局部极值点。遗传算法进行群体搜索,并且在搜索的过程中引入遗传运算,使群体又可以不断进化,这些是遗传算法所特有的一种隐含并行性,因此,遗传算法更适合大规模复杂问题的优化
(3)遗传算法使用概率搜索技术。遗传算法属于一种自适应概率搜索技术,其选择、交叉、变异等运算都是以一种概率的方式来进行的,从而增加了其搜索过程的灵活性。实践和理论都已证明,在一定条件下遗传算法总是以概率1收敛于问题的最优解。
(4)遗传算法在解空间进行高效启发式搜索,而非盲目地穷举或完全随机搜索。
遗传算法常用的编码形式
-
二进制编码(Binary Encoding):
-
最常见的编码方式之一,将每个个体编码为一串二进制数。
-
适用于数值优化问题,如函数优化、组合优化等。
-
缺点是难以直接表示某些类型的变量(如离散变量)。
-
问题描述:假设我们要使用遗传算法来寻找一个一维函数的最大值或最小值。该函数是一个简单的二次函数 f(x)=x2,定义域为 [−5,5][−5,5]。
编码方式:使用二进制编码表示解 x。
编码细节:
- 选择一个合适的精度,比如 x** 的精度为 0.01,则二进制位数为 log2(5−(−5)0.01)=log2(1000)≈10log2(0.015−(−5))=log2(1000)≈10。
- 因此,每个解可以用一个长度为 10 的二进制串表示。
编码示例:对于 x=1.5,二进制表示为
0110000000
(转换为十进制为 60,乘以精度 0.01)。遗传操作:
- 交叉:可以选择单点交叉或多点交叉。
- 变异:可以对某个位上的值进行反转。
-
-
实数编码(Real Number Encoding):
-
将每个个体编码为一组实数,每个实数对应一个变量。
-
适用于连续空间的优化问题。
-
可以直接表示实数值,便于处理连续变量。
-
问题描述:假设我们要解决一个三维空间中的函数优化问题,函数形式为 f(x,y,z)=x2+y2+z2,定义域为 [−10,10][−10,10]。
编码方式:使用实数编码表示解 (x,y,z)。
编码细节:每个解由三个实数组成,可以直接表示为 (x,y,z)。
编码示例:
- 对于解 (3.5,−4.2,2.1),直接表示为 (3.5,−4.2,2.1)。
遗传操作:
- 交叉:可以选择算术交叉或差分交叉。
- 变异:可以在某个维度上加上一个随机扰动。
-
-
整数编码(Integer Encoding):
-
将每个个体编码为一组整数,每个整数对应一个变量。
-
适用于离散变量的优化问题,如旅行商问题(TSP)、资源分配问题等。
-
可以直接表示整数值,便于处理离散变量
-
问题描述:假设我们要解决一个背包问题(Knapsack Problem),给定一系列物品及其重量和价值,选择物品装入背包,使得总价值最大,不超过背包容量。
编码方式:使用整数编码表示选择哪些物品放入背包。
编码细节:每个物品可以用一个整数表示,如果选择了该物品,则相应位置的整数为 1,否则为 0。
编码示例:假设有 5 个物品,选择物品 1、3 和 5,则编码为
(1, 0, 1, 0, 1)
。遗传操作:
- 交叉:可以选择单点交叉或多点交叉。
- 变异:可以在某一位上改变其值(从 0 变为 1 或从 1 变为 0)。
-
-
符号编码(Symbolic Encoding):
- 将每个个体编码为一组符号,每个符号可以是字符、字母或其他符号。
- 适用于需要表示特定意义的变量的问题,如字符串匹配、文本处理等。
- 例如,在遗传编程(Genetic Programming)中,使用符号编码来表示程序的结构。
-
排列编码(Permutation Encoding):
-
将每个个体编码为一个元素的排列。
-
适用于顺序相关的问题,如旅行商问题(TSP)、作业调度问题等。
-
每个基因代表一个元素的位置,整个染色体代表一个完整的顺序。
-
问题描述:假设我们要解决一个旅行商问题(TSP),给定一组城市,寻找一条最短的路线,使得旅行商访问每个城市一次并返回起点。
编码方式:使用排列编码表示城市访问的顺序。
编码细节:每个城市的位置可以用一个整数表示,排列编码为一个城市的访问顺序。
编码示例:假设有 4 个城市,访问顺序为 A -> B -> C -> D -> A,则编码为
(1, 2, 3, 4)
(假设 A、B、C、D 分别对应 1、2、3、4)。遗传操作:
- 交叉:可以选择部分匹配交叉(PMX)或有序交叉(OX)。
- 变异:可以在排列中交换两个位置的城市。
-
-
树形编码(Tree Encoding):
-
将每个个体编码为一棵树的结构。
-
适用于遗传编程(Genetic Programming)中的程序表示。
-
每个节点可以表示一个操作符或一个变量,叶子节点表示常数或输入变量。
-
假设我们要使用遗传编程来寻找一个数学表达式,使得该表达式对给定的数据点拟合得最好。
编码方式:使用树形编码表示数学表达式。
编码细节:
- 每个节点可以是一个操作符(如加、减、乘、除)或一个变量/常数。
- 树的根节点表示整个表达式。
编码示例:
-
表达式 x+y∗z,可以表示为如下树形结构:
-
3.爬山法(随机算法)
(0)初始化:随机产生一个当前解c,评价其适应度f(c)。
(1)对c进行复制,并对复制后的解进行变异,得到m,评价其适应度f(m)。
(2)如果f(m)不比f(c)差,则用m取代c,否则丢弃m。
(3)如果满足停止条件,停止;否则,转(1)。
尽管爬山法可用于问题的求解,但也存在一定的缺点,从图可看到:爬山法易始人局部最优。
4.模拟退火
模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。
通俗点描述:有一只兔子在山上,要去山脚下,但它喝醉了。于是它就胡乱瞎蹦跶,有可能直接蹦跶到山脚下,有可能蹦跶到更高的另一座山,也可能跳到某个山谷里。等它醒酒后,它就慢慢地往低处走。这就是模拟退火。
5.贪心算法
贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。
6.禁忌搜索
采用邻域选优的搜索方法,为了逃离局部最优解,算法必须能够接受劣解,也就是每一次得到的解不一定优于原来的解。但是,一旦接受了劣解,算法迭代即可能陷入循环。为了避免循环,算法将最近接受的一些移动放在禁忌表中,在以后的迭代中加以禁止。即只有不再禁忌表中的较好解(可能比当前解差)才能接受作为下一代迭代的初始解。随着迭代的进行,禁忌表不断更新,经过一定的迭代次数后,最早进入禁忌表的移动就从禁忌表中解禁退出。
7.群体智能算法
群智能是一种基于生物群体行为规律的计算技术,它受社会昆虫,例如蚂蚁、蜜蜂和群居脊椎动物,又如鸟群、鱼群和兽群等的启发,来解决分布式问题。群智能中的群体指的是“一组相互之间可以进行直接通信或者间接通信(通过改变局部环境)的主体(agent),这些主体能够通过合作进行分布式问题的求解”。如蜜蜂采蜜和蚂蚁觅食等,都需要依靠集体的力量。这种自然系统解决问题的能力,要优于彼此分离的个体所组成的系统。
群智能是一种概率搜索算法。群智能的特点和优点如下:
(1)群体中相互合作的个体是分布的(distributed),这样能够更适应当前网络环境下的工作状态,即无中心性。
(2)没有中心的控制与数据,这样的系统更具有鲁棒性(robust),不会由于某一个或者某几个个体的故障而影响整个问题的求解。
(3)它可以不通过个体之间直接通信,而通过非直接通信进行合作,这样的系统具有更好的可扩充性(scalability)。
(4)由于系统中个体的增加而增加的系统通信开销十分小,系统中每个个体的能力十分简单,这样每个个体的执行时间比较短,并且实现也比较简单,具有简单性(simplicity)。
6.粒子群算法
粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization)。从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。
通俗点描述:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即找到了最优解。
鸟群算法需满足以下原则:
(1)邻近原则(ProximityPrinciple):群体应该能够执行简单的空间和时间运算。
(2)质量原则(QualityPrinciple):群体应该能感受到周围环境中质量因素的变化,并
对其产生响应。(3)反应多样性原则(PrincipleofDiverseResponse):群体不应将自己获取资源的途径
限制在狭窄的范围之内。(4)稳定性原则(PrincipleofStability):群体不应随着环境的每一次变化而改变自己
的行为模式。(5)适应性原则(PrincipleofAdaptability):当改变行为模式带来的回报是值得的时
候,群体应该改变其行为模式。
块系统还必须满足雷诺规则:
- (1)要求微粒群系统具有分离性,即避免相邻的块发生碰撞,对系统进行位置控制。
- (2)要求系统具有结盟性,即要求粒子与周围的微粒的速度与方向相匹配,对系统进
行速度控制。- (3)要求系统具有内聚性,即要求微粒与附近的微粒距离很近,以控制系统的整体位置。
7.蚁群算法
蚁群可以在不同的环境下,寻找最短到达食物源的路径。后经进一步研究发现,这是因为蚂蚁会在其经过的路径上释放一种可以称之为“信息素(pheromone)”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,其中信息素浓度与路径长度成反比,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。
行为特征:
- 信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。
- 蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放 一定量的信息素,以增强该条路径上的信息素浓度,这样,会形成一个 正反馈
- 路径上的信息素浓度会随着时间的推进而逐渐衰减
8.人工蜂群算法
人工蜂群算法的核心思想是模拟蜜蜂群体在寻找食物源时的行为模式。在算法中,每个蜜蜂代表一个潜在的解决方案,蜜蜂群体通过相互协作和信息共享来优化这些解决方案。
人工蜂群算法的主要角色:
- 雇佣蜂(Employed Bees):
- 每个雇佣蜂负责一个食物源(解)。
- 搜索邻近的食物源,以期找到更好的食物源。
- 闲职蜂(Onlooker Bees):
- 根据雇佣蜂带回的信息选择食物源。
- 更倾向于选择具有较好质量(如更高的食物量)的食物源。
- 侦察蜂(Scout Bees):
- 当一个食物源被遗弃(即雇佣蜂多次未能改进)时,雇佣蜂变成侦察蜂。
- 侦察蜂随机选择一个新的食物源(解)。
9.人工鱼群算法
在一片水域中,鱼往往能自行或尾随其他鱼找到营养物质多的地方,因而鱼生存数目最多的地方一般就是本水域中营养物质最多的地方,人工鱼群算法就是根据这一特点,通过构造人工鱼来模仿鱼群的觅食、聚群及追尾行为,从而实现寻优。
人工鱼拥有以下几种典型行为:
(1)觅食行为:一般情况下鱼在水中随机地自由游动,当发现食物时,则会向食物逐渐增多的方向快速游去。
(2)聚群行为: 鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群,鱼聚群时所遵守的规则有三条:
分隔规则:尽量避免与临近伙伴过于拥挤;
对准规则:尽量与临近伙伴的平均方向一致;
内聚规则:尽量朝临近伙伴的中心移动。
(3)追尾行为:当鱼群中的一条或几条鱼发现食物时,其临近的伙伴会尾随其快速到达食物点。
(4)随机行为:单独的鱼在水中通常都是随机游动的,这是为了更大范围地寻找食物点或身边的伙伴。