用于函数优化的一维 (1D) 测试函数

         【翻译自 : One-Dimensional (1D) Test Functions for Function Optimization

         【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

         函数优化是一个研究领域,它寻求函数的输入,导致函数的最大或最小输出。

        优化算法有很多,在简单易懂的测试函数上研究和开发优化算法的直觉是很重要的。

      一维函数采用单个输入值并输出对输入的单个评估。 当研究函数优化时,它们可能是最简单的测试函数类型。

      一维函数的好处是它们可以被可视化为二维图,x 轴上是函数的输入,y 轴上是函数的输出。 函数的已知最优值和函数的任何采样也可以绘制在同一图上。

      在本教程中,您将发现在学习函数优化时可以使用的标准一维函数。

 

教程概述

         我们可以使用许多不同类型的简单一维测试函数。尽管如此,在函数优化领域中还是有一些常用的标准测试函数。在测试不同的算法时,我们可能希望选择测试函数的特定属性。我们将在本教程中探索少量简单的一维测试函数,并按它们的属性将它们分为五个不同的组;他们是:

凸单峰函数
非凸单峰函数
多模态函数
不连续函数(非平滑)
嘈杂的函数

        每个函数都将使用 Python 代码呈现,其中包含目标目标函数的函数实现和函数的样本,该函数的样本显示为线图,并清楚地标记了函数的最优值。

       所有的函数都表现为一个最小化问题,例如找到导致函数最小(最小值)输出的输入。通过向所有输出添加负号,任何最大化函数都可以成为最小化函数。类似地,任何最小化函数都可以以相同的方式最大化。

        这些函数不是我发明的;它们取自文献。请参阅进一步阅读部分以获取参考资料。

       然后,您可以选择并复制粘贴一个或多个函数的代码以在您自己的项目中使用,以研究或比较优化算法的行为。

凸单峰函数

       凸函数是一种函数,其中可以在域中的任意两点之间绘制一条线,并且该线保留在域中。对于显示为二维图的一维函数,这意味着该函数具有碗状形状,并且两者之间的线保持在碗上方。单峰意味着函数有一个最优解。 凸函数可能是也可能不是单峰的; 类似地,单峰函数可能是也可能不是凸的。以下函数的范围限制为-5.0和5.0,最佳输入值为0.0。

# convex unimodal optimization function
from numpy import arange
from matplotlib import pyplot

# objective function
def objective(x):
	return x**2.0

# define range for input
r_min, r_max = -5.0, 5.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

       运行示例将创建函数的折线图,并用红线标记最优值。

        这个函数可以通过添加或减去一个常数值在数轴上向前或向后移动,例如 5 + x^2。

        如果希望将最佳输入从 0.0 值移开,这会很有用。

非凸单峰函数

        如果无法在域中的两点之间绘制一条线并且该线保留在域中,则函数为非凸函数。这意味着可以在域中找到两个点,它们之间的线与函数的线图相交。通常,如果一维函数的图有多个山丘或山谷,那么我们立即知道该函数是非凸函数。 然而,非凸函数可能是也可能不是单峰的。我们对优化感兴趣的大多数实际函数都是非凸函数。以下函数的范围限制为-10.0和10.0,最佳输入值为0.67956。

# non-convex unimodal optimization function
from numpy import arange
from numpy import sin
from numpy import exp
from matplotlib import pyplot

# objective function
def objective(x):
	return -(x + sin(x)) * exp(-x**2.0)

# define range for input
r_min, r_max = -10.0, 10.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.67956
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

        运行示例将创建函数的折线图,并用红线标记最优值。

多模态函数

        多模态函数是指具有多个“模态”或最优值(例如谷值)的函数。

       多峰函数是非凸的。可能存在一个全局最优解和一个或多个局部最优解或欺骗最优解。 或者,可能存在多个全局最优值,即导致函数的相同最小输出的多个不同输入。让我们看几个多模态函数的例子。

