【发布时间】: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