随机优化算法–爬山法VS模拟退火算法

article/2025/11/10 11:22:08

随机优化算法,由于开始和过程都是随机的数值,所以每次产生的结果都不一样。但大致收敛方向是一致的。 
爬山法是一种局部最优的算法(本质上属于贪心法),也属于启发式的方法,它一般只能得到局部最优解。采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。当优化的问题的局部最优解即为全局最优解时可以用此方法来求最优问题,否则可以考虑多次爬山法或者其他的方法如遗传算法和模拟退火法。

一、爬山算法

(1)爬山算法即是模拟爬山的过程,随机选择一个位置爬山,每次朝着更高的方向移动,直到到达山顶,即每次都在临近的空间中选择最优解作为 当前解,直到局部最优解。这样算法会陷入局部最优解,能否得到全局 最优解取决于初始点的位置。初始点若选择在全局最优解附近,则就可能得到全局最优解。

(2)爬山过程

function HILL-CLIMBING(problem) returns a state that is a local maximum
inputs: problem, a problem
local variables: current, a node
neighbor, a node
current <- MAKE-NODE(INITIAL-STATE[problem])
loop do
neighbor <- a highest-valued successor of current
if VALUE[neighbor]<= VALUE[current] then return STATE[current]
current <- neighbor
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

算法解释: 
从当前的节点开始,和周围的邻居节点的值进行比较。 如果当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点);反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的。如此循环直到达到最高点。

(3)存在的缺点 
爬山法一般有下面3个问题:

(a)局部最大: 局部最大一般比状态空间中全局最大要小,一旦到达了局部最大,算法就会停止,即便该答案可能并不能让人满意。

(b)平顶(Plateau): 
平顶是状态空间中评估函数值基本不变的一个区域,在某一局部点周围f(x)为常量。一旦搜索到达了一个平顶,搜索就无法确定要搜索的最佳方向,会产生随机走动,这使得搜索效率降低。

(c)山脊(Ridge): 
山脊可能具有陡峭的斜面,所以搜索可以比较容易地到达山脊的顶部,但是山脊的顶部到山峰之间可能倾斜得很平缓,搜索的前进步伐会很小。

在每种情况中,算法都会到达一个点,使得算法无法继续前进。如果出现这种情况,可以从另外一个点重新启动该算法,这称为随机重启爬山法。爬山法是否成功和状态空间“表面”的形状有很大的关系:如果只有很少的局部最大,随机重启爬山法将会很快地找到一个比较好的解答。如果该问题是NP完全的,则该算法不可能好于指数时间,这是因为一定具有指数数量的局部最大值。然而,通常经过比较少的步骤,爬山法一般就可以得到比较合理的解答。

(4) 实验验证 
给定280个平面点(固定数据,方便与模拟退火法对比),运用爬山法进行找出“最优”路径: 
爬山法算法求全局最短路径(数字代表第几个点) 
最合适的路径为: [274, 226, 234, 213, 214, 247, 263, 19, 157, 23, 27, 146, 175, 192, 217, 233, 183, 86, 117, 62, 31, 152, 273, 239, 232, 0, 245, 16, 6, 269, 45, 39, 104, 170, 102, 124, 126, 209, 228, 272, 111, 87, 63, 168, 148, 180, 116, 84, 58, 108, 267, 271, 10, 5, 25, 71, 159, 156, 223, 193, 262, 261, 276, 277, 2, 255, 278, 7, 196, 24, 123, 174, 107, 57, 33, 155, 18, 14, 216, 237, 199, 268, 115, 158, 122, 113, 181, 201, 197, 127, 134, 144, 163, 91, 136, 9, 240, 260, 164, 96, 172, 101, 93, 171, 89, 177, 176, 88, 179, 182, 162, 161, 206, 140, 112, 114, 43, 160, 77, 125, 131, 56, 59, 266, 251, 78, 70, 74, 121, 138, 198, 173, 73, 80, 42, 61, 151, 76, 169, 118, 30, 29, 100, 187, 109, 83, 55, 103, 99, 142, 1, 22, 279, 218, 60, 41, 38, 143, 189, 259, 44, 75, 200, 274, 20, 257, 195, 243, 222, 225, 15, 252, 229, 205, 265, 145, 141, 186, 94, 17, 8, 137, 133, 178, 207, 224, 248, 147, 215, 53, 82, 98, 69, 184, 120, 95, 106, 253, 139, 26, 128, 135, 275, 242, 185, 130, 28, 150, 149, 3, 46, 49, 153, 202, 235, 110, 79, 129, 191, 210, 220, 65, 68, 37, 154, 256, 246, 230, 12, 85, 67, 203, 231, 194, 238, 13, 119, 36, 54, 35, 21, 270, 105, 92, 52, 132, 81, 165, 47, 50, 211, 249, 250, 11, 258, 64, 90, 97, 188, 212, 221, 166, 244, 4, 264, 167, 51, 236, 241, 34, 190, 208, 32, 48, 72, 40, 66, 204, 219, 227] 
路径节点个数: 280 
最小花费为: 23486.37 
尝试次数: 280

