爬山算法简介和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求两个list的差集、交集与并集的方法
Nov 01 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
python传递参数方式小结
Apr 17 Python
Python多线程实现同步的四种方式
May 02 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
python的中异常处理机制
Aug 30 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 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数组
2006/10/09 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
PHP pear安装配置教程
2016/05/14 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
tab栏切换原理
2017/03/22 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
django 多对多表的创建和插入代码实现
2019/09/09 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
英国电气世界:Electrical World
2019/09/08 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
开办饭店创业计划书
2013/12/28 职场文书
班主任新年寄语
2014/04/04 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
2014年计生工作总结
2014/11/21 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书