要求算法找到N Knights全局最短路径

时间:2011-10-19 09:20:44

标签: algorithm chess shortest

我对一个奇怪的问题进行了抨击。

我有一个无界的棋盘,N个骑士的起始位置和N个目标位置。

任务是找到所有骑士到达所有目标位置的最小移动次数。

我知道单个骑士的最短路径问题可以通过广度优先搜索来解决,但是如何为多个骑士解决?

对不起我的英语,我很少使用它。

4 个答案:

答案 0 :(得分:2)

我假设您知道如何为一个Knigt做这件事。

您可以将问题重新表述为线性程序:

我将使用以下符号:

我们有N个骑士和N个位置。

xij = 1如果您选择骑士i去位置j,否则为

cij是移动骑士i到位置j的最小长度

然后您有以下线性程序:

  

<强>变量

     

在[0,N]中的i j的xij

     

成本函数:

     

C = SUM([0,N] x [0,N]中的(i,j)的cij.xij)

     

<强>约束:

     

SUM([1,N]中j的xij)= 1 //恰好一个knigt从i到j

     

SUM([1,N]中的i的xij)= 1

     

(矩阵(xij)是随机矩阵)

如果X是(xij)的矩阵你有n!可能的矩阵。这个problem可以是 NP-Hard (这个系统没有简单的解决方案,解决系统与测试所有可能的解决方案非常相似)。


修改

此问题称为assignment problem,并且在多项式时间内存在多种算法来解决它。 (查看@purav答案的例子)

正如@Purav所提到的那样,尽管这种问题可能是NP难的,但在这种情况下它可以在O(n ^ 3)中解决




关于@j_random_hacker引发的问题:

  

<强>问题

     

如果骑士在终点,那么下一个骑士就不应该   通过这个端点。所以Cij可能需要在之后进行更新   每个骑士都被移动了。

备注:

<强> 1。多条最佳路径:

由于棋盘侧面没有约束(ilimited chessboard),你执行移动以获得最短路径的顺序是不相关的,所以总是有很多不同的最短路径(我赢了'在这里做组合学。)

2名骑士的例子

假设您有2个K和2个端点('x'),绘制最佳路径。

    -x
   |
   | 
   x
   |
K-- --K

你将右边的K移动到第一个点(1个移动),第二个不能使用最佳路径。

    -x
   |
   |  
   K
   |
K-- --:

但是我可以很容易地创建一个新的最佳路径,而不是向右移动2向上然后向上移动2向右移动。 1可以向上移动2向右移动1向上移动1向右移动(反向移动)

   --K
  |
 -    
|   K
|   |
:    --:

以及路径的任何组合:

  

1 U 2 R然后2 U 1 R等...只要我保持相同的移动次数   向左下和向右,它们是有效的。

<强> 2。骑士被移动的顺序:

第二件事是我可以选择我的行动顺序。

示例:

如果我选择以左骑士开始并转到上端点,则使用上一个示例,不再有端点约束。

    -K
   |
   | 
   x
   |
:-- --K


    -K
   |
   | 
   K
   |
:-- --:

通过这两个评论,可能有可能证明没有计算下限不是最优的情况。

答案 1 :(得分:2)

您可以使用广度优先搜索计算Ricky建议的成本矩阵。所以现在,cost [i] [j]表示选择骑士i来转到结束位置j的成本。然后你可以使用Hungarian algorithm找到最终答案,可以用O(N ^ 3)复杂度计算。

答案 2 :(得分:1)

BFS仍然可以在这里工作。您需要稍微调整一下状态,但它仍然有效:

S成为可能的状态集:
S={((x1,y1),(x2,y2),...,(xn,yn))|knight i is in (xi,yi)}

对于S中的每个s,定义:
Successors(s)={all possible states, moving 1 knight on the board}

你的目标状态当然是你目标点的所有排列[你实际上不需要开发这些排列,只需检查你是否达到了所有方格都被“填充”的状态,这很容易检查] < / p>

start=(start_1,start_2,...,start_n)其中start_i是骑士i的起始位置。

来自start [每个骑士的初始位置]的BFS运行保证找到解决方案(因为BFS是complete]。它也保证是最短的解决方案。

(*)请注意单一骑士的情况是此解决方案的私有实例,n = 1。

虽然BFS会起作用,但需要花费很多时间!这里的branch factor是4n,因此算法需要开发O((4n)^d)个顶点,其中n是骑士的数量,d是解决方案所需的步数。

可能的优化:

  1. 空间:请注意,因为BFS使用了大量内存[O((4n)^d)] 想要使用Iterative Deepening DFS,其行为类似于BFS, 但消耗更少的内存[O(nd)],但需要更多时间才能运行。
  2. 时间:要加快解决方案搜索,您可以使用 A Star admissible heuristic function。找到一个也是有道理的 解决方案,如果存在,并确保找到的解决方案 最佳,并且可能[具有良好的启发式]需要开发 比BFS更少的顶点。

答案 3 :(得分:0)

所以,我找到了解决方案。

BFS在无限制的棋盘上效果不佳。使用任何最短路径算法都没有意义 - 骑士从位置a移动到位置b的数量可以在O(1)时间内计算 - M. Deza,Dictionary of Distances,p。 251

http://www.scribd.com/doc/53001767/Dictionary-of-Distances-M-Deza-E-Deza-Elsevier-2006-WW

使用mincost-maxflow算法(例如Edmonds-Karp)可以解决分配问题:

http://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm