zoukankan      html  css  js  c++  java
  • 最优解算法的讨论


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

    非凸没有特别有效的方法来解。假设是强凸的,何必用那么复杂的方法求最优解?正是由于不是强凸的,才用到优化方法。就算是凸的。也分好几种不同的情况。仅仅用一阶梯度,达到牛顿梯度法的收敛速度。在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:

  • 相关阅读:
    Docker学习笔记之常用的 Docker Compose 配置项
    Docker学习笔记之使用 Docker Compose 管理容器
    qt无法使用终端启动的解决方法
    实践卡尔曼滤波--小球追踪
    高斯分布 笔记
    蒙特卡罗定位(Particle Filter Localization)笔记
    珊格地图笔记
    ubuntu14.04 下安装 gsl 科学计算库
    SLAM学习资料汇总
    矩阵的SVD分解
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7045307.html
Copyright © 2011-2022 走看看