最优解算法的讨论

Posted cynchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最优解算法的讨论相关的知识,希望对你有一定的参考价值。


不懂优化的人希望能有通用的方法来解决他手头的问题。但不幸的事没有这样的方法存在。高速的方法都须要某些条件,比方常见的有强凸。线性,可分解啥的。眼下研究的比較成熟的就是强凸光源可分解

 

非凸没有特别有效的方法来解。假设是强凸的,何必用那么复杂的方法求最优解?正是由于不是强凸的,才用到优化方法。就算是凸的。也分好几种不同的情况。仅仅用一阶梯度,达到牛顿梯度法的收敛速度。在convex问题中,还有non-smooth的函数,也是不好解的。

 

 

算法论中的动态规划。贪心算法等等是主要的理论。实际中採用的往往须要和计算方法相结合。以下几种是能够通过工具直接实现的最优解算法.


 

爬山算法:爬山算法是一种简单的贪心搜索算法。是对深度优先搜索的一种改进。利用反馈信息帮助生成解的决策,属于人工智能算法的一种。

採用启示式方法,局部择优,每次从当前解的临近解空间中选择一个最优解,替换为当前解。直到达到一个局部最优解。

缺点:由于不是全面搜索,所以结果可能不是最佳。

  

爬山算法一般存在下面问题:  

1)、局部最大:某个节点比周围不论什么一个邻居都高。可是它却不是整个问题的最高点。

  

2)、高地:也称为平顶。搜索一旦到达高地,就无法确定搜索最佳方向,会产生随机走动,使得搜索效率减少。

  

3)、山脊:搜索可能会在山脊的两面来回震荡,前进步伐非常小。

 

算法过程:从当前的节点開始。和周围的邻居节点的值进行比較。 假设当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点)。反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的。

如此循环直到达到最高点。

长处:避免遍历,通过启示选择部分节点,从而达到提高效率的目的。

 

    爬山算法实现非常easy,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所看到的:如果C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,由于在A点不管向那个方向小幅度移动都不能得到更优的解。

 技术分享


 

模拟退火算法:

模拟退火事实上也是一种贪心算法。可是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解。因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解A后。会以一定的概率接受到E的移动。或许经过几次这种不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

模拟退火算法描写叙述:

          若J( Y(i+1) )>= J(Y(i) )  (即移动后得到更优解)。则总是接受该移动

          若J( Y(i+1) )< J(Y(i) )  (即移动后的解比当前解要差),则以一定的概率接受移动,并且这个概率随着时间推移逐渐减少(逐渐减少才干趋向稳定)

这里的“一定的概率”的计算參考了金属冶炼的退火过程。这也是模拟退火算法名称的由来。

   依据热力学的原理。在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:

     P(dE) =exp( dE/(kT) )

  当中k是一个常数,exp表示自然指数,且dE<0。

这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大。温度越低。则出现降温的概率就越小。又因为dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。

  随着温度T的减少,P(dE)会逐渐减少。

  我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这种移动。

  关于爬山算法与模拟退火。有一个有趣的比喻:

  爬山算法:兔子朝着比方今高的地方跳去。它找到了不远处的最高山峰。可是这座山不一定是珠穆朗玛峰。

这就是爬山算法,它不能保证局部最优值就是全局最优值。

  模拟退火:兔子喝醉了。

它随机地跳了非常长时间。这期间。它可能走向高处。也可能踏入平地。可是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。

 

遗传算法 ( GA , Genetic Algorithm )

也称进化算法。遗传算法是受达尔文的进化论的启示,借鉴生物进化过程而提出的一种启示式搜索算法。

因此在介绍遗传算法前有必要简单的介绍生物进化知识。

算法思想

  借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程。通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解。添加适应度函数值高的解。这样进化N代后就非常有可能会进化出适应度函数值非常高的个体。

  举个样例。使用遗传算法解决“0-1背包问题”的思路:0-1背包的解能够编码为一串0-1字符串(0:不取,1:取);首先,随机产生M个0-1字符串,然后评价这些0-1字符串作为0-1背包问题的解的优劣;然后。随机选择一些字符串通过交叉、突变等操作产生下一代的M个字符串,并且较优的解被选中的概率要比較高。这样经过G代的进化后就可能会产生出0-1背包问题的一个“近似最优解”。

 编码:须要将问题的解编码成字符串的形式才干使用遗传算法。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组的形式。比如。问题的解是整数,那么能够将其编码成二进制位数组的形式。将0-1字符串作为0-1背包问题的解就属于二进制编码。

   遗传算法有3个最主要的操作:选择,交叉。变异。(三个操作的详细方法參见相关论文)

基本遗传算法优化

   以下的方法可优化遗传算法的性能。

   精英主义(Elitist Strategy)选择:是基本遗传算法的一种优化。

为了防止进化过程中产生的最优解被交叉和变异所破坏,能够将每一代中的最优解原封不动的拷贝到下一代中。

   插入操作:可在3个基本操作的基础上添加一个插入操作。插入操作将染色体中的某个随机的片段移位到还有一个随机的位置。

 

蚁群算法:

蚁群算法(ant colony optimization, ACO),又称蚂蚁算法。一种用来在图中寻找优化路径的机率型算法。Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有很多优良的性质.针对PID控制器參数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比較,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。

 

人工萤火虫算法:

 

Nesterov method:

 

 

以上是关于最优解算法的讨论的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法

矩阵相乘求最优解(C++算法)

贪心算法

贪心算法

解密贪心算法——最高效的近似算法

梯度下降——寻找那个最优解