爬山算法简介和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中偏函数partial用法实例分析
Jul 08 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
教你学会使用Python正则表达式
Sep 07 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python实现控制COM口的示例
Jul 03 Python
Django的性能优化实现解析
Jul 30 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
python如何进行基准测试
Apr 26 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+ajax实现无刷新分页的方法
2014/11/04 PHP
javascript中对对层的控制
2006/12/29 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
使用Python写个小监控
2016/01/27 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
浅谈Python协程
2020/06/17 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
生物专业个人自荐信范文
2013/11/29 职场文书
调解员先进事迹材料
2014/02/07 职场文书
企业办公室岗位职责
2014/03/12 职场文书
委托书样本
2014/04/02 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
党员民主评议个人总结
2014/10/20 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis