爬山算法改进

  • 前言
  • 一、爬山算法
  • 二、算法改进-探测器
    • 1.递归寻找局部最优值
    • 2.探测器搜索全局最优值
  • 总结

前言

爬山法(climbing method)是一种优化算法,它一般从一个随机某一点开始,然后逐步计算每一点的函数值直到找到一个最优解(局部最优),所以它是一种局部搜索算法,这意味着它适用于单峰优化问题或在应用全局优化算法后使用。

爬山法有以下3个缺点:
(1)局部最优: 该算法的性质决定了其极容易陷入局部最优,且很难跳出;
(2)平顶:
平顶是状态空间中评估函数值基本不变的一个区域,在某一局部点周围F(x)为常量。一旦搜索到达了一个平顶,搜索就无法确定要搜索的最佳方向,会产生随机走动,这使得搜索效率降低。
(3)山脊:
山脊可能具有陡峭的斜面,所以搜索可以比较容易地到达山脊的顶部,但是山脊的顶部到山峰之间可能倾斜得很平缓,搜索的前进步伐会很小。

针对上述问题,如果要获得更好的解,传统做法是多次使用爬山算法(需要从不同的初始解开始爬山),从多个局部最优解中找出最优解,而这个最优解有可能是全局最优解。

文章对经典爬山算法做出了改进,使该算法不需产生多个随机初始解进行”爬山“,只需一次“爬山”就能找到最高的山峰。


提示:以下是本篇文章正文内容,下面案例可供参考

一、爬山算法

爬山算法是模拟爬山的过程,随机选择一个位置爬山,每次朝着更高的方向移动,直到到达山顶,即每次都在临近的空间中选择最优解作为当前解,直到局部最优解。这样算法会陷入局部最优解,能否得到全局最优解取决于初始点的位置。初始点若选择在全局最优解附近,则就可能得到全局最优解。
算法描述:
从当前的节点开始,和周围的邻居节点的值进行比较。 如果当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点);反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的。如此循环直到达到最高点。

算法实现:
后期更新>>>

二、算法改进-探测器

这里做个比喻,将经典爬山算法比作随机在山上的随机点放m只蚂蚁,蚂蚁根据当前位置(x*)与其相距L个单位长度范围内点对应的高度(x*)来选择前进与否,若以当前位置(x*)为圆心,L为半径上的各点对应的高度F(x*+L)均小于当前点(x*)的高度F(x*),则将该位置视为最优值(局部),蚂蚁不再移动。否则,蚂蚁继续向临近的更高点继续前进,直到它所处的位置再也没有比它更高的点。m只蚂蚁经过这样的爬山过程后,都会找到一个最高点(局部),即共找到m个最高点(局部),这m个位置中的最大值有可能是全局最优值(蚂蚁数越多,找到全局最优值的概率越大)。

文章对传统爬山算法做了改进,以使其能一次性找到全局最优值,同时该算法不会陷于平原(某点(x^)领域内高度f(x)为常数)。
算法描述:
首先对蚂蚁赋能:①蚂蚁有探测器功能(类似雷达);②蚂蚁会飞。
步骤一:在经典爬山算法的基础上,蚂蚁爬向山顶(局部最优值):
步骤二:探测远方有没有比当前位置更高的点,若有,飞到更高的位置,并进行步骤一。若无,此点为全局最优值。
同样对于平原问题,当蚂蚁位于平面时,探测周围有无更高的点,若有,前更高点爬去并进行步骤一和步骤二,直到爬到最高点。
算法示意图:

1.递归寻找局部最优值

爬山法代码如下(示例):

def cycle(i,r,R2,T2):if(i>=5 or i<=-5):if(i>5):obj.append(i-r)ax2.scatter(i-r,fun(i-r))returnif(i<-5):obj.append(i+r)ax2.scatter(i+r,fun(i+r))return  #超出定义域退出循环y_i=fun(i)ax1.scatter(i,y_i)plt.pause(0.02)if(fun(i+r)<=y_i and fun(i-r)<=y_i):radiation(i,r,R2,T2)
##      ax1.scatter(i,fun(i))elif(fun(i+r)<y_i and fun(i-r)>=y_i):
##      r=abs(r+0.02)cycle(i-r,r,R2,T2)#从x轴负方向寻找最优值elif(fun(i+r)>=y_i and fun(i-r)<y_i):
##      r+=0.02#从x轴正向寻找最优值cycle(i+r,r,R2,T2)else: #如果当前点位于谷底,双向探测  cycle(i+r,r,R2,T2)cycle(i-r,r,R2,T2)#从x轴负方向寻找最优值return

