【问题标题】:Local optimums in Electric Fences电围栏中的局部最优
【发布时间】:2010-02-13 00:00:02
【问题描述】:

我正在为 Usaco 问题“电栅栏”编写解决方案。 在这个问题中,您必须在大量线段中找到一个点的最佳位置,因此点-线段距离之和尽可能小。

我有一个想法,也许可以进行爬山,并且它适用于所有测试用例。给定的分析使用了类似的方法,但没有解释为什么会这样。

因此,我仍然无法证明或反驳给定任务中局部最优的存在。我有一个想法,可以使用归纳法来完成,但我无法让它发挥作用。你能帮帮我吗?

更新定义

给定一组 (x1,y1,x2,y2) 线段,找到 (x,y) 点 P,使函数最小化:

def Val(x,y):
    d = 0
    for x1,y1,x2,y2 in LineSegments:
        if triangle (x1,y1,x2,y2,x,y) is not obtuse in (x1,y1) or (x2,y2):
            d += DistPointToLine(x,y,x1,y1,x2,y2)
        else:
            d += min(DistPointToPoint(x,y,x1,y1), DistPointToPoint(x,y,x2,y2))
    return d

由于某种原因,该问题仅包含一个局部最优值,因此可以使用以下过程来解决它:

precision = ((-0.1,0), (0.1,0), (0,-0.1), (0,0.1))
def Solve(precision=0.1):
    x = 0; y = 0
    best = Val(x,y)
    while True:
        for dx,dy in precision:
            if Val(x+dx, y+dy) > best:
                x += dx; y += dy
                best = Val(x,y)
                break
        else:
            break
    return (x,y)

问题是:为什么这不会卡在通往全局最优的路上?

【问题讨论】:

  • 你用的是什么爬山方法?需要有关您的算法的更多详细信息,例如您如何决定从一个点移动到另一个点?
  • 如何,我的意思是你如何选择下一个点等。
  • 我已经更新了定义。希望对你有帮助?
  • 奇怪的是,任何 2 条平行线段之间都有一个完整的区域,你的 d 出来是一样的。我本来希望它是平方距离的总和;-)

标签: math geometry hill-climbing


【解决方案1】:

如果我们注意到单个线段的距离函数是convex function,就很容易证明算法的正确性。在这种情况下,凸意味着如果我们将距离函数视为曲面 z=f(x,y),那么如果我们填充曲面上方的体积,我们将得到一个凸实体。在与单个线段的距离的情况下,实体看起来像一个带有锥形末端的三角形楔子。

由于sum of convex functions is also convex,那么多条线段的距离之和也将是一个凸函数。因此,由于函数是凸函数,因此您找到的任何局部最小值也必须是全局最小值。

【讨论】:

  • 你的意思是三维意义上的凸?还有,如果''(x)=0(像一个三角形),是不是既凸又凹?
  • 是的,如果我们将函数视为一个 3d 表面,它会雕刻出一个凸的空间体积。我不确定该函数对于线段的三角形会是什么样子,但它也必须是基于 sum 属性的凸函数。我已经更新了我的答案以反映这一点。
  • 这看起来是正确的!对于 R^n,凸性是很好定义的。另外,我刚刚查了一下,对于凸函数,局部最小值也是全局最小值。我将删除我的答案。
  • 我明白了,它与我认为的“凸”有点不同,因为它是多维的,不是严格凸的,也不是可微的,但我相信我可以大量使用这些新知识未来的事情。非常感谢!
猜你喜欢
  • 2012-05-27
  • 2017-08-04
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多