爬山算法简介和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 16 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
Python编程实现使用线性回归预测数据
Dec 07 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
Python 忽略warning的输出方法
Oct 18 Python
python根据url地址下载小文件的实例
Dec 18 Python
Python常见数据类型转换操作示例
May 08 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
python中加背景音乐如何操作
Jul 19 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
PHP反射机制用法实例
2014/08/28 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
php判断访问IP的方法
2015/06/19 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
JS 作用域与作用域链详解
2015/04/07 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
python返回数组的索引实例
2019/11/28 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
什么是Python包的循环导入
2020/09/08 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
Python对excel的基本操作方法
2021/02/18 Python
医学类导师推荐信范文
2013/11/19 职场文书
运动会广播稿200字
2014/10/18 职场文书
社会实践活动总结
2015/02/05 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
gateway网关接口请求的校验方式
2021/07/15 Java/Android
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
python内置模块之上下文管理contextlib
2022/06/14 Python