【问题标题】:Moving N Kings on chess board在棋盘上移动 N 个国王
【发布时间】:2021-12-15 18:24:28
【问题描述】:

假设我们有一个棋盘(任意大小)和最初放置在 N 个方格上的 N 个国王。让我们假设现在我们选择 N 个新方格将国王移动到一系列合法移动(没有冲突)。目标是最小化所有国王移动的总距离。我真的想不出一种算法/适应可以处理移动所有部分,同时注意防止“碰撞”国王。该算法应该比递归地选择目标方块和选择最小传输更快。我希望有人对这个问题有宝贵的建议。

谢谢

【问题讨论】:

  • 澄清一下,这里的碰撞是指两个棋子在同一个方格上,而不是相邻或在国际象棋中的捕获能力?
  • 所有国王在每一步都一起移动吗?所有的国王都需要在每一步移动吗?或者他们可以在路上静止不动吗?目标方格是分配给各个国王,还是由算法决定哪个国王应该去哪个目标?当电路板接近满员时,问题会变得非常棘手。
  • 玩家一次只能移动一个国王,没有捕获,因此不允许与其他棋子碰撞。

标签: algorithm chess


【解决方案1】:

以下算法应该可以工作:

  1. 找到离最近的国王更远的目标方格。
  2. 将最近的国王移至该方格。 (不会发生阻塞,因为一个国王必须更接近才能阻挡另一个国王)
  3. 重复直到所有国王都被移动到一个目标。

在 #2 中,目标中的国王可能会阻止未移动的国王,但我不确定这是否会发生。


经过进一步思考,我很清楚,我上面的算法更像是一种贪婪方法启发式,而不是确定性解决方案。我可以很容易地想出一个无法产生最佳解决方案的示例。

考虑当 N=4 在 [(1 to 5)x(1 to 5)] 板上时:

  • K = {(2,2), (3,4), (4,3), (5,5)} 和
  • T = {(1,1), (1,2), (2,1), (3,3)}

我的算法将首先尝试将 K:{(2,2), (3,4), (4,3)} 之一移动到 T:(3,3),这是错误的。它应该将 K:(5,5) 移动到 T:(3,3) 并且可能不是第一个。

【讨论】:

  • 所以我们必须根据最近的国王对方格进行分组,以便为​​每个国王找到最东边的方格?
  • @Ian_L 抱歉,打错了。 “最远的地方
  • ♚T♚T。您需要将右王向右移动,然后将左王向右移动。所提出的算法没有选择正确的序列。
【解决方案2】:

首先,您需要找到所有国王和所有目标方格之间的最小总距离完全二分匹配。您可以将其重铸为maximum weight bipartite matching,通过将每个距离替换为权重(something_big-distance),然后找到最大权重二分匹配,或者您可以保持匹配完成的不变量并直接找到最小二分匹配。

我认为最简单的方法是使用Edmonds-Karp Algorithm。这通常用于查找最大流量,但最大权重二分匹配本质上是该问题的一个实例,一旦您添加了单个源和汇顶点。

一旦你找到了国王和他们的目标方格之间的匹配,你就可以移动国王了。只要您沿着最短路径移动每个国王,并且您不会将国王移动到已经被占用的方格上,那么按什么顺序排列它们并没有太大区别。如果国王想要移动到被占领的方格,有两种选择:

  1. 如果挡道王尚未到达目标方格,则只需移动那个方格即可。
  2. 如果路王已经在其目标方格上,则在您要移动的王和路王之间交换目标。然后移动王道。这不会改变您必须进行的总移动次数。

当然,路中之王也可能有路中之王,因此请再次应用这些规则,直到找到可以移动的王。

现在你可能想知道如果每一个必须移动的国王都有一个国王,该怎么办。这只有在所有国王都想在循环中移动的循环中才会发生……但这不可能发生。

围绕一个循环移动所有的国王需要移动,但不会改变棋盘的状态。因此,这种情况意味着您在原始映射中找到的路径集不是最小的。因为它们最小的,所以这样的条件是不可能的。

【讨论】:

  • 非常好。我在匹配方面遇到了麻烦,但循环参数澄清了任何歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多