爬山算法简介和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实现随机密码字典生成器示例
Apr 09 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
python matplotlib画图实例代码分享
Dec 27 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
python3 re返回形式总结
Nov 20 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Python实现天气查询软件
Jun 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与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Python字典及字典基本操作方法详解
2018/01/30 Python
python 列表降维的实例讲解
2018/06/28 Python
python多线程分块读取文件
2019/08/29 Python
利用python汇总统计多张Excel
2020/09/22 Python
浅谈Python __init__.py的作用
2020/10/28 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
C面试题
2015/10/08 面试题
园林施工员岗位职责
2013/12/11 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技