我正在创建一个简单的游戏,并在为我的游戏设计AI时遇到这个问题: 给定笛卡尔坐标中矩形内的一组N个点,我需要找到通过该矩形的最宽直线路径。路径必须为空(即不包含任何点)。
我想知道是否有任何有效的算法来解决这个问题?你能否提出任何关于这个问题的关键词/论文/任何内容?
编辑:矩形始终由角落中的4个点定义。我添加了一张图片用于说明。上图中的路径由两条红线决定
答案 0 :(得分:6)
这是最宽的空走廊问题。 Houle和Maciel在1988年的一份题为“通过一组点找到最宽的空走廊”的技术报告中给出了O(n 2 ) - 时间,O(n) - 空间算法,这似乎不是可在线获取。幸运的是,Janardan和Preparata在他们的论文Widest-corridor problems的第4节中描述了这个算法,该算法可用。
答案 1 :(得分:2)
遍历所有点对。通过该对构造一条 l 行。 (^ 1)在 l 的每一边,是否还有其他点。如果没有,则 l 的那一侧没有路径。如果有其他点,则循环计算从 l 到每个这样的点的垂直距离 d 。记录最小 d 。这是 l 那边最宽的路径。继续循环遍历所有对,将该对的最宽路径与先前最宽的路径进行比较。
这个算法可以被认为是幼稚的,可以在O(n^3)
时间内运行。
编辑:上述算法错过了一个案例。在上面的^ 1处,插入:“通过该对的每个点构造垂直于 l 的两条线。如果线之间没有第三个点,则记录距离 d 要点。这构成了一条道路。“在^ 1处继续算法。对于其他情况,算法仍为O(n^3)
答案 2 :(得分:1)
我自己,我会先看看点集的Delaunay三角剖分: http://en.wikipedia.org/wiki/Delaunay_triangulation
似乎有足够的资源来建立有效的算法 - 财富的算法,在O(n log n),对于初学者。
我的直觉告诉我,你最宽的路径将由该图中的一条边定义(即,它将垂直于边缘,其宽度将等于边的长度)。如何对边缘进行排序,检查候选者并确定最宽的路径。我喜欢这个问题,我会继续思考它。 :)
编辑1:我的直觉让我失望!简单的等边三角形是一个反例:最宽的路径比三角测量中的任何边缘都短。还在想......编辑2:所以,我们需要一个黑盒算法,给定集合中的两个点,找到通过这两个点限定的点集的最宽路径。 (可视化两条贯穿两点的平行线;相互协调旋转直到它们之间没有点)。我们将此算法的运行时调用为“R”。
鉴于这样的算法,我们可以做到以下几点:
步骤1和2很不错,但O(nR)有点可怕。如果R结果是O(n),则整个算法已经是O(n ^ 2)。好的一点是,对于一组通用的随机点,我们希望我们不必经历所有的边缘。