爬山算法简介和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操作日期和时间的方法
Mar 11 Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
python判断windows系统是32位还是64位的方法
May 11 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
python实现感知器算法详解
Dec 19 Python
PyTorch学习笔记之回归实战
May 28 Python
Django中的Model操作表的实现
Jul 24 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
Aug 03 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 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中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
python中元类用法实例
2014/10/10 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
Python中print函数简单使用总结
2019/08/05 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
pyspark 随机森林的实现
2020/04/24 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
银行实习鉴定
2013/12/13 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
抽样调查项目计划书
2014/04/24 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
2015年计划生育责任书
2015/05/08 职场文书
房屋维修申请报告
2015/05/18 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
2016中秋节广告语
2016/01/28 职场文书
JavaScript流程控制(循环)
2021/12/06 Javascript
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL