在圆形域S = { (x1, f(x2)), (x2, f(x2)), ... (xn, f(xn)) }
上给出函数f(x)
的样本x ∈ [0, 1)
,即参数x=1
等同于x=0
。可以假设S
相对于x值进行排序。 n
可以假设小于100。
我想选择具有以下约束的这些样本E = (e1, e2, ... ek) ⊂ S
的子集。假设E
是根据x值排序的:
minDist <= e(i + 1).x - e(i).x <= maxDist for all i ∈ (1, k - 1)
minDist <= e1.x + 1 - ek.x <= maxDist
即。两个相邻的选定样本必须远离minDist
但距离彼此不超过maxDist
。总会有一个子集E
来满足这些约束。
但我不想挑选任何子集。我想要一个最佳的:
arg min 1/k * ∑ e.f
E, k e ∈ E
即。未定义所选样本的数量。我想挑选样本,使其平均值最小化。
显然,k
受minDist
和maxDist
限制:
1 / maxDist <= k <= 1 / minDist
在许多情况下,问题似乎可以减少到S
的局部最小值。但是,如果没有满足约束条件的局部最小值子集,则无法做到这一点。
贪婪算法可以按f(x)
(从最小到最大)的顺序访问样本。如果它不违反下限约束,它会将样本插入E
。但是,这并不一定会导致有效的解决方案。特别是不是最佳的。其他贪婪的方法是可以想象的。例如。在尚未满足约束的地区挑选最少的样本。
强制所有可能的解决方案显然太慢了。解决方案图上的基于图形的算法可能会加快这一速度,但图表很可能是指数级的。
有没有人知道这个问题的多项式时间算法?
答案 0 :(得分:1)
首先,假设一系列样本中的第一个点 - 所以你最终会尝试使用第一个点,例如maxdist中的所有点都超过0。
现在从该点开始运行一个动态程序,其中每个点都是状态(到目前为止接受的样本数),并且您考虑通过选择该点结束所有序列并接受该样本数并存储最小总和由每个可能状态的任何这样的序列产生。您可以通过回顾之前几点的最佳答案,在任何时候找出答案。
一旦你到了最后,计算出所有答案的平均值,这些答案已经包含在最大限度内并且选择最佳。