声明:本文为作者学习笔记,学习所得随手而记,部分材料来源于网上学习,若侵权请联系作者。

1.什么是启发式算法

启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。现阶段,启发式算法以仿自然体算法为主,主要有蚁群算法、模拟退火法、遗传算法、粒子群算法、神经网络等。

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

例如,著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从南京出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?

推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排。

例子

我们举一个例子来具体说明一下:

现在要求你开车去A镇的同学B家,那算法是这样写的:你沿着1号公路向东走一直到2号公路,之后左转沿着2号公路前进3公里,在一个五金店旁边的十字路口右转,直走1.5公里后你会发现在左手边有一个红色的大房子,那就是同学B家。

如果用启发式方法来描述则可能是这样(一种思路):首先找出上一次同学B寄给你的信,按照信上的地址你先开车到这个镇,到了之后你问一下周围的人,同学B的家在哪里,因为这里每个人都认识同学B,肯定有人会很愿意帮助你的,当然,如果你找不到人,那就找个公共电话亭给同学B打电话,他会出来接你。

对这个例子的简单理解:一般的最优化算法会提供很明确的思路去找寻最优解,即使不是最优解,那也应该是接近于最优解;但是启发式算法只是给你一个大致的思路,要想找到可行解需要算法去根据条件(问题所限定的条件)以及算法本身的思路特点(这里的思路特点理解为遗传算法、粒子群算法等搜寻可行解时的思路,即不同的思路等同于不同的启发式算法)去找寻可行解,同时这个可行解不能保证就是最优解,有可能还是不怎么靠谱的解。

2.关于启发式算法的一些补充说明

1.启发式算法(Heuristics Algorithm)是一种技术,这种技术使得在可接受的计算成本内去搜寻最好的解,但不一定能保证所得的可行解和最优解,甚至在多数情况下,无法阐述所得解同最优解的近似程度。

2.我们在解决问题时经常根据经验规则来探究分析问题,主要内容是在解决问题时,利用过去的经验,选择已经有效的方法,而不是按照系统地、确定性的步骤去寻求答案,启发式解决问题的方法是与算法相对立的。一般来说,算法是对所有可能性进行尝试,最终找到问题的最优解,但它是在很大的问题空间内,花费大量的时间和精力才能求得答案。而启发式的方法则是在有限的搜索空间内,极大地减少尝试的次数,能迅速找到问题的答案。但是由于这种方法具有尝试错误的特点,所以失败的可能性也不少。

3.启发式算法分类

1.传统启发式算法,例如贪心算法、爬山算法等;

2.元启发式算法,主要指一类通用型的启发式算法,简单的来说,它在传统启发式算法的思想上增加了随机搜索的思想,并且这类算法的优化机理不过分依赖于算法的组织结构信息,可以广泛的应用到函数的组合优化和函数计算中;

3.超启发式算法,超启发式算法是由一系列的启发式算法组合而成的,超启发式算法是智能化程度更高的算法,每一种超启发式算法有其自己的机制。超启发式算法分为两个层面:在问题域层面上应用领域专家需根据本人的背景知识,提供问题的定义、评估函数等信息和一系列低层启发式算法(Low-Level Heuristics);而在高层策略层面上,智能计算专家则通过设计高效的操纵管理机制,利用问题域所提供的问题特征信息和低层启发式算法算法库,构造新的启发式算法。由于超启发式算法的的研究尚处于起步阶段,对于已有的各种超启发式算法,国际上尚未形成一致的分类方法。按照高层策略的机制不同,现有超启发式算法可以大致分为4类:基于随机选择、基于贪心算法、基于元启发式算法和基于学习的超启发式算法。

具体的分类算法如下图所示:

4.启发式算法的优缺点

(1)优点:

a.算法简单直观,易于修改;

b.减少大量的工作量,显著节约开支和时间,算法可在短时间内给出一个可行解。

(2)缺点:

        a.不能保证为全局最优解;

b.算法不稳定,性能取决于实际问题以及算法设计者的经验和技术。

一些常见的启发式算法后续会一一介绍并赋具体代码,敬请关注。

