【问题标题】:finding maximum of a function with least probes taken用最少的探测找到函数的最大值
【发布时间】:2016-06-08 03:53:24
【问题描述】:

我有一些代码,基本上是一个函数,它返回一个值。此功能需要很长时间才能运行。函数接受 double 作为参数:

double estimate(double factor);

我的目标是找到这个estimate 函数返回最大值的参数因子。我可以简单地蛮力并迭代不同的因子输入并得到我需要的东西,但是该函数需要很长时间才能运行,所以我想尽量减少我采取的“探测”数量(例如,尽可能少地调用估计函数)。 通常,对于介于 0.5 和 3.5 之间的因子值,会返回最大值。如果我绘制返回值,我会得到看起来像钟形曲线的东西。对可能的输入进行分区的最有效方法是什么,我可以更快地发现最大值?

【问题讨论】:

    标签: c++ algorithm


    【解决方案1】:

    上一个答案建议采用 2 点方法。这对于近似为行的函数是一个好主意,因为行由 2 个参数定义:y=ax+b

    但是,实际的钟形曲线更像是一条抛物线,由ax²+bx+c定义(所以3个参数)。因此,您应该获得 3 分 {x1,x2,x3}solve for {a,b,c}。这将为您提供xtop -b/2a 的估计值。 (链接的答案在这里使用名称x0)。

    如果函数不是真正的抛物线,您需要迭代地逼近实际顶部,但这个过程收敛得非常快。最简单的解决方案是采用原始三元组x1,x2,x3,添加xtop 并删除距离xtop 最远的xn 值。这样做的好处是您可以重用 2 个旧的 f(x) 值。这种重用对“最小样本”的既定目标有很大帮助。

    【讨论】:

      【解决方案2】:

      如果你的函数确实有一个钟形曲线,那么你可以使用二分搜索如下:

      选择一个初始 x1(比如 x1 = 2,介于 0.5 和 3.5 之间)并找到 f(x1) 和 f(x1 + delta),其中 delta 足够小。如果 f(x1 + delta) > f(x1) 表示峰值在 x1 的右侧,否则在左侧。

      进行二分查找,根据需要得到足够接近的峰值。

      你可以修改上面的方法,根据f(x1 + delta) - f(x1)的差值选择下一个x_t。

      【讨论】:

      • 在纸上画完之后,我想出了与您描述的相同的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多