2.探测器搜索全局最优值

代码如下(示例):

def radiation(i,R1,R2,T2):# 望远函数,i目前的局部最优位置  R:辐射半径,T:发射次数y_i=fun(i)t_2=0r2=R2i_r=i+r2i_l=i-r2while True:if(i_r>5 or i_l<-5):obj.append(i)ax2.scatter(i,fun(i))breakif t_2==T2 :obj.append(i)ax2.scatter(i,fun(i))breaky_f=fun(i_r)y_b=fun(i_l)if(y_f>y_i and y_b>y_i):cycle(i_r,R1,R2,T2)cycle(i_l,R1,R2,T2)breakelif(y_f>y_i and y_b<y_i):cycle(i_r,R1,R2,T2)breakelif(y_f<y_i and y_b>y_i):cycle(i_l,R1,R2,T2)breakelse:t_2=t_2+1i_r=i_r+r2i_l=i_l-r2return

调用改进算法寻找最优值。

def rad_cyc(R_1,R_2,T_1,T_2,*objection):t_1=0while (t_1<T_1):point=round(np.random.uniform(-5,5),5)r=R_1cycle(point,r,R_2,T_2)t_1+=1print(obj)ax2.text(2,2,'number:%d'%len(obj))plt.show()
rad_cyc(0.05,0.1,5,30,obj)

运行结果:

左图为蚂蚁前进路径点,右图为最终位置。由于代码有未知BUG,有时结果会陷于局部最优处,本人水平有限,正在处理中>>>
全部代码:

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(-5,5,0.01)
y=[]
obj=[]#用于存放局部最优值
y=np.cos(x)+0.5*x+np.sin(x**2)
def fun(x):##目标函数return np.cos(x)+0.5*x+np.sin(x**2)
f=plt.figure()
ax1=plt.subplot(1,2,1)
ax2=plt.subplot(1,2,2)
ax1.plot(x,y)
ax2.plot(x,y)def radiation(i,R1,R2,T2):# 望远函数,i目前的局部最优位置  R:辐射半径,T:发射次数y_i=fun(i)t_2=0r2=R2i_r=i+r2i_l=i-r2while True:if(i_r>5 or i_l<-5):obj.append(i)ax2.scatter(i,fun(i))breakif t_2==T2 :obj.append(i)ax2.scatter(i,fun(i))breaky_f=fun(i_r)y_b=fun(i_l)if(y_f>y_i and y_b>y_i):cycle(i_r,R1,R2,T2)cycle(i_l,R1,R2,T2)breakelif(y_f>y_i and y_b<y_i):cycle(i_r,R1,R2,T2)breakelif(y_f<y_i and y_b>y_i):cycle(i_l,R1,R2,T2)breakelse:t_2=t_2+1i_r=i_r+r2i_l=i_l-r2return
def cycle(i,r,R2,T2):if(i>=5 or i<=-5):if(i>5):obj.append(i-r)ax2.scatter(i-r,fun(i-r))returnif(i<-5):obj.append(i+r)ax2.scatter(i+r,fun(i+r))return  #超出定义域退出循环y_i=fun(i)ax1.scatter(i,y_i)plt.pause(0.02)if(fun(i+r)<=y_i and fun(i-r)<=y_i):radiation(i,r,R2,T2)
##      ax1.scatter(i,fun(i))elif(fun(i+r)<y_i and fun(i-r)>=y_i):
##      r=abs(r+0.02)#探测步长,逐次增大cycle(i-r,r,R2,T2)#从x轴负方向寻找最优值elif(fun(i+r)>=y_i and fun(i-r)<y_i):
##      r+=0.02#从x轴正向寻找最优值cycle(i+r,r,R2,T2)else: #如果探测器位于谷底,双向探测  cycle(i+r,r,R2,T2)cycle(i-r,r,R2,T2)#从x轴负方向寻找最优值return
def rad_cyc(R_1,R_2,T_1,T_2,*objection):t_1=0while (t_1<T_1):#设置迭代次数,即探测器数point=round(np.random.uniform(-5,5),5)r=R_1#探测半斤归原值cycle(point,r,R_2,T_2)t_1+=1print(obj)ax2.text(2,2,'number:%d'%len(obj))plt.show()
rad_cyc(0.05,0.1,5,30,obj)