这里写图片描述

二、模拟退火法

(1)简介: 模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。

(2)过程: 
模拟退火算法的模型 
1模拟退火算法可以分解为解空间、目标函数和初始解三部分。 
2模拟退火的基本思想:

(1) 初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点),每个T值的迭代次数L
(2) 对k=1, …, L做第(3)至第6步:
(3) 产生新解S′
(4) 计算增量ΔT=C(S′)-C(S),其中C(S)为评价函数
(5) 若ΔT<0则接受S′作为新的当前解,否则以概率exp(-ΔT/T)接受S′作为新的当前解.
(6) 如果满足终止条件则输出当前解作为最优解,结束程序。
终止条件通常取为连续若干个新解都没有被接受时终止算法。
(7) T逐渐减少,且T->0,然后转第2步。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(3)优缺点: 
优点是局部搜索能力强,运行时间较短; 
缺点是全局搜索能力差,容易受参数的影响。

(4) 实验验证 
给定280个平面点(固定数据,方便与爬山法对比),运用爬山法进行找出“最优”路径: 
模拟退火算法查找最优路径: 
最合适的路径为: [217, 174, 244, 73, 234, 42, 112, 178, 261, 48, 146, 253, 87, 136, 267, 262, 255, 260, 257, 254, 208, 247, 248, 246, 205, 206, 210, 213, 212, 224, 218, 221, 215, 216, 214, 204, 256, 252, 203, 198, 192, 190, 191, 194, 143, 196, 138, 144, 148, 140, 139, 269, 270, 9, 17, 131, 132, 135, 265, 137, 264, 266, 151, 177, 150, 156, 153, 152, 119, 159, 173, 169, 107, 110, 86, 115, 66, 63, 65, 81, 89, 99, 97, 75, 77, 74, 85, 88, 79, 96, 98, 100, 167, 164, 165, 170, 171, 111, 80, 83, 116, 114, 59, 55, 52, 56, 57, 58, 44, 38, 45, 37, 51, 49, 54, 53, 47, 46, 28, 128, 20, 121, 122, 123, 41, 34, 32, 35, 50, 40, 29, 127, 129, 268, 18, 13, 22, 23, 12, 14, 272, 8, 6, 26, 25, 31, 30, 126, 157, 183, 181, 162, 160, 172, 105, 106, 101, 91, 90, 95, 94, 76, 166, 103, 104, 102, 82, 62, 43, 130, 125, 24, 271, 133, 147, 197, 199, 211, 227, 229, 245, 240, 238, 232, 233, 231, 209, 251, 259, 243, 250, 230, 228, 207, 249, 5, 4, 241, 263, 15, 134, 175, 176, 158, 155, 179, 163, 113, 108, 117, 109, 84, 182, 201, 142, 149, 273, 7, 279, 1, 237, 242, 278, 219, 258, 274, 141, 184, 202, 222, 235, 276, 16, 27, 19, 275, 11, 0, 185, 186, 120, 21, 154, 60, 71, 69, 78, 70, 36, 67, 68, 189, 193, 187, 188, 180, 223, 195, 10, 2, 220, 118, 39, 72, 200, 3, 92, 61, 145, 93, 64, 168, 161, 124, 33, 277, 239, 236, 226, 225] 
路径节点个数: 280 
最小花费为:  
尝试次数: 280 
可以发现,对于相同的数据,路径花费模拟退火(12589.76)明显比爬山法(23486.37)要小。

这里写图片描述

三、附件

https://pan.baidu.com/s/1eT5i0T0 
包含上述280个点数据、爬山算法、模拟退火算法的实现。 
本人 win10系统、内存8G、intel双核i5使用Pycharm IDE、Python 2.7.6版本。结果如上述,


http://chatgpt.dhexx.cn/article/7XynHDNG.shtml

相关文章

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

C语言局部算法求解八皇后问题 写在前面八皇后问题及局部搜索算法爬山法&#xff08;hill-climbing searching)算法介绍代码实现 退火法&#xff08;simulated annealing)算法介绍代码实现 遗传算法算法介绍代码实现 写在前面 该篇博客改自https://blog.csdn.net/chenxz_/artic…

八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现

源起 人工智能的第二次作业课后的某题要求对八皇后问题和八数码问题分别用最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法来实现,并且分析他们的性能。 分析 我们发现要求实现的各个算法是有共同点的,比如,八皇后问题相关算法拥有相同的状态空间,每个算法都有…

【人工智能】首选爬山法+随机交换法实现N皇后问题求解(C语言)

1.原理 爬山法&#xff08;Hill Climbing&#xff09;是一种局部搜索算法。局部搜索算法不关心求解目标的路径&#xff0c;只要求找到符合要求的解&#xff0c;通常对最优化问题十分有用。爬山法使用启发式函数&#xff08;或代价评估函数&#xff09;确定“标高”&#xff0c…

【学习笔记】我命由天不由我之随机化庇佑 —— 爬山法 和 模拟退火法

以下均假设最优解是在最低点。 爬山法 爬山算法是一种局部择优的方法&#xff0c;采用启发式方法&#xff0c;是对深度优先搜索的一种改进&#xff0c;它利用反馈信息帮助生成解的决策。 直白地讲&#xff0c;就是当目前无法直接到达最优解&#xff0c;但是可以判断两个解哪…

人工智能-爬山法解决八数码问题-python源码

问题描述&#xff1a; 在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。这些数码可以在棋盘上移动&#xff0c;其移动规则是&#xff1a;与空格相邻的数码方格可以移入空格。现在的问题是&#xff1a;对于指定的初始棋局和目标棋局&#xff0c…

人工智能-爬山法解决八皇后问题-python源码

问题简述&#xff1a; 八皇后问题&#xff0c;一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一…

树的搜索问题1(深度优先、广度优先,爬山法和best-first)

前言 我们在解决问题中经常使用到的数据结构一定少不了树&#xff0c;在数据结构这一大块中&#xff0c;我们对每一个结构都会讲各种形形色色的操作&#xff0c;比如栈的压栈出栈&#xff0c;树的各种遍历&#xff0c;但其实数据结构最重要的操作其实是搜索。如果我们不知道链…

TSP问题解决:模拟退火、贪心法、爬山法,Python实现

TSP问题解决&#xff1a;模拟退火、贪心法、爬山法&#xff0c;Python实现这里写目录标题 一、TSP问题二、简单介绍&#xff1a;贪心法、爬山法、模拟退火三、python代码实现四、分别用这三种方法得出结果&#xff0c;进行比较 一、TSP问题 1、TSP问题描述 简单来说&#xff0…

爬山法实现 八皇后问题 (Python 实现)

本文主要简单阐述爬山法的基本算法思想&#xff0c;并给出用此算法实现八皇后问题详细过程 最基本的爬上搜索算法表示&#xff1a;(节选自《人工智能》第二版)&#xff1a; function HILL-CLIMBING(problem) return a state thate is a locak maximum inputs: problem …

爬山法求解八皇后问题的全部解法

爬山法求解八皇后问题的全部解法 程序的概要设计思想初始状态冲突函数寻找邻居状态寻找全部解集 程序主要函数的作用运行结果截图Python源代码 程序的概要设计思想 爬山算法是一种局部贪婪算法&#xff0c;每次更新一次状态&#xff0c;都对相邻状态的冲突状态进行排序&#x…

Python启发式算法中爬山法的讲解及解方程问题实战(超详细 附源码)

