爬山算法简介和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中xrange用法分析
Apr 15 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
多个应用共存的Django配置方法
May 30 Python
Python将多个list合并为1个list的方法
Jun 27 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
python全局变量引用与修改过程解析
Jan 07 Python
Django密码存储策略分析
Jan 09 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 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桌面中心(三) 修改数据库
2007/03/11 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
利用Psyco提升Python运行速度
2014/12/24 Python
Python实现简单状态框架的方法
2015/03/19 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
旅游管理毕业生自荐信范文
2014/03/19 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
学生保证书范文
2014/04/28 职场文书
法院答辩状格式
2015/05/22 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
python实现腾讯滑块验证码识别
2021/04/27 Python
Python echarts实现数据可视化实例详解
2022/03/03 Python