想象一下,函數在[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