一、启发式算法 还有一类重要的迭代法&#xff0c;它的迭代关系式不依赖问题的数学性能&#xff0c;而是受某种自然现象的启发而得到&#xff0c;称为启发式算法&#xff08;Heuristic Algorithm&#xff09;&#xff0c;如爬山法、遗传算法、模拟退火算法、蚁群算法等。 启发…

人工智能:爬山法、随机重启爬山法、模拟退火算法、遗传算法、启发式搜索方法解决八数码和八皇后问题

摘要 本文主要分为两个部分&#xff0c;分别采用实验对比对不同的方法进行分析。第一&#xff0c;以八数码问题和八皇后问题为例&#xff0c;对比爬山法&#xff0c;随机重启爬山法&#xff0c;模拟退火算法&#xff0c;遗传算法的搜索性能。第二&#xff0c;以八数码问题为例…

进化优化算法--第二章:爬山法

算法2.1&#xff1a; 最快上升爬山法 x0 <- 随机生成的个体 while not ( 终止准则)计算x0的适应度f(x0)For 每一个解的特征 q1,2,,...nxq <- x0 用一个随机变异替换xq的第q个特征计算xq的适应度f(xq)获取下一个更优的解:寻找使f(xq)最大的xq, 令其等于x, x <- argma…

Python:爬山法/随机重启爬山法/允许侧移的爬山法解决八皇后问题

文章目录 1 八皇后问题2 程序代码2.1 程序12.2 程序22.3 程序32.3.1 爬山法2.3.2 随机重启爬山法2.3.3 允许皇后侧移的爬山法 3 评价 1 八皇后问题 有一个8乘8的棋盘&#xff0c;现在要将八个皇后放到棋盘上&#xff0c;满足&#xff1a;对于每一个皇后&#xff0c;在自己所在…

爬山法和模拟退火

文章目录 前言一、爬山法1.算法步骤2.算法局限性 二、模拟退火1.算法步骤2.注意点3.例题求费马点保龄球均分数据 总结 前言 爬山法和模拟退火都为随机化算法&#xff0c;考场想不到正解时可用来骗分&#xff0c;通常效果较好。模拟退火是基于爬山法的优化。 一、爬山法 爬山法是…

搜索算法——爬山法

不断更新中...... 一、 爬山算法&#xff1a;爬山算法是一种简单的贪心搜索算法&#xff0c;该算法每次从当前位置的临近空间中选择一个最优解作为当前解&#xff0c;直到达到一个局部最优解。爬山算法可以类比成一个有失忆的人在浓雾中爬山。这里就揭示了爬山算法的两个问题…

搜索 —— 启发式搜索 —— 爬山法

【概述】 爬山法&#xff08;Hill Climbing&#xff0c;HC&#xff09;是一种局部择优的贪心搜索算法&#xff0c;其本质上是梯度下降法。 该算法每次从当前的节点开始&#xff0c;与周围的邻接点进行比较&#xff1a; 若当前节点是最大的&#xff0c;那么返回当前节点&…

Linux:快速查看IP地址及修改IP地址

导读Linux下如何快速查看IP地址及修改IP地址&#xff0c;有一个方法供参考 查ip 方法/步骤1: 打开linux操作系统在进入到界面 方法/步骤2: 在桌面右击打开终端。 方法/步骤3: 终端里输入ifconfig -a命令在回车键 方法/步骤4: 如下图可以看到了ip地址。 修改ip 方法/…

Linux Ubuntu查看IP信息的两种方式Ubuntu中检查你的 IP 地址

论使用什么系统&#xff0c;都有用到ip地址的时候&#xff0c;习惯了windows系统的人很容易就能查找出系统的ip&#xff0c;但是在linux系统如何查看ip呢&#xff1f;作为Linux新手&#xff0c;以Ubuntu的使用经验&#xff0c;我知道Ubuntu查看IP有两种方式。 第一种是在终端中…

Linux查询出口IP

查询的方式是通过Linux的curl访问查询ip的网站进行查询 具体步骤&#xff1a; 1.查询查询ip网站的ip 2.配置Linux的hosts文件 在/etc中的hosts文件增加上面的域名和ip&#xff08;注意&#xff1a;是ifconfig&#xff0c;不是ipconfig&#xff09; 3.在ssh命令下执行 curl ifc…