我对一个奇怪的问题进行了抨击。
我有一个无界的棋盘,N个骑士的起始位置和N个目标位置。
任务是找到所有骑士到达所有目标位置的最小移动次数。
我知道单个骑士的最短路径问题可以通过广度优先搜索来解决,但是如何为多个骑士解决?
对不起我的英语,我很少使用它。
答案 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是解决方案所需的步数。
可能的优化:
O((4n)^d)
]
想要使用Iterative Deepening DFS,其行为类似于BFS,
但消耗更少的内存[O(nd)
],但需要更多时间才能运行。答案 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)可以解决分配问题: