【问题标题】:Understanding Depth-First Branch and Bound implementation to StarCraft 2了解星际争霸 2 的深度优先分支和绑定实现
【发布时间】:2021-02-19 07:22:13
【问题描述】:

问题是我发现很难理解 DFBB 是如何工作的,这种情况下参数和输出应该是什么。

我正在为《星际争霸 2》游戏创建一个 AI,它将处理游戏中的构建顺序(用于人族团队)。我计划遵循链接中描述的方法(见下文),该方法遵循了我想要的非常相似的方法。总结一下我打算做什么:

将给我一份需要建造的不同类型建筑物的清单。建筑需要消耗矿物和天然气(这是游戏中的货币),一些建筑有先决条件(这意味着在建造它之前需要建造其他建筑)并且它们需要一定的时间来建造。

在文章中,他们使用深度优先分支和绑定来确定最佳构建顺序,这意味着构建该列表中建筑物的最快方式。这是他们的伪代码:

其中状态 S 由 S =(当前游戏时间、可用资源、正在进行但未完成的操作、工人收入数据)表示。 S´ 是如何派生的,在文章中有描述,它是通过三个函数完成的,所以我明白了。

如前所述,我正在努力理解起始状态 S、目标 G、时间限制 t 和界限 b 应该在他们描述的伪代码中表示。

我只知道三件事:需要建造的建筑清单、我目前拥有的消耗品(矿产和天然气)、资源(即我在游戏中已经拥有的建筑)。然后应该以某种方式将其应用于算法,但不清楚该函数的输入应该是什么。输出应该是一个按正确顺序排序的列表,所以如果我按照它们进入的顺序在哪里建造建筑物,那么它应该会全部解决,并且应该是可以完成的最佳时间。

例如,我是否应该遍历列表建筑物并在每个元素上运行 DFBB,目标是查看建筑物是否可以建造。但是,时间限制也应该设置什么,在这种情况下,bound 意味着什么?仅仅是成本吗?

请解释这个函数应该如何在列表中运行,以便找到构建它的最佳路径。这篇文章相当容易阅读,但我需要一些帮助来理解它的工作原理以及如何将它应用到我的问题中。

文章链接:https://ai.dmi.unibas.ch/research/reading_group/churchill-buro-aiide2011.pdf

【问题讨论】:

    标签: python algorithm search artificial-intelligence depth-first-search


    【解决方案1】:

    Starting Status S 是游戏开始时的初始状态。我相信你有 100 个矿物和指挥中心,还有 12 个? SCV,这就是你的开始。

    这里的目标是您想要拥有的建筑物列表。满足条件是所有的目标都在S中。

    时间限制是您愿意花费的时间来获得结果。如果你将它设置为 5 秒,它可能会给你一个次优的解决方案,但它会在 5 秒内完成。如果算法完成搜索,它将更早返回。如果您不在乎,请忽略它,但请确保将解决方案写入文件以防万一。

    Bound b 是游戏内构建所有东西的时间限制。您最初将其设置为无限或某个明显的值(例如 10 分钟?)。当您找到解决方案时,b 会更新,因此您找到的每个新解决方案都必须比之前的解决方案更快(在游戏中)。

    一些笔记。确保可能的操作(步骤 9 中的子项)包括什么都不做(等待更多资源)和构建 SCV。

    可能缺少的另一件事是对 SCV 移动速度的正确建模。这些单位需要搬到一个地方建造一些东西,他们也需要时间才能重新开始采矿。

    【讨论】:

    • 很好的解释!我只有一件事我不明白,然后我想我得到了一切。这棵树看起来如何 S 或者它如何找到它的孩子?例如,如果我有一个非常简单的列表 [工厂、地堡、供应仓库、兵营]。工厂和地堡需要军营,军营需要补给站。假设我们拥有建造 Supply Depot 所需的一切。我假设我们遍历列表并发现我们只能构建 Supply depot,我们将其更新为绑定,然后我们来到 else 语句。我是否使用“预制”版本的科技树来寻找孩子?
    • 另外一个问题是 S 如何存储我们正在寻找的补给站的孩子。正如他们在文章 S =(当前游戏时间、可用资源、正在进行但未完成的操作、工人收入数据)中描述的那样,所以我不明白它如何知道它正在寻找供应站的解决方案。
    • 所以 S 是状态(就像你说的,游戏时间,资源等......)。在这种情况下,“树”是隐含的。孩子们是可能的行动(什么都不做,建造 SCV,建造 Baracks 等等) 孩子们导致的新状态是在你采取那个行动之后发生的事情(即如果你什么都不做,游戏时间会提前一个有点,你有更多的资源,建设进度更进一步,如果你选择建造一个兵营,你就会少一个矿工,一个兵营正在进行中,完成率为 0%,等等......)
    • 好的,我明白了。我有最后一个问题。在第 11 行,他们为什么将父状态保存在新状态中。它在新状态下保存在哪里(什么参数),为什么需要?我在想只做 S'
    • @Programming_Zeus 这只是为了构建解决方案,因为以前的状态并不总是很明显。您还可以拥有一堆状态并复制它,以保存解决方案。如果您不关心重建解决方案,您可以完全跳过它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多