想象一下,函数在[0.0,n]范围内是连续的。是否有任何算法可以比简单迭代更快地找到给定最小步长s
的函数的最大值?简单的迭代对于编程很简单,但是当时间复杂度增加时,n/s
很大。以特定分辨率查找连续函数的最大值
double maxValue = 0;
double maxValueX = 0;
double s = 0.1 * n;
for (double x = 0.0; x <= n; x += s)
{
double value = someFunction(x);
if(value > maxValue) {
maxValue = value;
maxValueX = x;
}
}
我已经试过这种方法是要快得多,但不知道这是否会停滞在局部最大值。
double min = 0;
double max = n;
int steps = 10;
increment = (max - min)/steps;
while (increment > s)
{
double maxValue = 0;
double maxValueX = X;
for (double x= min; x <= max; x+= increment)
{
double value = someFunction(x);
if(value > maxValue) {
maxValue = value;
maxValueX = x;
}
}
min = Math.Max(maxValueX - increment, 0.0);
max = Math.Min(maxValueX + increment, n);
increment = (max - min)/steps;
}
若f(x)是连续的,最大值(也是最小值)出现在d/dx f(x)= 0处。虽然没有关于函数程度的信息并且仅通过调用它来评估函数,但这可能是唯一的方法。此外,随着您增加步数,除非对域值(即x的可能值)有其他已知限制,否则您可能会有更“接近最大值”的值。 –
如果你想看'd/dx f(x)',你需要'f'来区分。有许多功能是连续的但不可区分的。 – Teepeemm
如果你知道一些关于连续“f”是什么的话,那可能会有所帮助。例如,如果'| f(x + s)-f(x)|'有界,那么当'f'远离它的最大值时,可以采取更大的步骤。 – Teepeemm