咨询热线
0898-08980898传真:0000-0000-000
【最优化】数值优化算法
核心思路:对梯度方向做一些修正,使得每次迭代寻找最优点都在可行域的内部进行。
我们从可行域内部的某个点开始搜索,一开始沿着梯度方向进行迭代搜索,一旦碰到边界(说明下一步可能会离开可行域)就要扭转方向,使得搜索过程始终在可行域的内部进行。
当点落在可行域外部时,该怎样选择搜索方向,衍生出了下列的算法。
在缝边法的思想中,当这一轮迭代跨过了可行域之后,说明当前这个点不能完全满足约束条件gi(x)(i=1,2,…,n);找到这个点破坏的那个约束条件gj(x),然后沿着这个约束条件的梯度进行可行点的搜索,之后再继续按照上述的步骤迭代。
1. 算法框架
- input:目标函数f(x)和约束条件gi(x)≥0,搜索的初始点向量x0
- process:
①计算f(x)和各组约束条件的归一化梯度向量▽f(x)和▽gi(x)(i=1,2,…,n),规定步长k=1,t=1(迭代轮数)
②从x0沿着当前点的负梯度方向进行步长为1的搜索得到点x1
③根据点与可行域之间的关系,判断下一步的搜索方向:
- 如果当前点xt处于可行域之内,则继续按照目标函数负梯度方向进行搜索;
- 如果当前点xt处于可行域之外,则按照其破坏了的约束条件的正梯度方向进行搜索
④t = t+1;若循环终止条件未满足,则继续转②。
- output:该不等式约束问题的近似解。
2. 示例
【备注】:
①因为规定了步长k=1,在每一轮迭代无需再进行一维搜索,这也导致了每一次迭代其目标函数值可能下降也可能上升。
②梯度向量必须要归一化。之前的算法中我们提到过可忽略【梯度向量归一化】的操作,是因为每一轮都还要进行步长的一维最优搜索,步长k和梯度向量的模长是负相关互相约束的;但这里我们已经规定了步长的数值,如果不对梯度进行归一化,会导致每一次迭代行径的步长不一致。
③我们的目标是最小化目标函数,所以在可行域内时沿着目标函数的负梯度方向行走;一旦离开了可行域,我们希望可以回到可行域之中,而可行域又是形如【g(x)≥0】的形式,所以需要沿着约束条件的正梯度方向走,使得约束条件的值增大。
因此可知,如果我们的约束条件是形如【g(x)≤0】的情况,那么当点落在可行域的外部时,我们需要按照约束条件的负梯度方向进行搜索。
3. 评价与分析
由上图可以看到,缝边法的搜索过程较为迂回,可知该算法的效率并不是很高。
缝边法在可行域内部按照梯度下降的原则进行搜索,此时效率已经较为优异了;关键是在可行域边界上,会有很多小的搜索步伐来回探测,我们希望对这一点进行优化。
p.s. 【复合梯度缝边法】是笔者自己取的,大意就是在缝边的过程中综合考虑了目标函数的梯度和约束条件的梯度。
1. 算法框架
- input:目标函数f(x)和约束条件gi(x)≥0,搜索的初始点向量x0
- process:
①计算f(x)和各组约束条件的归一化梯度向量▽f(x)和▽gi(x)(i=1,2,…,n),规定步长k=1,t=1(迭代轮数)
②从x0沿着当前点的负梯度方向进行步长为1的搜索得到点x1
③根据点与可行域之间的关系,判断下一步的搜索方向:
- 如果当前点xt处于可行域之内,则继续按照目标函数负梯度方向进行搜索;
- 如果当前点xt处于可行域之外,则按照其破坏了的约束条件的正梯度和目标函数负梯度的和向量方向进行搜索
④t = t+1;若循环终止条件未满足,则继续转②。
- output:该不等式约束问题的近似解。
2. 评价与分析
综合考虑目标函数和约束条件的梯度,就使得在【矫正偏离可行域的程度】同时也【尽量优化目标函数的值】。
p.s. 但这个思想在[目标函数梯度与约束条件的梯度平行]的情况下,很难进行继续优化。
【备注】
在上面讲述的两个约束梯度算法中,我们的两大关键词是【目标函数的梯度】和【约束条件的梯度】,具体是正梯度还是负梯度,需要读者看清楚问题是【最大化/最小化】问题,约束条件是形如【g(x)≥0/g(x)≤0】的形式。
针对有约束的梯度算法,我们有一个核心思路:先将原问题的约束条件忽略,求解其目标函数的最优解,然后验证这个最优解是否在可行域的内部,如果在的话那么就求出了最优解;否则,我们直接去可行域边界上寻找约束优化问题的最优解。
基于上面的思路,前面提到的两种【约束梯度算法】都没有做到【尽量在边界上进行搜索】,于是我们提出了【可行方向法】。
- 【可行方向法】尽量在边界上进行搜索;
- 但是【可行方向法】的每一步都需要做一次线性规划,以寻求一个尽可能接近梯度方向的可行方向。
1. 算法思想与理解
核心思想是:从当前可行点找到下一个可行点;如果在可行域内部,那么沿着梯度方向进行搜寻;如果到达了可行域的边界处,那么就要往可行域内部去搜寻,且这个过程中还要考虑尽量沿着梯度下降的方向。
2. 算法步骤与框架
【可行方向法】在使用的时候有一个默认的条件,即出发点默认总是在可行域的,且下一次迭代的点要么在可行域内要么落在可行域的边界上。但是在实际应用中,想要找到一个可行域内的点并不是那么容易的。
1. 算法思路
其中Ki是一个正常数,Ki∈[0,∞]:
- 当Ki=0时,惩罚项被忽略,问题就对应为原问题的无约束版本
- 当Ki→∞时,惩罚项对应的约束条件严格被满足。
Ki的取值由用户自己决定,取决于希望约束条件满足的程度。
2. 示例
3. 图示与理解
1. 算法思想
2. 图示与理解
不管是不等式约束还是等式约束——
- 当目前这个点落在可行域内部的时候,目标函数值不受影响;
- 当目前这个点落在可行域外部的时候,目标函数值需要变得更差(也就是所谓的加上了一个“惩罚项”)