算法选择一对矢量以获得最佳“之字形”轮廓

时间:2018-01-30 20:08:09

标签: algorithm vector polar-coordinates

我有一组不同的2D矢量(实数),指向不同的方向。我们被允许选择一对向量并构造它们的线性组合,使得系数为正且它们的和为1。 简单来说,我们可以对任意两个向量进行“加权平均”。

我的目标是任意方向选择一对矢量,其“加权平均值”在这个方向并且最大化。 用代数方式给出向量 a b 以及方向向量 n ,我们有兴趣最大化此值:

[ a 交叉 b ] / [( a - b )交叉 n ]

即。选择 a b 来最大化此值。

具体而言,这个问题的应用是针对帆船的。对于每个明显的风向,船将具有由极坐标图给出的速度。以下是此类图表的示例:Velocity diagram

(此图中的每一行对应一个特定的风量)。注意每个方向上“不可能”的前部区域大约30度。

因此,在某个方向上速度会很高,有些方向 - 低速,而对于某些方向,则不可能直接航行(例如在与风严格相反的方向上)。

如果我们需要朝着我们无法直接航行的方向前进(或速度不是最佳的) - 它可以以曲折的方式前进。这称为定位。

现在,我的目标是重新计算一个新图表,它直接或间接地表示任何方向的平均前进速度。例如,对于上图,校正后的图表将为:

Corrected velocity diagram

请注意,没有更多“不可能”的指示。对于某些方向,该图类似于原始图,其中最好直接前进,并且不需要任何操作。对于其他人 - 它显示了在这个方向上的最大平均前进速度,假设定期执行最佳操纵。

计算此算法的最佳算法是什么?假设该图是作为一组离散的方位 - 速度对给出的,我们可以从中计算向量。

到目前为止,我只检查所有矢量对以选择最佳。那么,有一些截止标准,例如只选择在前进方向上具有正投影的矢量,以及相反的垂直投影,但复杂度仍为O(N ^ 2)。 我想知道是否有更高效的算法。

修改

非常感谢@mcdowella。对于计算机科学和水手的答案!

我也想到了凸多边形,发现它只值得探测那个船体上的矢量(即如果你在这个船体上采用2个矢量的叠加,并试图用一个矢量替换它们中的一个,那就是'在这个船体上,由于新矢量在所需方向上的投影比两个源矢量都差,因此结果会更糟。)

但是我没有意识到2个矢量的任何“加权平均”实际上是连接这些矢量的直线段,因此最终的图确实是这个凸壳!而且,正如我们所看到的,这也与我通过“强力”算法计算的内容一致。

2 个答案:

答案 0 :(得分:1)

首先是前激光水手回答

至少对于逆风或顺风而言,明显的猜测是要确定每条腿的长度与风的长度相同。如果极坐标图围绕逆风 - 下风轴对称,则这是正确的。假设逆风是Y轴,可能的腿是(A,B),( - A,B),(a,b)和(-a,b)。对称定位移动(A,B)/ 2 +( - A,B)/ 2 =(0,B),另一个对称定位给你(0,b)。不对称定位是(-A,B)a /(a + A)+(a,b)A /(a + A)=(0,(a /(a + A))B +(A /(a +) A))b)如果b!= B位于b和B之间,那么不如b或B中最好的那样好。

对于任何位于左舷和右舷大头钉之间的方向,你可以采取向上风的方向工作,显而易见的策略是改变那些腿的长度而不是它们的方向,以便平均向量行进在所需的方向。这是最好的策略吗?如果没有,那么更好的策略就是让前进的速度更快,因为左舷和右舷将会以上风的方式工作,我认为这是一个矛盾 - 所以对于任何方向来说,在左舷和右舷之间的任何方向都是逆风我认为最好的策略确实是制造这些方法但改变腿长以达到所需的方向。同样的事情应该适用于顺风,如果你有一条船,这是一个好主意。

答案 1 :(得分:1)

现在计算机科学回答

定位策略为您提供组成大头钉的腿部矢量的凸起组合。

因此,请考虑图中只有一个轮廓的轮廓。所有可能的最佳速度和方向的集合是通过将矢量的所有凸组合与轮廓形成而形成的凸多边形。所以你想要做的是形成轮廓的凸包(https://en.wikipedia.org/wiki/Convex_hull)。要了解如何在任何特定方向快速前进,请将该矢量与凸包相交,并使用与您相交的凸包边缘两侧的角相对应的腿。

观察你的图表,轮廓是逆风凹面和顺风顺风,这是你所期望的。然而,还有另一个凹面部分,介于4和5点之间,并且对称地介于7和8点之间,在校正图中看起来像一条直线 - 所以我想还有第三个方向可以解决,在风的同一侧使用两个河段,我不认识传统航行。