爬山算法简介和Python实现实例


Posted in Python onApril 26, 2014

一、爬山法简介

爬山法(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 相关文章推荐
python 从远程服务器下载东西的代码
Feb 10 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Python实现线程池代码分享
Jun 21 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
Mar 11 Python
Python装饰器的执行过程实例分析
Jun 04 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
python删除某个目录文件夹的方法
May 26 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 #Python
python实现的二叉树算法和kmp算法实例
Apr 25 #Python
python中的__init__ 、__new__、__call__小结
Apr 25 #Python
Python yield 小结和实例
Apr 25 #Python
python计数排序和基数排序算法实例
Apr 25 #Python
python处理圆角图片、圆形图片的例子
Apr 25 #Python
python实现的阳历转阴历(农历)算法
Apr 25 #Python
You might like
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
js密码强度校验
2015/11/10 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
如何提高JDBC的性能
2013/04/30 面试题
简述DNS进行域名解析的过程
2013/12/02 面试题
校园十大歌手策划书
2014/02/01 职场文书
党员承诺书范文
2014/05/19 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
阿凡达观后感
2015/06/10 职场文书
2015年暑假生活总结
2015/07/13 职场文书
交通安全主题班会
2015/08/12 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
导游词之临安白水涧
2019/11/05 职场文书
python基础之文件处理知识总结
2021/05/23 Python
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS