在 Python 中从头开始迭代本地搜索

迭代局部搜索是一种随机全局优化算法。它涉及将本地搜索算法重复应用于先前找到的好的解决方案的修改版本。这样,它就像是具有随机重启算法的随机爬山的巧妙版本。

该算法背后的直觉是,随机重新启动可以帮助找到问题中的许多局部最优值,并且更好的局部最优值通常接近于其他局部最优值。因此,对现有局部最优值的适度扰动可能会为优化问题找到更好甚至最好的解决方案。

在本教程中,您将发现如何从头开始实现迭代的本地搜索算法。完成本教程后,您将知道:

  • 迭代本地搜索是一种随机全局搜索优化算法,它是具有随机重启功能的随机爬山的更智能版本。

  • 如何从头开始随机重启随机爬山。

  • 如何实现并将迭代的局部搜索算法应用于非线性目标函数。

教程概述

本教程分为五个部分。他们是:

  • 什么是迭代本地搜索

  • 客观目标函数

  • 随机爬山算法

  • 随机重新开始的随机爬山

  • 迭代局部搜索算法

什么是迭代本地搜索

迭代本地搜索(简称ILS)是一种随机的全局搜索优化算法。它与随机爬山和随机爬山随机开始有关。

随机爬山是一种本地搜索算法,它涉及对现有解决方案进行随机修改,并且仅当修改产生比当前工作解决方案更好的结果时,才接受修改。

通常,本地搜索算法会陷入本地最优状态。解决此问题的一种方法是从新的随机选择的起点重新开始搜索。重新启动过程可以执行多次,也可以在固定数量的功能评估之后触发,或者在给定数量的算法迭代中看不到进一步的改善时,可以触发重新启动过程。该算法称为随机重新启动的随机爬山。

迭代的本地搜索类似于具有随机重启的随机爬坡,除了不是为每次重启选择随机的起点,而是根据迄今为止在更广泛的搜索中找到的最佳点的修改版本来选择一个点。到目前为止,最佳解决方案的扰动就像是搜索空间中向新区域的大幅跃迁,而随机爬山算法产生的扰动要小得多,仅限于搜索空间的特定区域。这允许在两个级别上执行搜索。爬山算法是一种本地搜索,用于从特定的候选解决方案或搜索空间区域中获取最大收益,并且重新启动方法允许探索搜索空间的不同区域。这样,迭代局部搜索算法可在搜索空间中探索多个局部最优,从而增加了定位全局最优的可能性。尽管可以通过在搜索空间中使用不同的步长将其应用于连续功能优化,但迭代局部搜索是针对组合优化问题(如旅行推销员问题(TSP))提出的:爬坡的步幅较小,爬坡的步幅较大随机重启。既然我们熟悉了迭代本地搜索算法,那么让我们探索如何从头开始实现该算法。

客观目标函数

首先,让我们定义一个渠道优化问题,作为实现“迭代本地搜索”算法的基础。Ackley函数是多模式目标函数的一个示例,该函数具有单个全局最优值和多个局部最优值,可能会卡住局部搜索。因此,需要全局优化技术。这是一个二维目标函数,其全局最佳值为[0,0],其值为0.0。下面的示例实现了Ackley,并创建了一个三维表面图,显示了全局最优值和多个局部最优值。

# ackley multimodal function
from numpy import arange
from numpy import exp
from numpy import sqrt
from numpy import cos
from numpy import e
from numpy import pi
from numpy import meshgrid
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
 
# objective function
def objective(x, y):
 return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
 
# define range for input
r_min, r_max = -5.0, 5.0
# sample input range uniformly at 0.1 increments
xaxis = arange(r_min, r_max, 0.1)
yaxis = arange(r_min, r_max, 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a surface plot with the jet color scheme
figure = pyplot.figure()
axis = figure.gca(projection='3d')
axis.plot_surface(x, y, results, cmap='jet')
# show the plot
pyplot.show()

运行示例将创建Ackley函数的表面图,以显示大量的局部最优值。

我们将以此为基础来实现和比较简单的随机爬山算法,随机重启的随机爬山算法以及最终迭代的本地搜索。我们希望随机爬山算法容易陷入局部极小值。我们希望随机爬山并重新启动可以找到许多本地最小值,并且如果配置得当,我们希望迭代本地搜索比任何一种方法在此问题上的执行效果都更好。

随机爬山算法

迭代本地搜索算法的核心是本地搜索,在本教程中,我们将为此目的使用随机爬山算法。随机爬山算法涉及到首先生成一个随机的起点和当前的工作解决方案,然后生成当前工作解决方案的扰动版本,如果它们优于当前的工作解决方案,则接受它们。假设我们正在研究连续优化问题,则解决方案是目标函数要评估的值的向量,在这种情况下,该向量是二维空间中以-5和5为边界的点。我们可以通过以均匀的概率分布对搜索空间进行采样来生成随机点。例如:

# generate a random point in the search space
solution = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])

我们可以使用高斯概率分布,当前解决方案中当前值的平均值以及由超参数控制的标准偏差来生成当前正在工作的解决方案的扰动版本,该超参数控制允许搜索从当前工作解决方案进行多远的探索。

我们将此超参数称为“ step_size”,例如:

# generate a perturbed version of a current working solution
candidate = solution + randn(len(bounds)) * step_size

重要的是,我们必须检查生成的解决方案是否在搜索空间内。

这可以通过一个名为in_bounds()的自定义函数来实现,该函数采用候选解和搜索空间的边界,如果该点位于搜索空间中,则返回True,否则返回False。

# check if a point is within the bounds of the search
def in_bounds(point, bounds):
 # enumerate all dimensions of the point
 for d in range(len(bounds)):
  # check if out of bounds for this
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值