关于启发式算法、元启发式算法以及超启发式算法的理解
主要参考以下文章:https://leovan.me/cn/2019/04/heuristic-algorithms/http://oscar-lab.org/paper/cccf_11.pdfhttps://www.cnblogs.com/tsingke/p/12512250.htmlhttps://zhuanlan.zhihu.com/p/37199993
启发式算法
定义:启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。现阶段,启发式算法以仿自然体算法为主,主要有蚁群算法、模拟退火法、神经网络等。
通俗解释:针对某个特定(problem specific)的问题,由于这个问题的最优解不好求或者求不出,那么就退而求其次,求次优解或者可行解,巧了,启发式算法就是来干这个事的,即启发式算法用来求问题的可行解
元启发式算法
定义:元启发式算法主要指一类通用型的启发式算法,这类算法的优化机理不过分依赖于算法的组织结构信息,可以广泛的应用到函数的组合优化和函数计算中
通俗解释:说白了,元启发式算法是启发式算法的一种改进,它不依赖于特定问题,通常是一个通用的启发式策略(problem independent),因而能够运用于更广泛的方面
异同点比较
首先说相同点:(1)两者都无法保证得到某优化问题的全局最优解(2)二者目的相同,都是为了快速地求解那些不存在或者暂时未找到多项式时间内算法的问题,比如TSP问题,flowshop问题。而像Linear programming就不会用heuristics或者meta-heuristics去求解了
不同点:不同点在于:heuristics算法中不会存在“随机因素”。对于同样一个问题,只要给定了一个输入,那么算法执行的步骤就固定下来了,输出也因此固定。但是meta-heuristics就不一样了,里面包括了“随机因素”。就拿遗传算法来说,同样一个初始的种群(输入一致),运行两次(每次100代),得到的结果很可能是不同的。因为交叉、变异操作的对象是随机选择的。在比如模拟退火,按照metropolis准则跳出局部最优解时也是随机的,这也解释了为神马SA可能得到全局最优解。总之,heuristics在固定的输入下得到固定的输出。meta-heuristics在固定的输入下得到的输出不固定。(PS:我有个疑问,看了网上很多资料,发现很多人把遗传算法、模拟退火、蚁群算法等也称作启发式算法,那它们到底是启发式算法还是元启发式算法?或者说根本没必要去对它们分类?希望有大神给予解答)
超启发式算法
定义:超启发式算法提供了某种高层策略(High-Level Strategy,HLS),通过操纵或管理一组低层启发式算法(Low-Level Heuristics, LLH),以获得新启发式算法。这些新启发式算法则被运用于求解各类NP-难解问题。
通俗解释:这个概念是近些年新兴的,我只说下我自己的理解(没有深入研究,肯定存在不足之处)。首先,二者共同点是超启发式算法与启发式算法均是为了求解问题实例而提出的;二者的不同点在于各自的搜索空间构成不同:传统启发式算法是工作在由问题实例的解构成的搜索空间上;而超启发式算法运行在一个由启发式算法构成的搜索空间上。换句话说,就是超启发方法先对一堆启发式方法进行组合优化,之后拿着这一组方法再去对问题进行求解。
主要参考以下文章:
- https://leovan.me/cn/2019/04/heuristic-algorithms/
- http://oscar-lab.org/paper/cccf_11.pdf
- https://www.cnblogs.com/tsingke/p/12512250.html
- https://zhuanlan.zhihu.com/p/37199993
- https://blog.csdn.net/econe_wei/article/details/102531451
- https://blog.csdn.net/u011561033/article/details/85623533?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)