zoukankan      html  css  js  c++  java
  • 【刷题】经典的启发式算法

    参考链接:

    什么是启发式算法

    定义:

    • 启发式算法一般用于解决NP-hard问题,其中NP是指非确定性多项式。

    • 启发式算法是相对于最优化算法提出的,是基于直观或者经验构造的算法,在可接受的开销(时间和空间)内给出待解决组合优化问题的一个可行解。

    例子:

    • 例如,著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从南京出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?
    • 推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排。

    PPPPPPS:

    现代启发式算法的各种具体实现方法是相对独立提出的,相互之间有一定的区别。从历史上看,现代启发式算法主要有:模拟退火算法(SA)、遗传算法(GA)、列表搜索算法(ST)、进化规划(EP)、进化策略(ES)、蚁群算法(ACA)、人工神经网络(ANN)。如果从决策变量编码方案的不同来考虑,可以有固定长度的编码(静态编码)和可变长度的编码(动态编码)两种方案。SA是基于Monte Carlo算法迭代求解的一种全局概率型搜索算法,具有区别于常规算法的搜索机制和特点,它是借鉴了热力学的退火原理建立起来的。GA是借鉴“优胜劣汰”生物进化与遗传思想而提出的一种全局性并行搜索算法。EP和ES不像GA注重父代与子代遗传细节而侧重父代与子代表现行为上的联系(强调物种层的行为变化)。TS是一种具有记忆功能的全局逐步优化算法。ACA是受到人们对自然界中真实的蚁群集体行为研究成果的启发而提出的一种基于种群的模拟进化算法,属于随机搜索算法。

    目前通用的启发式算法

    • 模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN)等。

    模拟退火算法(SA)

    定义:

    • 模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。

    模拟退火算法步骤:

    • 初始化温度T(充分大),温度下限Tmin(充分小),初始解X,每个T值迭代次数L
    • 随机生成临域解x_new;
    • 设f(x)函数来计算用来计算解得好坏,计算出f(x_new)-f(x);
    • 如果f(x_new)-f(x)>0,说明新解比原来的解好,则无条件接受,如果f(x_new)-f(x)<0,则说明旧解比新解好,则以概率exp((f(xnew)-f(x))/k*T)接受x_new作为解。
    • 如果当前温度<Tmin时,则退出循环,输出当前结果,否则减少当前温度,回到第2步继续循环,常用的降温方法为T= a*T (0<a<1),一般a取接近1的值

    遗传算法(GA)

    定义:

    • 遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。

    遗传算法步骤

    • 对潜在问题进行编码,初始化基因组,并根据基因组随机初始化种群,并指定繁衍代数。
    • 计算种群中每个个体的适应度,选择一定数目的留下,其余淘汰。
    • 在留下的个体中,随机繁衍,对分母基因进行交叉(极小概率变异),产生下一代。
    • 回到第2步进行循环。直到达到指定的繁衍代数

    蚁群算法(ACO)

    定义:

    • 我们尝试复原一下蚂蚁寻找食物的场景。
    • 想象有一只蚂蚁找到了食物,这时它需要将食物带回蚁穴。对于这一只蚂蚁而言,它显然并不知道应该怎么走。那么,这只蚂蚁有可能会随机选择一条路线。
    • 这条路线很可能是一条远路。但是,蚂蚁一路上留下了记号,也就是信息素。如果这只蚂蚁继续不停地搬运食物,或者有许多其他蚂蚁一块搬运的话。他们总会在运气好的时候走到更快往返的路线上。蚂蚁选择的路越好,相同时间内往返的次数也就更多,也就在路上留下了更多的信息素。
    • 于是,蚂蚁们总会发现,有一些路径的信息素更浓,这些路径就是更好的路线。于是蚂蚁也就更多地向信息素更浓的路径上偏移。蚂蚁们不停重复这个过程,最终总能找到一条确定的路线,而这条路线就是蚂蚁们找到的最优路径。

    蚁群算法步骤

    • 初始化蚂蚁数量、可行路段、每条路段距离、每条路段的初始信息素大小等信息
    • 设定蚂蚁的起点、终点。
    • 蚂蚁从起点出发根据信息素浓度,有一定的概率性选择路段,浓度越高,概率越大,逐步回到终点。
    • 在蚂蚁走过的路径上,根据每条路段的长度按比例释放信息素,短的路段释放的信息素多,长的路段释放的信息素少。
    • 对所有路段的信息素进行挥发。
    • 回到第二步进行循环,直到蚂蚁数量迭代完。

    END

  • 相关阅读:
    java实现动态上传多个文件并解决文件重名问题
    MySQL存储过程之事务管理
    Java IO--字符流--InputStreamReader 和 OutputStreamWriter
    Java IO--字符流--BufferedReader和BufferedWriter
    java线程同步小结
    进程和线程的区别与联系
    java中“==”和equals方法的区别,再加上特殊的String引用类型
    java.util.Date 与 java.sql.Date 之间的转换
    Java Applet 与Servlet之间的通信
    Applet 应用程序进行数字签名,对系统文件进行读写操作
  • 原文地址:https://www.cnblogs.com/anliux/p/11418933.html
Copyright © 2011-2022 走看看