爬山算法简介和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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
Swift中的协议(protocol)学习教程
Jul 08 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python将多个list合并为1个list的方法
Jun 27 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
在Django中实现添加user到group并查看
Nov 18 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
python和js交互调用的方法
Jun 23 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
Python学习入门之区块链详解
2017/07/25 Python
python3设计模式之简单工厂模式
2017/10/17 Python
Python单元和文档测试实例详解
2019/04/11 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
高中生自我评价个人范文
2013/11/09 职场文书
美德好少年事迹材料
2014/01/19 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
SQL Server内存机制浅探
2022/04/06 SQL Server