Algorithm 查找访问网格上所有非阻塞正方形的最短路径

Algorithm 查找访问网格上所有非阻塞正方形的最短路径,algorithm,path-finding,traveling-salesman,Algorithm,Path Finding,Traveling Salesman,假设您有这样一个网格(随机生成): 现在让我们假设你有一辆车从一个while框中随机启动,通过每个while框的最短路径是什么?您可以访问每个白盒子任意多次,但不能跳过黑盒子。黑匣子就像墙一样。简单地说,您只能从白盒移动到白盒 你可以向任何方向移动,甚至是对角移动 两个子问题: 假设您在移动之前知道所有黑匣子的位置 假设你只知道一个黑匣子的位置,当你在它旁边的一个白匣子里 尝试将其构建为一个图(其中每个节点最多有8个其他节点),并将其视为这类似于骑士巡演问题,其中一个典型的解决方案评估从起始广

假设您有这样一个网格(随机生成):

现在让我们假设你有一辆车从一个while框中随机启动,通过每个while框的最短路径是什么?您可以访问每个白盒子任意多次,但不能跳过黑盒子。黑匣子就像墙一样。简单地说,您只能从白盒移动到白盒

你可以向任何方向移动,甚至是对角移动

两个子问题:

  • 假设您在移动之前知道所有黑匣子的位置
  • 假设你只知道一个黑匣子的位置,当你在它旁边的一个白匣子里

  • 尝试将其构建为一个图(其中每个节点最多有8个其他节点),并将其视为

    这类似于骑士巡演问题,其中一个典型的解决方案评估从起始广场开始的所有可能路线。当巡更无法完成时,则使用回溯返回以备份以前的决策。您的问题更轻松,因为您可以多次访问广场。骑士巡演和旅行推销员问题通常要求每个广场只参观一次


    请参见

    您应该将问题建模为一个完整的图,其中两个节点之间的距离(白框)是这些节点之间最短路径的长度。这些路径长度可以通过该算法进行计算。然后,你可以像glowcoder所写的那样对待它


    编辑:为了让它更清楚:你可以用一系列不同的白框来描述迷宫中每一条“有趣”的路径。因为如果您有一个任意路径访问每个白盒,您可以将其拆分为子路径,每个子路径都以一个迄今为止未访问过的新白盒结束。从白框A到B的每个子路径都可以替换为从A到B的最短子路径,这就是为什么需要所有节点对之间的最短路径矩阵

    这似乎是一个NP完全问题

    网格图中的哈密顿路径是NP完全的,如下所示:

    注:网格图=完整网格的子图


    当然,我还没有读过那篇文章,所以先确认一下,尤其是允许对角线移动的部分。

    Doc已经知道了。我要补充的是,黑框只会改变所有白框对之间的距离。进一步细化-如果在任意两个白框之间的对角线上有一个黑框(容易选中),则需要计算最短路径以获得距离。一旦你有了一个距离矩阵,然后在创建一个长度为零的虚拟节点到所有其他节点后,通过求解TSP来求解TSP或哈密顿路径


    关键是,为了制定和解决TSP(或任何问题的制定),必须从距离矩阵开始。距离矩阵在开始时没有指定,因此必须从头开始开发

    虽然基于TSP的启发式方法是一种合理的方法,但不清楚它是否给出了最佳答案。问题(正如莫伦指出的)是跨越路径问题,在评论中提供的链接中,有许多特殊情况下存在线性时间最优解。OP问题不同于引用文章中使用的网格图公式的一个特点是对角线遍历的能力,这大大改变了游戏

    “通过每个白盒子的最短路径是什么?”?你在问什么?你的意思是“去每个白盒子”?是的。。你只需要遍历所有的白盒子。要找到最短的路径,你必须进行蛮力搜索。你是否知道前面的黑匣子并不重要。复制:蛮力?来吧@鲁比斯:不,这不是重复的问题。事实上,它可以简化为一个NP完全问题(你甚至没有演示过),这比告诉他用暴力来解决它没有多大帮助。@BlueRaja:只是因为你不喜欢这个答案,它没有错。我会给glowcoder-1,因为他的回答忽略了一个事实,即TSP通常需要每个城市只访问一次,这在这里不是合适的模型,因为人们需要多次访问一些白色框。TSP不要求每个城市只访问一次。它只关心两个城市之间的最短路径,而不管它是否经过一个它已经沿途经过的城市。无论你如何划分它,这都是一个NP难问题,我相信最好使用与TSP相同的方法来解决它。@BlueRaja,@Doc Brown。网格图(网格的子图)中的生成轨迹(每个顶点至少一次)是NP完全的。以下是链接:@DocBrown:在一般图中,找到至少访问每个顶点一次的最短行走也是NP完全的,很容易证明。试试看。@glowcoder:NP中的任何问题(以及P中的任何问题)都可以用TSP建模,因此可以使用TSP算法来解决,所以这个答案没有帮助(这个问题仍然可能有一个有效的解决方案)。有帮助的是证明这个问题的一个有效解决方案将给出一个TSP的有效解决方案,从而证明它是NP完全的(在这种情况下,这个解决方案和你将得到的一样好)。我相信这是事实,但这里还没有人证明这一点。这是相当复杂的。TSP直接适用。为什么要经历弗洛伊德·沃沙尔-1直到你进一步阐述。@笨蛋:维基百科的第一句话是:“任务是找到一个尽可能短的旅行路线,每个城市只访问一次”。这就是我的建议:允许将问题视为TSP问题,即使你必须多次访问每个广场。@Doc:我明白你的意思。我将删除-1。不过还是很复杂。我删除了一个空格,让我可以撤消-1。@白痴:如果你有更好的主意,让它“少一点”