爬山算法简介和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中的进程分支fork和exec详解
Apr 11 Python
在Django框架中运行Python应用全攻略
Jul 17 Python
Python实现发送QQ邮件的封装
Jul 14 Python
Python走楼梯问题解决方法示例
Jul 25 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
python实现按关键字筛选日志文件
Dec 24 Python
Python实现验证码识别
Jun 15 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
简单介绍Python的第三方库yaml
Jun 18 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
通过html表格发电子邮件
2006/10/09 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
JavaScript 乱码问题
2009/08/06 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python tkinter三种布局实例详解
2020/01/06 Python
深入理解Python 多线程
2020/06/16 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
应届生法律求职信
2013/10/22 职场文书
教师档案管理制度
2014/01/23 职场文书
中学生个人自我评价
2014/02/06 职场文书
计算机实训报告总结
2014/11/05 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL