优化方法-爬山法
来源:互联网 发布:nginx处理空header 编辑:程序博客网 时间:2024/06/10 07:11
爬山法是一种局部最优的算法(本质上属于贪心法),也属于启发式的方法,它一般只能得到局部最优解。当优化的问题的局部最优解即为全局最优解时可以用此方法来求最优问题,否则可以考虑多次爬山法或者其他的方法如遗传算法和模拟退火法。
一、原理
爬山法一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。 假定所求问题有多个参数,我们在通过爬山法逐步获得最优解的过程中可以依次分别将某个参数的值增加或者减少一个单位。例如某个问题的解需要使用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)
从上面的解集中找到最优解,然后将这个最优解依据上面的方法再构造一个解集,再求最优解,就这样,直到前一次的最优解和后一次的最优解相同才结束“爬山”。
二、代码
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。
三、如何找到全局最优
爬山法获取的最优解的可能是局部最优,如果要获得更好的解,多次使用爬山算法(需要从不同的初始解开始爬山),从多个局部最优解中找出最优解,而这个最优解也有可能是全局最优解。
另外,模拟退火算法也是一个试图找到全局最优解的算法。
0 0
- 优化方法-爬山法
- 优化算法-爬山法和模拟退火
- 【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法
- 【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法
- 机器学习之优化算法——爬山法
- 搜索算法:爬山法
- 爬山法 NOIP采药
- 爬山
- 爬山
- 爬山
- 爬山
- 爬山
- 爬山
- 爬山
- 爬山
- 优化算法 - 爬山,模拟退火算法
- 搜索法之爬山法
- 集体智慧编程——优化搜索算法:爬山法,模拟退火算法,遗传算法-Python实现
- 黑马程序员——Java基础——集合(二)
- CXml - A Wrapping Class for MSXML 3.0/4.0/5.0/6.0
- Linux makefile 教程
- Surrounded Regions
- mysql安装(亲自安装过)
- 优化方法-爬山法
- 解决github push错误The requested URL returned error: 403 Forbidden while accessing
- KVO
- Python中的random模块
- mongoDB 基本操作,增删改查
- 机器学习笔记_数学基础_4-线性代数
- C++基础::shared_ptr 编程细节(一)
- 【Unity开发】NGUI,UGUI按钮监听的动态添加与移除
- Linux图片处理工具-GraphicsMagick