启发式算法的基础定义与了解相关推荐

  1. 了解一些常用的文件系统和一些基础定义

    了解一些常用的文件系统和一些基础定义 基础定义: 文件系统就是在存储设备上组织文件的方法.而存储设备就是常见的磁盘,也有基于NAND Flash的固态硬盘等.对于组织文件的方法又分为命名文件及放置文件 ...

  2. 【数据结构】图的基础定义

    图是一种非常重要的数据结构,特别是应用在地图上,比如高德地图路径规划.坐地铁.公交时的路径规划,我们的生活与之息息相关.下面回顾一波基础定义 一.图的定义 图(Graph):是由顶点的有穷非空集合和顶 ...

  3. 资料: 颜色RGB基础定义

    版权声明: [cpp] view plaincopy print? // experiment_ColorRef.cpp : Defines the entry point for the conso ...

  4. 类的基础定义以及运用

    小编来解释一下基础的c++类中的成员的定义以及基础运用 按照国际惯例,先来一波程序例子 public://这里代表此class是否可以被访问 void getnumber(int a, int b)/ ...

  5. 人工智能基础-概率分布与函数的基础定义

    https://www.toutiao.com/a6706233994691740172/ 概率分布用于许多领域,但我们很少看到相应的解释.通常作者会假定读者已经了解概率分布了.本文将尝试解释什么是概 ...

  6. 【2017-02-18】C#基础 - 定义变量,输入输出(最基础的编程,以及灵活多变的编写思维)...

    C# 全称C Sharp 它是一种编程语言 文件名以.cs结尾 我们要如何运用C#来进行编程,那就是Visual Studio 如何使用Visual Studio 打开VS,点击左上角的"文 ...

  7. java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...

    # with open(r'a.txt', 'r', encoding='utf-8')as f: # data1=f.read() # print('>1>:',data1) # pri ...

  8. python函数定义语法_python 函数基础 定义

    一.函数介绍 1.为什么要有函数? 没有函数的代码组织结构不清晰,可读性差. 代码冗余 管理维护难度大,扩展性 2.什么是函数? 具备某一个功能的工具就是程序中的函数. 事先准备工具的过程就是:函数的 ...

  9. Terraform 基础 定义阿里云资源 VPC、安全组

    provider里面提供了资源,接下来就开始定义阿里云的资源了.我们将阿里云的插件也就是provider安装好了,接下来就是调用里面的资源. 在terraform里面最重要的就是资源,资源主要来自pr ...

最新文章

  1. 开发日记-20190711 关键词 Perl的后续学习
  2. python中set index_Python set_index和reset_index详解
  3. leetcode945. Minimum Increment to Make Array Unique
  4. linux离线依赖包一键安装包,【分享】一键离线安装PetaLinux依赖包
  5. 某学校买了一批计算机配置为,初中信息技术考试选择题
  6. 汽车故障诊断技术【10】
  7. 必备浏览器插件,不用安装音乐软件全家桶,轻松下载全网音乐!
  8. 工程项目成本费用明细表_这么简单?成本费用明细表这么填就对了
  9. 向量法计算体积的思路(没有代码了)
  10. 周浩正:写给编辑人的信 编务报告书 一个实例
  11. 【ZOJ2750】Idiomatic Phrases Game(最短路)
  12. 文人教你说祝福——古语祝福
  13. PayPal支付集成到自己Web网站
  14. Java集成PayPal支付
  15. #完美解决 闪讯客户NetKeeper---Sorry,this application cannot under a Virtual Machine
  16. 两个相同字组成的汉字 - 中国汉字的奇妙(三)
  17. 风光储交直流微电网matlab/simulink仿真模型仿真模型
  18. 最新 955 互联网公司白名单来了!
  19. 第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens)
  20. 基于GraphHooper的离线导航软件实现

热门文章

  1. 产品经理经常面临的系统须知大拷问
  2. springboot驾校报名系统 微信小程序
  3. 学校计算机房的布线注意要点,计算机机房布线的注意事项
  4. 2023年Java面试题大全(最新版版)面试题附答案详解,看完BTA可进
  5. android开发教程21篇(强烈推荐,几乎每一篇都是精华教程)
  6. echars自定义y轴为图片
  7. linux越狱amd卡代码,为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息
  8. java.sql.SQLException: ORA-00600: 内部错误代码解决
  9. 英语语法篇 - 查漏补缺
  10. 如何巧用微信生态搭建和运营私域流量