Algorithm 使用什么算法来计算建造建筑物的最快顺序?

Algorithm 使用什么算法来计算建造建筑物的最快顺序?,algorithm,Algorithm,对于我正在玩的一个游戏,我想知道建造一些建筑的最快顺序。有问题的游戏是OGame,如果你熟悉它,那么这是一个加号,但显然我会解释游戏的基本原理: 玩家有许多不同的可用资源 玩家可以建造建筑物,一次最多建造一座 建筑有不同的标高,例如建筑A标高1、建筑A标高2等 建造建筑物的资源成本每层都会增加 建筑也需要花费时间来建造,这也会在每一层增加 一些建筑产生不同的资源,这也会按等级增加 一些建筑改变了计算,使得建筑的建造速度更快 我明确选择不显示方程,因为它们不是直接的,不需要建议算法 我选择通过

对于我正在玩的一个游戏,我想知道建造一些建筑的最快顺序。有问题的游戏是OGame,如果你熟悉它,那么这是一个加号,但显然我会解释游戏的基本原理:

  • 玩家有许多不同的可用资源
  • 玩家可以建造建筑物,一次最多建造一座
  • 建筑有不同的标高,例如建筑A标高1、建筑A标高2等
  • 建造建筑物的资源成本每层都会增加
  • 建筑也需要花费时间来建造,这也会在每一层增加
  • 一些建筑产生不同的资源,这也会按等级增加
  • 一些建筑改变了计算,使得建筑的建造速度更快
我明确选择不显示方程,因为它们不是直接的,不需要建议算法

我选择通过以下行动对此进行建模:

  • StartUpgradeBuildingAction:此操作通过从可用资源中减去成本来启动升级过程
  • FinishUpgradeBuildingAction:此操作通过及时执行来完成升级过程。这也产生了资源
  • WaitAction:此操作将时间向前移动X秒,同时根据资源生产生成资源
应该注意的是,状态空间是无限的,其特点是最终配置有多条路径(所有请求的建筑都已建成),每一条路径可能需要不同的时间,最终使用的资源量也不同。现在我最感兴趣的是最快的路径(顺序),如果有多条相等的路径,那么成本最低的路径应该是首选路径

我已经尝试过以下方法:

  • 广度优先搜索
  • 深度优先搜索
  • 迭代深化深度优先搜索
  • 迭代深化A*搜索
  • A*搜索
不幸的是,所有这些算法要么耗时太长,要么占用太多内存

由于谷歌没有给我任何进一步的线索,我在此提出以下问题:

  • 是否存在与我的问题相匹配的现有模型?例如,我认为业务信息系统已经遇到了这类问题
  • 是否存在提供最佳解决方案的算法?如果是,哪一个
  • 是否有一种算法可以给出接近最佳解的解?如果是,哪一个

感谢您的帮助。

没有一种算法可以为您的问题提供最佳解决方案。你尝试过的方法都是合理的。然而,尝试*搜索并不意味着什么,因为*搜索依赖于评估特定配置的启发式(即,它为经过的时间量、建筑数量和选择、可用资源等的组合赋值)。有了一个好的启发式,a*搜索可能会让你很快找到一个非常好的解决方案。找到这种启发式需要对参数(建筑成本、升级效益等)有很好的了解

然而,我的感觉是,您的问题是以这样一种方式构造的,即一系列构建决策在经过少量步骤后,明显优于另一系列决策。假设你按照这个顺序建造A、B和C楼。只要所需的资源可用,您就可以构建每一个。然后你尝试C,A,B的顺序。你可能会发现一个方案比另一个方案占主导地位,因为你拥有相同的建筑,但在一个方案中你比在另一个方案中拥有更多的资源。当然,如果您有许多不同的资源,那么这种情况就不太可能发生。您可能有更多的资源X,但Y更少,这使得情况更难比较。如果可能的话,好的方面是你不需要启发式,但是你可以清楚地看到你应该走哪条路,切断哪条路


不管怎样,我将探索在找到基于这种考虑可以忽略的路径之前需要多少步骤。如果您发现它们很快,那么遵循广度优先策略并尽快修剪分支是有意义的。深度优先搜索可能会带来花费大量时间探索劣质路径的风险。

企业愿意接受一个足够好的答案,该答案更快或需要更少的内存来解决。只要足够好,试着先建造提供资源的建筑,然后再建造其他建筑。当你没有资源来建造任何东西时,不要忘记考虑浪费的时间。难道不需要注意不要落入“山谷”陷阱吗?当前最佳解决方案的每一种可能的变体都更差,但更分散的变体可能值得一试吗?@Jongware,嗯,在广度优先战略中,这种情况不应该发生,因为您永远不会忽略不同的变体(只要它们没有明显地被另一个分支控制),而是并行地探索它们。但是可以肯定的是,如果你缩小了一个有希望的分支,那么如果你在分支内无法再提高,你必须确保再次回溯。(啊-局部最优是我所理解的短语。)是的,彻底的广度优先避免了这一点。我起初认为你只是建议把它作为最后的手段。所以你可能会发现自己陷入局部最优,深度优先,回溯不够远。(我想到这一点是因为我正在考虑一种遗传算法,听起来很容易陷入其中。)