爬山算法简介和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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
Python多线程实例教程
Sep 06 Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 Python
python搜索指定目录的方法
Apr 29 Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
详解C++编程中一元运算符的重载
Jan 19 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
python中提高pip install速度
Feb 14 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
Python经常使用的一些内置函数
Apr 11 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
文件上传的实现
2006/10/09 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
php阳历转农历优化版
2016/08/08 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
javascript读取RSS数据
2007/01/20 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python打印异常信息的两种实现方式
2019/12/24 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
2015元旦标语横幅
2014/12/09 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书