多模式函数 1

      范围限制在 -2.7 和 7.5 之间,最佳输入值为 5.145735。

# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot

# objective function
def objective(x):
	return sin(x) + sin((10.0 / 3.0) * x)

# define range for input
r_min, r_max = -2.7, 7.5
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 5.145735
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

         运行示例将创建函数的折线图,并用红线标记最优值。

多模式函数 2

       范围限定为 0.0 和 1.2,最佳输入值为 0.96609。

# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot

# objective function
def objective(x):
	return -(1.4 - 3.0 * x) * sin(18.0 * x)

# define range for input
r_min, r_max = 0.0, 1.2
# sample input range uniformly at 0.01 increments
inputs = arange(r_min, r_max, 0.01)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.96609
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

        运行示例将创建函数的折线图,并用红线标记最优值。

多模式函数 3

      范围限定在 0.0 和 10.0 之间,最佳输入值为 7.9787。

# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot

# objective function
def objective(x):
	return -x * sin(x)

# define range for input
r_min, r_max = 0.0, 10.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 7.9787
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

不连续函数(非平滑)

      函数可能具有不连续性,这意味着函数输入的平滑变化可能会导致输出的非平滑变化。 我们可能将具有此属性的函数称为非平滑函数或不连续函数。有许多不同类型的不连续性,但一个常见的例子是函数输出值的跳跃或方向急剧变化,这在函数图中很容易看出。

       不连续函数,范围限定在 -2.0 和 2.0 之间,最佳输入值为 1.0。

# non-smooth optimization function
from numpy import arange
from matplotlib import pyplot

# objective function
def objective(x):
	if x > 1.0:
		return x**2.0
	elif x == 1.0:
		return 0.0
	return 2.0 - x

# define range for input
r_min, r_max = -2.0, 2.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = [objective(x) for x in inputs]
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 1.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

        运行示例将创建函数的折线图,并用红线标记最优值。

嘈杂的函数

       函数可能具有噪声,这意味着每个评估可能具有随机成分,每次都会稍微改变函数的输出。通过向输入值添加小的高斯随机数,可以使任何非噪声函数产生噪声。以下函数的范围限制为-5.0和5.0,最佳输入值为0.0。

# noisy optimization function
from numpy import arange
from numpy.random import randn
from matplotlib import pyplot

# objective function
def objective(x):
	return (x + randn(len(x))*0.3)**2.0

# define range for input
r_min, r_max = -5.0, 5.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()

        运行示例将创建函数的折线图,并用红线标记最优值。

 

 

efdc1d.f 是一个一维代码版本的文件,其中的.f表示该代码是Fortran语言编写的。 Fortran语言是一种面向科学和工程计算的高级编程语言,它具有良好的数值计算和数组处理能力。一维代码版本意味着该代码主要用于处理一维数据和问题。 efdc1d.f 可能是某个科学或工程领域的模拟或计算代码。根据代码的具体实现,它可能包含一维数据结构定义、数值计算方法、迭代算法等内容。 在一维代码版本中,一维数据通常以数组的形式被处理和计算。例如,可以使用一维数组来表示时间序列、空间分布或其他一维数据结构。 efdc1d.f 可能包括处理一维数据的函数和子程序,用于对数据进行计算、模拟、优化或其他操作。代码可能会包含循环、条件语句等控制结构,以实现对一维数据的遍历和处理。 根据具体领域的要求,efdc1d.f 可能包含适用的数值方法和算法,用于解决某个特定问题。例如,可以在代码中实现数值积分、微分方程求解、最小二乘拟合等算法。 最后,为了确保代码的正确性和可靠性,一维代码版本通常会包含注释、测试数据和用户指南等辅助信息。这些信息可以帮助其他人理解和使用该代码。 总之,efdc1d.f 是一个用Fortran语言编写的一维代码版本,用于处理一维数据和问题。具体的功能和实现细节需要根据代码本身进行进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值