【问题标题】:Algorithm to move balls from one set of buckets to another set in least amount of moves given a machine that can move unlimited balls in one move给定一台可以在一次移动中移动无限球的机器,以最少的移动量将球从一组桶移动到另一组的算法
【发布时间】:2020-05-05 10:44:22
【问题描述】:

我的一个朋友提出了一个问题,你有 n 个桶(a、b、c、...、n),每个桶都占你总球的一定百分比。然后,您将获得在问题结束时每个桶应该有多少球的细目。还为您提供了一台机器,它可以一次性将无限量的球从一个单一的桶移动到另一个单一的桶(例如,从桶 A 到桶 C 的 10 个球)。你会使用什么算法来确保你总是有尽可能少的移动次数?

我被这件事难住了。看起来它可以使用欧几里德算法的扩展来解决,但我完全不确定我将如何解决这个问题。我测试了尝试将两个最大/完美的问题桶相互匹配的明显答案,但这不起作用。任何指针都会有所帮助。

【问题讨论】:

  • 桶的大小是否有限制?

标签: javascript algorithm math


【解决方案1】:

我已经删除了我之前的回答。你考虑过子集和问题吗?我不确定它是否会为整个问题找到最佳解决方案,但这是我的想法。

对于每个桶,让差 =(目标球数)-(给定球数)。令 P 为一组正差值,N 为一组负差值绝对值。
从两个集合中选择下一个最大数,并在相反集合中寻找最小子集总和。如果找到子集,则移动球。否则,从集合中寻找下一个最大数的子集总和。

完成子集的查找后,考虑剩余的桶。将球从相对组的剩余两个桶之间移动。这将为其中一个存储桶创建新的差异。有可能用新的差值形成一个新的匹配子集和。使用新形成的差异再次搜索子集总和。重复直到所有的桶都有目标数量的球。

我不确定是否总是考虑最大的存储桶可以保证最优性。如果您找到正确的解决方案,请告诉我们!

【讨论】:

  • 如果您可以将桶配对,那么 n/2 次移动就足够了。
  • 这是在正确的轨道上,但是如果有 x 桶的球太多而 y 的球太少,那么你只需要某个地方在 MAX(x, y) 和 x + y 之间 - 1 次移动,从不 x i> + y 移动。 (这是对 QuentinUK 评论的概括。)
  • 你是对的,少于 n 步。我会更正我的答案。
  • 您的回答根本没有解释这些动作。多少钱放在哪里?
  • 仔细想想,我的回答是错误的。我不考虑可以配对的存储桶。让我再试一次,我会改变我的答案。
【解决方案2】:

使用启发式函数在可能移动图上使用 A*:与其目标存储桶不同的存储桶数除以 2。那是b/2,其中b 是其中包含错误数量的桶的数量。

A* 通常被认为是游戏中类似路由单元的寻路算法,但它适用于任何您可以找到永远不会高估目标节点距离的启发式算法的图。最重要的是,拥有这种启发式的 A* 总是会找到最短路径。借用博弈论,我们可以想象一个图,节点通过链接连接,其中每个节点是球在桶之间的可能分布,每个链接代表机器可以进行的合法移动。您的起始节点是球的起始分布。您的目标节点是球的目标分布。

使用此图,我们可以应用呼吸优先搜索并等待,直到我们碰巧访问了目标节点。这将为我们提供从开始分布到目标分布的最短移动集,因为它是呼吸优先搜索。 (在这种情况下,这或多或少等同于 Dijkstra 的算法,因为每一步的成本(长度)相同,为 1 步)

但是,我们可以做得更好。 A* 使用启发式搜索图。具体来说,它就像呼吸优先搜索,除了下一次访问离起始节点最近的未访问节点之外,A* 下一次访问未访问节点,它最小化 g(n) + h(n) 其中g(n) 是未访问节点的长度节点n 到起始节点,h(n) 是从未访问节点n 到目标的距离的启发式方法。这意味着当我们首先检查明显的目标路径时,通过“远离”目标来寻找最佳路径的计算时间更少。已经在数学上证明,如果您能找到一个可以接受的启发式算法,A* 将为您提供从起始节点到目标节点的最佳路径,这意味着永远不会高估目标距离的启发式算法。例如,在电子游戏中,两点之间的可步行路径的长度总是大于或等于苍蝇距离。尽管我们的图不是表示物理空间的图,但我们仍然可以找到一个可接受的启发式方法。

一个动作最多只能让2个桶有正确数量的球,因为一个动作最多只能影响两个桶。因此,例如,如果我们计算我们的桶并看到 4 个桶中的球数错误,那么我们知道至少需要 2 次移动。可能更多,但不能少于 2。

让我们的启发式为“错误球数除以 2 的桶数”。

我们的启发式并没有高估获得所需数量的球所需的移动次数,因为即使是匹配快乐配对的最佳移动方式也可能发生在您只会与我们的启发式匹配的每一步。我们的启发式低估了经常移动,但这没关系,计算会花费更长的时间,但不会得到错误的结果,移动的结果计划仍然是最短的。因此,我们的启发式是可以接受的,这意味着它永远不会高估移动的数量。

因此,具有“错误球数除以 2 的桶数”的启发式 A* 将始终找到到达分布的最短移动数。

也许可以找到更好的启发式,如果是这样,那么搜索会更快。这只是我想到的第一个启发式方法。

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多