以给定的最大x速度通过线段的最大y速度

时间:2017-01-07 00:10:48

标签: java algorithm coordinates dynamic-programming

给定一系列线段S i ,每个线段具有坐标X i 和Y i (对于每个i,Y i + 1 大于Y i )并且每个长度b在x方向上,我如何计算通过所有可以改变x坐标的段的最大y速度最大速度为v。(对于某些段序列,这可能是不可能的)

这是一个例子(段坐标(1,1),(5,2),(1,3)和长度3(图片显示第二段不正确),最大x速度= 2): enter image description here

2 个答案:

答案 0 :(得分:0)

我首先将线段分类为增加的Y值,并将具有相同y值的段组合在一起。我假设如果有两个具有相同y值的段,您可以通过其中任何一个。如果不是这种情况,也许您可​​以将它们替换为它们的交叉点并按此处所述继续进行,或者如果交叉点为空则说不可能。

查看任何线段的最左侧与任何线段的最右侧之间的差异,以及两个不同Y值之间的最小差异,您可以计算出可以在最远的左侧值和最左侧值之间获得的速度。两个不同Y值之间的最小差异中最右边的值。这是一个可能的速度,因此最小可能的速度介于此和0之间。

现在猜一下速度。对于此速度,您将在每个y值处计算出一系列间隔,这些间隔是可到达的x值。从可以访问y值最小的所有段开始。现在按照增加y值的顺序考虑所有段的组。在给定当前速度的情况下,确定可从当前间隔集中到达段组中的哪些间隔。这成为一组新的可达间隔。解决这个问题的一种方法 - 不一定是最好的 - 是通过将它们向左和向右填充来扩大当前的可达间隔集,其中可以在两组段之间的y距离中以当前最大速度行进的距离然后将这个放大的可达集与新的一组段相交。

现在你可以对速度进行二进制斩波(从0开始到你之前计算出的最大速度),以大致了解段刚刚连接的速度。事实上,我认为如果我更聪明,我可以描述如何通过段计算不仅是区间而是间隔线性函数,这将允许您准确地解决问题。事实上,我认为这告诉我,当速度超过最低必要速度时,最后Y值的可到达段的总长度在您选择的速度中是分段线性的。

但只要知道这一点就可以让你做出比二进制斩更好的猜测。使用两个具有最小速度的猜测到目前为止可以使用可到达段的长度进行推断,以猜测使问题可达的速度。如果猜测不起作用,请进一步传递二进制斩波以获得新的最小速度,直到再次尝试为止。

答案 1 :(得分:0)

重新说明,我们给出了几个水平线段[l_i, u_i] × {y_i}和水平速度v,并希望找到最大垂直速度s,以便存在x_i ∈ [l_i, u_i] |y_i - y_{i-1}|/s ≥ |x_i - x_{i-1}|/v,即水平移动的时间不过是垂直移动的时间。这个问题有这样的LP公式。

minimize z (intuitively, z = v/s)
subject to
l_i ≤ x_i ≤ u_i, for all i
x_i - x_{i-1} ≤ |y_i - y_{i-1}| z, for all i
x_{i-1} - x_i ≤ |y_i - y_{i-1}| z, for all i
variables
x_i, for all i
z

单纯形法可以快速完成这项工作。

相关问题