启发式算法的基础定义与了解
声明:本文为作者学习笔记,学习所得随手而记,部分材料来源于网上学习,若侵权请联系作者。
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.算法不稳定,性能取决于实际问题以及算法设计者的经验和技术。
一些常见的启发式算法后续会一一介绍并赋具体代码,敬请关注。
启发式算法的基础定义与了解相关推荐
- 了解一些常用的文件系统和一些基础定义
了解一些常用的文件系统和一些基础定义 基础定义: 文件系统就是在存储设备上组织文件的方法.而存储设备就是常见的磁盘,也有基于NAND Flash的固态硬盘等.对于组织文件的方法又分为命名文件及放置文件 ...
- 【数据结构】图的基础定义
图是一种非常重要的数据结构,特别是应用在地图上,比如高德地图路径规划.坐地铁.公交时的路径规划,我们的生活与之息息相关.下面回顾一波基础定义 一.图的定义 图(Graph):是由顶点的有穷非空集合和顶 ...
- 资料: 颜色RGB基础定义
版权声明: [cpp] view plaincopy print? // experiment_ColorRef.cpp : Defines the entry point for the conso ...
- 类的基础定义以及运用
小编来解释一下基础的c++类中的成员的定义以及基础运用 按照国际惯例,先来一波程序例子 public://这里代表此class是否可以被访问 void getnumber(int a, int b)/ ...
- 人工智能基础-概率分布与函数的基础定义
https://www.toutiao.com/a6706233994691740172/ 概率分布用于许多领域,但我们很少看到相应的解释.通常作者会假定读者已经了解概率分布了.本文将尝试解释什么是概 ...
- 【2017-02-18】C#基础 - 定义变量,输入输出(最基础的编程,以及灵活多变的编写思维)...
C# 全称C Sharp 它是一种编程语言 文件名以.cs结尾 我们要如何运用C#来进行编程,那就是Visual Studio 如何使用Visual Studio 打开VS,点击左上角的"文 ...
- java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...
# with open(r'a.txt', 'r', encoding='utf-8')as f: # data1=f.read() # print('>1>:',data1) # pri ...
- python函数定义语法_python 函数基础 定义
一.函数介绍 1.为什么要有函数? 没有函数的代码组织结构不清晰,可读性差. 代码冗余 管理维护难度大,扩展性 2.什么是函数? 具备某一个功能的工具就是程序中的函数. 事先准备工具的过程就是:函数的 ...
- Terraform 基础 定义阿里云资源 VPC、安全组
provider里面提供了资源,接下来就开始定义阿里云的资源了.我们将阿里云的插件也就是provider安装好了,接下来就是调用里面的资源. 在terraform里面最重要的就是资源,资源主要来自pr ...
最新文章
- 开发日记-20190711 关键词 Perl的后续学习
- python中set index_Python set_index和reset_index详解
- leetcode945. Minimum Increment to Make Array Unique
- linux离线依赖包一键安装包,【分享】一键离线安装PetaLinux依赖包
- 某学校买了一批计算机配置为,初中信息技术考试选择题
- 汽车故障诊断技术【10】
- 必备浏览器插件,不用安装音乐软件全家桶,轻松下载全网音乐!
- 工程项目成本费用明细表_这么简单?成本费用明细表这么填就对了
- 向量法计算体积的思路(没有代码了)
- 周浩正:写给编辑人的信 编务报告书 一个实例
- 【ZOJ2750】Idiomatic Phrases Game(最短路)
- 文人教你说祝福——古语祝福
- PayPal支付集成到自己Web网站
- Java集成PayPal支付
- #完美解决 闪讯客户NetKeeper---Sorry,this application cannot under a Virtual Machine
- 两个相同字组成的汉字 - 中国汉字的奇妙(三)
- 风光储交直流微电网matlab/simulink仿真模型仿真模型
- 最新 955 互联网公司白名单来了!
- 第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens)
- 基于GraphHooper的离线导航软件实现
热门文章
- 产品经理经常面临的系统须知大拷问
- springboot驾校报名系统 微信小程序
- 学校计算机房的布线注意要点,计算机机房布线的注意事项
- 2023年Java面试题大全(最新版版)面试题附答案详解,看完BTA可进
- android开发教程21篇(强烈推荐,几乎每一篇都是精华教程)
- echars自定义y轴为图片
- linux越狱amd卡代码,为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息
- java.sql.SQLException: ORA-00600: 内部错误代码解决
- 英语语法篇 - 查漏补缺
- 如何巧用微信生态搭建和运营私域流量