最小化功能

问题描述 投票:5回答:6

假设给定一个具有单个变量的函数以及参数a和b,并要求其找到该函数在区间[a,b]上所取的最小值。 (尽管我的应用程序中可能需要使用一个任意精度的库,但是您可以假设该参数是一个double值。)

通常,这是一个难题,因为功能可能很奇怪。此问题的简单版本是假设函数为连续(无间隙或跳跃)和单峰(有唯一的最小值;在函数的左侧),以最小化函数在减少,在右边则在增加)。有什么好的方法可以解决这个更简单(但可能不容易!)的问题?

假定该函数可能难以计算,但存储已计算出的答案并非特别昂贵。 (显然,如果不必制作大型键/值对数组,那会更好。)

奖励点是在幸运的情况下改进算法的好点子(例如:存在导数,函数是平滑/解析的,可以以封闭形式计算导数,当函数为时可以免费计算导数)已评估)。

algorithm math language-agnostic
6个回答
3
投票

您描述的版本只有一个最小值,很容易解决。

想法是这样。假设我有a < b < cf(b) < f(a)f(b) < f(c) 3个点。那么真实的最小值在ac之间。此外,如果我在间隔中的某个位置选择了另一个点d,那么我可以丢掉ad中的一个,并且仍然有一个中间值为最小的间隔。随着我进行更多的迭代,我的近似值将迅速成倍增长。

我们不是从这个开始。我们从2点ab开始,知道答案在中间。取中点。如果f低于端点,我们将进入上面讨论的情况。否则,它必须在端点之一之下,而在另一端点之上。我们可以丢弃更高的端点并重复。


2
投票

[如果函数很好,即单峰且严格单调(即,严格减小到最小值的左边,而严格增大到右边),则可以通过二进制搜索找到最小值:

  • 设置x = (b-a)/2
  • 测试x在最小值的右边还是左边
  • 如果x还剩最小值:b = x
  • 如果x在最小值的右边:a = x
  • 从头开始重复直到感到无聊
  • 最小值为x

要测试x是否为最小值的左/右,请发明一个较小的值epsilon,然后检查f(x - epsilon) < f(x + epsilon)。如果是,最小值在左边,否则在右边。 “直到您感到无聊为止”,我的意思是:发明另一个较小的值delta,如果fabs(f(x - epsilon) - f(x + epsilon)) < delta,则停止。

请注意,在通常情况下,您对函数f的行为一无所知,就无法确定f的非平凡属性。好吧,除非您愿意尝试所有可能的输入。有关详细信息,请参见Rice's Theorem


1
投票

Boost项目的Brent's algorithm实现可能会有用。似乎假设该函数是连续的,并且在输入间隔中没有最大值(只有最小值)。


1
投票

不是直接答案,而是更多阅读的指南:


1
投票

您想要的是优化Unimodal function。正确的算法类似于btilly的算法,但是您需要加分。


0
投票

如果有该函数的表达式,则有基于间隔分析的全局优化算法。

© www.soinside.com 2019 - 2024. All rights reserved.