爬山算法简介和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实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
Python简单生成8位随机密码的方法
May 24 Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
python字典的常用方法总结
Jul 31 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Django中的FBV和CBV用法详解
Sep 15 Python
python代码区分大小写吗
Jun 17 Python
基于python实现音乐播放器代码实例
Jul 01 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 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
Js 中debug方式
2010/02/07 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
jquery选择器使用详解
2014/04/08 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
python的三目运算符和not in运算符使用示例
2014/03/03 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
动态密码技术
2012/10/18 面试题
成品仓管员工作职责
2013/12/29 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
岗位廉政承诺书
2014/03/27 职场文书
葬礼司仪主持词
2014/03/31 职场文书
工作评语大全
2014/04/26 职场文书
工地质量标语
2014/06/12 职场文书
计划生育证明书写要求
2014/09/17 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书