【问题标题】:Linear Programming - Algorithms线性规划 - 算法
【发布时间】:2020-12-22 11:45:08
【问题描述】:

给定平面上的两组点P1, P2

解决方案:如果有一条线将P1P2 的点分开,则这条线表示P1 中的所有点都在一侧,P2 中的所有点都在另一侧,返回'有这样的行',否则返回'没有这样的行'。

示例:考虑以下几点:????5 = (−2,1) ,????4 = (6,2) ,????3 = (2, -2) ,??? ?2 = (1,5) ,??????1 = (-2, -1)。

P1 = {????1,????2} and P1 = {????3,????4} ---> 例如返回 'There is such line' y = 2x-3

P1 = {????1,????2} and P1 = {????3,????4,????5} ---> return 'There is no such line'。

是否存在不使用凸包来解决此问题的基于线性设计的算法?我很乐意提出建议!

【问题讨论】:

  • 凸包有什么问题?

标签: algorithm linear-programming


【解决方案1】:

一种解决方案是分别设计 P1 和 P2 的两个凸包。您可以使用Wikipedia 中列出的算法之一。 Graham 扫描实现起来非常简单,并且具有 O(nlogn) 时间复杂度。

然后检查这两个多边形是否重叠。为此,您可以采取以下步骤:

  1. 对于第一个凸包上的每个顶点,检查它是否完全位于第二个凸包内。这意味着检查一个顶点是否位于另一个凸包的每个(有向)边的同一侧。如果至少一个顶点是这样,那么多边形会重叠。我们可以在这里停下来。
  2. 做同样的事情,但现在使用第二个凸包的每个顶点。

如果这些步骤都没有给出重叠的结论,那么它们不会重叠。

【讨论】:

  • 谢谢先生的回答!但是,有没有其他方法可以在不使用凸包的情况下解决这个问题?
  • @TariqGanem:如果是这样,那么您应该在您的帖子中进行相应的传达,以便社区可以做出相应的思考。顺便说一句,我在我的答案中指出了一些不使用凸包来解决这个问题的链接。
【解决方案2】:

第 1 步:为点集 p1 创建凸包。检查集合 P2 的任何点是否在点 P1 的凸包内。

第 2 步:为点集 p2 创建凸包。检查集合 P1 的任何点是否在点 P2 的凸包内。

如果在任一步骤中,一个点位于多边形内,“没有这样的线”。否则,'有这样一行'。

您必须完成这两个步骤。不能只为 P1 创建一个凸包并检查 P2 中的点是否在 P1 的凸包内,反之亦然。如上图示例所示,您不能只为红点设置一个凸包并检查黄点是否在该凸包内。

凸包的时间复杂度:O(nlogn)。

参考资料:

您还可以在stack overflowcomputer science stack exchange 上找到一些有趣的方法。这些提到了一些不使用凸包方法的方法。

【讨论】:

  • 这不适用于例如 P1 = [(-1,0),(1,0)], P2 = [(0,-1),(0,1) ]
【解决方案3】:

当且仅当有一条线将它们的凸包分开时,确实有一条线将两组点分开,但是您不需要完成所有生成外壳和相交多边形的工作为了解决这个问题。

首先,检查点集是否在其 x 坐标中重叠,即是否 min_x(P1) = min_x(p2)

如果它们在 x 坐标上不重叠,则有一条垂直线将它们分开,您就完成了。否则……

使用单调链算法找到P1的上下壳和P2的上下壳:https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain

如果有一条线将 P1 和 P2 分开,那么在 x 坐标重叠的区域中,要么 P1 的下壳完全在 P2 的上壳之上,反之亦然。您可以通过按 x 坐标顺序处理上下船体上的点来检查这一点。

这个算法确实使用了单调链法,是用来生成凸包的,但是它避免了一般的多边形相交,并且很容易在O( N log N) 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多