系列文章目录

前言

首先爬山法和N皇后都是基于图这个数据结构来进行设计实现的,所以我写了另外一篇关于图这个数据结构的详解,可以看以下链接,帮助你更好的理解

常见的精确的搜索算法有:分枝定界法、线性规划法、动态规划法等。
但是如果你求解的问题规模变大的时候,这个时候精确算法将变得无能为力,所以要采用近似算法/启发式算法,有遗传算法、模拟退火法、蚁群算法、禁忌搜索算法、贪婪算法和神经网络等。

一般这种问题用在旅行商问题上(TSP),对称TSP:城市A到城市B的距离 等于 城市B到城市A的距离;
非对称TSP:城市A到城市B的距离 不等于 城市B到城市A的距离。

最短路径查找-Dijkstra算法

要学会爬山法可以先了解更基础的算法,关于图的算法,这里就可以看我博客另外一篇文章关于动态规划的。
这里简单描述一下,最短路径放在现实生活里,人们常常用到的是关于交通路线规划,当你出去旅游的时候,如果没有直达的交通,或者是你想最大化的减少交通费总和价格,这个时候最短路径,图的权重等知识点就很好的应用上了!!
最短路径查找正如其名,其实就是找最优的算法,

教你快速掌握动态规划问题实现-详解

最短路径算法很多都是用于在图这个数据结构上,关于最短路径的计算的算法,主要有广度、深度优先算法(无权图),Dijkstra算法(无权图、带权图),这两种算法主要是单源最短路径,顶点间最短路径有佛洛伊算法(无权图、带权图)

代价函数

如何根据问题的形式和规模和优化的目标,设计合适的算法来进行优化。

问题分类

随机搜索算法:适用于就是问题求得的结果是没有变化规律可寻,找不到任何能够使代价下降的梯度和极小值点。
爬山法:适用于当前解和周围解是有变化规律的。首先以一个解作为标准值,每次寻找和这个解相近的解,如果相近的解有代价更小的解,则把代价更小的值作为新的标准值。如果这个解周围的解都比这个标准值大,则认为达到了局部极小值/极大值。
模拟退火算法:从问题的原始解开始,用一个变量代表温度,温度刚开始时非常高,后逐步减低。在每一次迭代期间,算法会随机选题解种某个数字,使其发生细微变化,而后计算该解的代价,关键地方在于计算该解的代价后,决定是否接受该解。如果新的成本更低,则新的题解就会变成当前题解。随着退火过程中温度不断下降,算法越来越不可以接受较差的解,直到最后,只接受更优的解。
遗传算法:随机生成一组解,成为一个种群,直接遗传(将当前种群中代价最小的一部分解,如40%进行直接遗传,传入下一代种群),变异(从题解中随机选取一个数字,对其进行微小、简单的改变)、交叉(选择最优解中两个解,将他们按照某种方式进行结合)。通过直接遗传、变异、交叉三种方法,从上一代种群中构建出了下一代种群。而后,这一过程重复进行,知道达到了指定的迭代次数,或者连续数代都没有改善种群,则整个过程就结束了。

不同搜素算法的特点

爬山算法(最速上升爬山法):
从搜索空间中随机产生邻近的点,从中选择对应解最优的个体,替换原来的个体,不断重复上述过程。因为只对“邻近”的点作比较,所以目光比较“短浅”,常常只能收敛到离开初始位置比较近的局部最优解上面。对于存在很多局部最优点的问题,通过一个简单的迭代找出全局最优解的机会非常渺茫。(在爬山法中,青蛙最有希望到达最靠近它出发点的山顶,但不能保证该山顶是珠穆朗玛峰,或者是一个非常高的山峰。因为一路上它只顾上坡,没有下坡。)

模拟退火算法:
这个方法来自金属热加工过程的启发。在金属热加工过程中,当金属的温度超过它的熔点(Melting Point)时,原子就会激烈地随机运动。与所有的其它的物理系统相类似,原子的这种运动趋向于寻找其能量的极小状态。在这个能量的变迁过程中,开始时。温度非常高,使得原子具有很高的能量。随着温度不断降低,金属逐渐冷却,金属中的原子的能量就越来越小,最后达到所有可能的最低点。利用模拟退火算法的时候,让算法从较大的跳跃开始,使到它有足够的“能量”逃离可能“路过”的局部最优解而不至于限制在其中,当它停在全局最优解附近的时候,逐渐的减小跳跃量,以便使其“落脚”到全局最优解上。(在模拟退火中,青蛙喝醉了,而且随机地大跳跃了很长时间。运气好的话,它从一个山峰跳过山谷,到了另外一个更高的山峰上。但最后,它渐渐清醒了并朝着它所在的峰顶跳去。)

遗传算法:
模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜索,并支持这些方向上的信息构成和交换。以面为单位的搜索,比以点为单位的搜索,更能发现全局最优解。(在遗传算法中,有很多青蛙,它们降落到喜玛拉雅山脉的任意地方。这些青蛙并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些青蛙,并希望存活下来的青蛙是多产的,在它们所处的地方生儿育女。)

启发式算法

分类

(1)正向推理:从初始状态出发向目标状态方向执行。-一般用于状态空间的搜索。
(2)反向推理:从目标状态出发向初始状态方向执行。-一般用于问题规约中。

启发性信息和评估函数

节点的重要性:选择节点要充分利用与问题有关的特征信息。搜索时选择重要性较高的节点,以利于求得最优解。
与被解问题的某些特征值有关的控制信息(如解的出现规律、解的结构特征等)称为搜索的启发信息。它反映在评估函数中,评估函数的作用是评估待扩展各系欸但在我呢提求解的价值,即评估节点的重要性。
评估函数:f(x)=g(x)+h(x),g(x)是从初始节点到一个节点x的实际代价,h(x)是这个节点x到目标节点的最优路径的估计代价,体现了问题的启发式信息,h(x)启发式函数。

使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

爬山法缺点

爬山法容易陷入一个局部极大值/极小值内,

参考文献链接

被动式相机自动对焦

算法学习笔记 (爬山法,模拟退火算法,遗传算法)
旅行商问题

搜索算法之爬山法总结和实现相关推荐

  1. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

  2. 集体智慧编程——优化搜索算法:爬山法,模拟退火算法,遗传算法-Python实现

    在优化问题中,有两个关键点 代价函数:确定问题的形式和规模之后,根据不同的问题,选择要优化的目标.如本文涉及的两个问题中,一个优化目标是使得航班选择最优,共计12个航班,要使得总的票价最少且每个人的等 ...

  3. 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

    Local search algorithms (局部搜索算法) 局部搜索算法 内存限制 局部搜索算法 示例:n-皇后 爬山算法 随机重启爬山 模拟退火算法 局部剪枝搜索 遗传算法 小结 局部搜索算法 ...

  4. 局部搜索(爬山法+模拟退火+遗传算法)

    写在前面 我们讨论过了无信息搜索和启发式搜索,最后讨论完这个局部搜索,这个搜索部分终于是要结束了,局部搜索不同于前两者,无信息搜索和启发式搜索都是可观察.确定的.已知的情况进行的搜索过程.局部搜索没有 ...

  5. 数学建模:模拟退火和遗传算法

    目录 启发式算法 (Heuristic Algorithm) 智能算法概述 模拟退火算法 遗传算法 启发式算法 (Heuristic Algorithm) 启发式算法 (Heuristic Algor ...

  6. java 遗传禁忌搜索_[转载]模拟退火,遗传算法,禁忌搜索,神经网络

    在工程实践中,经常会接触到一些比较"新颖"的算法或理论,比如模拟退火,遗传算法,禁忌搜索,神经网络等.这些算法或理论都有一些共同的特性(比如模拟自然过­程),通称为"智能 ...

  7. 人工智能基础复习2——问题求解

    03 Problem solving search 很多AI任务都可以形式化为搜索问题:寻找路径.过河问题.解谜题(魔方.数码问题).酒壶分水 Outline 问题求解智能体:基于目标Agent 问题 ...

  8. JAVA用爬山法解决八皇后问题_局部搜索算法.ppt

    局部搜索算法 人工智能原理第2章 搜索技术(下) 本章内容2.1 搜索与问题求解2.2 无信息搜索策略2.3 启发式搜索策略2.4 局部搜索算法2.5 约束满足问题2.6 博弈搜索参考书目附录 A*算 ...

  9. 爬山搜索法c语言代码,搜索算法--爬山法 (代码示例)

    以航班为例,从出发城市到目标城市区域内各段最远的航班 //1.程序入口 static void Main(string[] args) { Test.SampleOne sample = new Te ...

最新文章

  1. scikit-learn学习笔记(二)load_files加载自己的文件
  2. MySQL中使用CASE出错,如何在MySQL中正确使用CASE..WHEN
  3. 原生JavaScript轮播图效果实现
  4. 判断滚动条到底部的JS代码
  5. C++ 非类型的模板参数
  6. 我的第一个项目,二维码手机排队系统
  7. 阿里云服务器Centos7 安装 pycuda报错:Could not build wheels for pycuda which use PEP 517 and cannot be install
  8. 几种程序的反汇编代码入口特征
  9. java ajax_Ajax Java示例
  10. vue 动态scss变量,包含16进制转rgba,rgba转16进制
  11. 最方便的办法下载bilibili视频
  12. linux 查看文件内容的命令
  13. 2159: H.ly的小迷弟
  14. 北京地铁各条线路介绍
  15. 子域名收集 -- 提莫(teemo)
  16. 零基础怎么学习平面设计*
  17. EMMC和Nand傻傻分不清
  18. 数据库树形结构存储方法的选择
  19. Roblox剑九之剑一
  20. 971. 翻转二叉树以匹配先序遍历

热门文章

  1. 题目:用Verilog实现三分频电路,要求输出50%占空比。
  2. 趣头条的开屏广告有什么优势呢?适合哪些企业投放?
  3. python 读取asc文件_Python——文件读取与写入
  4. jump大乱斗维护服务器,Jump大乱斗常见问题解决方法_Jump大乱斗常见问题解决及按键设置方法_飞翔教程...
  5. 花18块买了腾讯的幻核 NFT,里面到底有什么?
  6. python3 分句
  7. workerman入门之GatewayWorker的使用
  8. 如何保存window10锁屏壁纸
  9. 大学数据库创建与查询实战——查询
  10. 【DB笔试面试608】在Oracle中,如何使用STA来生成SQL Profile?