针对有平原的情况,另外设置目标函数:

def fun(x):if(x>=-5 and x<-1):return -(x+2)**2+2elif(x>=-1 and x<=1):return 1else: return -2*(x-2)**2+3

运行结果:


代码有漏洞,正在处理中,解决完后会及时更新>>>


总结

该改进爬山算法能有效避免其陷于局部最优和平原,对于山脊迭代速度慢的问题,可以使用变步长来代替常量步长以提高迭代速度。


参考:

1.python爬山算法
2.Python实现随机爬山算法
3.爬山算法
4.随机优化算法—爬山法VS模拟退火法

爬山算法改进-探测器-python-全局最优解相关推荐

  1. 爬山算法改进粒子群求解测试测试函数shubert,测试函数的100种优化方法之14

    爬山算法粒子群求解测试测试函数 shubert函数属于周期性多峰函数,如图1所示拥有多个全局最优值,如图二所示在一个周期内只有一个全局最优值,局部最优解较多,适合测试算法的收敛性能,粒子群算法是一种收 ...

  2. K-means原理与算法改进及其python实现

    K-means入门学习 一.算法概述 二.算法思想 三.算法实现步骤 四.算法图解 五.算法优缺点 六.k-means算法python实现 6.1 sklearn聚类 6.2 各省份消费数据聚类 6. ...

  3. 遗传算法与爬山算法简介_遗传算法简介

    遗传算法与爬山算法简介 Genetic Algorithms (GAs) are a part of Evolutionary Computing (EC), which is a rapidly g ...

  4. 数学建模笔记——最优值之我见(爬山算法,模拟退火

    目录 爬山问题 爬山算法的流程 爬山算法优缺点 先提物理退火 关于模拟退火 1.1总论 1.2主要流程 1.2.1产生初始解 1.2.2扰动产生新解 1.2.3计算 1.2.4判断 1.2.4循环 2 ...

  5. python爬山算法

    这篇文章主要介绍了爬山算法,爬山法(climbing method)是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)然后用Python实现了这个算法,需要的朋友可以参考下 ...

  6. python数圈算法_Python实现随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  7. 一文教会你Python 随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  8. 5分钟掌握 Python 随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  9. Python使用爬山算法寻找序列“最大值”

    爬山算法是人工智能算法的一种,特点在于局部择优,所以不一定能够得到全局最优解,尽管效率比较高.使用爬山算法寻找序列最大值的思路是:在能看得到的局部范围内寻找最大值,如果当前元素已经是最大值就结束,如果 ...

最新文章

  1. 1.模型 16个相机参数(内参、外参、畸变参数)
  2. python基础(part4)--语句
  3. 我到底该信谁?另外,我发现了抢火车票的秘密
  4. Bootstrap3 折叠插件的调用方式
  5. win10固态硬盘分区 整数_固态硬盘怎么重装win10系统?Win10固态硬盘重装系统教程...
  6. 基于3D关节点的人体动作识别综述
  7. css 链接设计,css将超链接a设计成按钮样式实例
  8. matlab fig 字体,关于.fig文件的font,请教达人,多谢
  9. jQuery漂浮横幅图片广告代码
  10. STM32F103ZET6的芯片工程改为STM32F103C8T6的工程
  11. 人机对话的梦想与AI智能音箱
  12. 微前端在Vue项目的实践
  13. Hybrid App开发之css样式使用
  14. matlab求拉斯反变换,MATLAB拉式反变换输出结果有问题
  15. 未来的春晚,可能就不需要活的主持人了
  16. Android Audio - 支持多应用同时录音_Android8.1修改方法
  17. Spring Boot-导出word
  18. Python井字棋源代码
  19. 开源数据同步备份工具(MySQL、Oracle、SqlServer、PostgreSQL)
  20. 机芯智能智能摄像头语音开发板在线解答回看!

热门文章

  1. 学校计算机课辅活动记录表,电脑课教学日志
  2. [附源码]SSM计算机毕业设计超市收银系统JAVA
  3. UPC 圣诞树(DAG模型)
  4. ABAQUS学习(1):打开求解好的cae文件并查看云图
  5. C# 常用加密方法收集 对称,非对称
  6. 实用新型专利申请材料
  7. 上采样(upsampling)和下采样(subsampled)
  8. 我期待的科研生活作文英文作文
  9. html 中的下拉列表,【HTML】什么是 HTML 中的下拉列表(select、option)
  10. html做下拉列表效果