这篇文章主要介绍了爬山算法,爬山法(climbing method)是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)然后用Python实现了这个算法,需要的朋友可以参考下

一、爬山法简介

爬山法(climbing method)是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。 假定所求问题有多个参数,我们在通过爬山法逐步获得最优解的过程中可以依次分别将某个参数的值增加或者减少一个单位。例如某个问题的解需要使用3个整数类型的参数x1、x2、x3,开始时将这三个参数设值为(2,2,-2),将x1增加/减少1,得到两个解(1,2,-2), (3, 2,-2);将x2增加/减少1,得到两个解(2,3, -2),(2,1, -2);将x3增加/减少1,得到两个解(2,2,-1),(2,2,-3),这样就得到了一个解集:
(2,2,-2), (1, 2,-2), (3, 2,-2), (2,3,-2), (2,1,-2), (2,2,-1), (2,2,-3)
从上面的解集中找到最优解,然后将这个最优解依据上面的方法再构造一个解集,再求最优解,就这样,直到前一次的最优解和后一次的最优解相同才结束“爬山”。

二、Python实例

设方程 y = x1+x2-x3,x1是区间[-2, 5]中的整数,x2是区间[2, 6]中的整数,x3是区间[-5, 2]中的整数。使用爬山法,找到使得y取值最小的解。

代码如下:

复制代码代码如下:

import random

def evaluate(x1, x2, x3):
    return x1+x2-x3

if __name__ == '__main__':
    x_range = [ [-2, 5], [2, 6], [-5, 2] ]
    best_sol = [random.randint(x_range[0][0], x_range[0][1]), 
           random.randint(x_range[1][0], x_range[1][1]), 
           random.randint(x_range[2][0], x_range[2][1])]

while True:
        best_evaluate = evaluate(best_sol[0], best_sol[1], best_sol[2])
        current_best_value = best_evaluate
        sols = [best_sol]

for i in xrange(len(best_sol)):
            if best_sol[i] > x_range[i][0]:
                sols.append(best_sol[0:i] + [best_sol[i]-1] + best_sol[i+1:])
            if best_sol[i] < x_range[i][1]:
                sols.append(best_sol[0:i] + [best_sol[i]+1] + best_sol[i+1:])
        print sols
        for s in sols:
            el = evaluate(s[0], s[1], s[2])
            if el < best_evaluate:
                best_sol = s
                best_evaluate = el
        if best_evaluate == current_best_value:
            break

print 'best sol:', current_best_value, best_sol
某次运行结果如下:

[[0, 5, 1], [-1, 5, 1], [1, 5, 1], [0, 4, 1], [0, 6, 1], [0, 5, 0], [0, 5, 2]]
[[-1, 5, 1], [-2, 5, 1], [0, 5, 1], [-1, 4, 1], [-1, 6, 1], [-1, 5, 0], [-1, 5, 2]]
[[-2, 5, 1], [-1, 5, 1], [-2, 4, 1], [-2, 6, 1], [-2, 5, 0], [-2, 5, 2]]
[[-2, 4, 1], [-1, 4, 1], [-2, 3, 1], [-2, 5, 1], [-2, 4, 0], [-2, 4, 2]]
[[-2, 3, 1], [-1, 3, 1], [-2, 2, 1], [-2, 4, 1], [-2, 3, 0], [-2, 3, 2]]
[[-2, 2, 1], [-1, 2, 1], [-2, 3, 1], [-2, 2, 0], [-2, 2, 2]]
[[-2, 2, 2], [-1, 2, 2], [-2, 3, 2], [-2, 2, 1]]
best sol: -2 [-2, 2, 2]

可以看到,最优解是-2,对应的x1、x2、x3分别取值-2、2、2。

三、如何找到全局最优

爬山法获取的最优解的可能是局部最优,如果要获得更好的解,多次使用爬山算法(需要从不同的初始解开始爬山),从多个局部最优解中找出最优解,而这个最优解也有可能是全局最优解。

另外,模拟退火算法也是一个试图找到全局最优解的算法。

python爬山算法相关推荐

  1. 爬山算法改进-探测器-python-全局最优解

    爬山算法改进 前言 一.爬山算法 二.算法改进-探测器 1.递归寻找局部最优值 2.探测器搜索全局最优值 总结 前言 爬山法(climbing method)是一种优化算法,它一般从一个随机某一点开始 ...

  2. python数圈算法_Python实现随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  3. 一文教会你Python 随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  4. 5分钟掌握 Python 随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  5. Python编写的数字拼图游戏(含爬山算法人机对战功能)

    数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标. 游戏代码由浙江温州永嘉县教师发展中心应根球老师 ...

  6. Python使用爬山算法寻找序列“最大值”

    爬山算法是人工智能算法的一种,特点在于局部择优,所以不一定能够得到全局最优解,尽管效率比较高.使用爬山算法寻找序列最大值的思路是:在能看得到的局部范围内寻找最大值,如果当前元素已经是最大值就结束,如果 ...

  7. python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...

    数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标. 游戏代码由浙江温州永嘉县教师发展中心应根球老师 ...

  8. python 新的随机爬山算法,一起交流~

    前言 最近在做聚焦算法,需要找到无参考图像中图像质量最好的,其中用到了随机爬山算法, 最开始采用三轮爬山,三轮步长不同,寻找最优解,但是发现精度不够,有的时候因为步长原因会跳过最佳点 后采用新的随机爬 ...

  9. 数学建模笔记——最优值之我见(爬山算法,模拟退火

    目录 爬山问题 爬山算法的流程 爬山算法优缺点 先提物理退火 关于模拟退火 1.1总论 1.2主要流程 1.2.1产生初始解 1.2.2扰动产生新解 1.2.3计算 1.2.4判断 1.2.4循环 2 ...

最新文章

  1. 微信确认出Bug,目前已全部恢复
  2. Delphi中的Rtti函数
  3. CG CTF RE ReadAsm2
  4. 1123:图像相似度
  5. unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zi
  6. 作者:程文亮(1989-),男,华东师范大学数据科学与工程研究院硕士生
  7. 我的内核学习笔记16:海思Hi3516平台PWM使用记录
  8. hduoj-----(2896)病毒侵袭(ac自动机)
  9. 《程序员修炼之道》笔记(五)
  10. mysql源码安装linux,Linux下mysql源码安装笔记
  11. word文档软回车替换硬回车
  12. excel打开密码忘记了_Excel工作表保护密码忘记了怎么办?这一招轻松去除密码...
  13. 晶体管介绍工作原理与历史
  14. 越王勾践剑“千年不腐”传奇
  15. 20190927CF训练
  16. FPGA-Quartus II 13.1画逻辑门电路图的详细步骤
  17. Excel导入,一般会遇到的一些问题
  18. Android网页广告植入规避方案
  19. 车载调频广播电台移动发射系统应用
  20. SpringCloud之消息总线

热门文章

  1. 图文解说Quartus II使用入门
  2. Cannot resolve com.oracle:ojdbc6:11.2.0.3
  3. 经典CNN结构论文阅读:AlexNet
  4. let和const与var的区别
  5. 对盖得排行APP内容方面的一些看法
  6. 温度指示报警电路设计报告
  7. MySQL数据库实操教程(23)——数据库备份与还原
  8. 利用递推公式的特征方程求解通项公式
  9. “程序设计与算法训练”课程设计:“BP神经网络的实现”(C++类封装实现)
  10. 查找python安装路径