爬山算法简介和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 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
Python缩进和冒号详解
Jun 01 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
Python numpy数组转置与轴变换
Nov 15 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
Python文件读写w+和r+区别解析
Mar 26 Python
parser.add_argument中的action使用
Apr 20 Python
python 瀑布线指标编写实例
Jun 03 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 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
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php 的反射详解及示例代码
2016/08/25 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
python插入数据到列表的方法
2015/04/30 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
Python如何重新加载模块
2020/07/29 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
搞笑爱情保证书
2014/04/29 职场文书
经典毕业生求职信
2014/07/12 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
python实现双链表
2022/05/25 Python