确定在概率上表示的2D网格上的最佳得分移动

时间:2014-02-19 02:31:22

标签: c++ algorithm math artificial-intelligence planning

我将此发布到StackOverflow,cstheory.stackexchange.com和math.stackexchange.com,因为我不确定它最合适的位置。我希望没关系。

我有一个2D网格(每个地图的大小不同,范围从10X10到20X20,必然是正方形),其中每个单元格包含每个单位(10到50取决于地图)的概率(0到1)就在那个地方。

有两种主要类型的单位,有大单位的行为由你希望帮助我的算法控制,并且有小单位只能移动或他们的(布尔)状态改变在大单位的帮助下。所有单位都属于团队,但任何大单位都可以移动任何小单位。根据较小单位的位置和状态对比赛进行评分。每个单位都知道自己的坐标。

在多个指定单元格中的任何一个单元中都有一个小单位可以获得积分,奖励的是相邻单元格占用的数量 - 注意邻接并不一定意味着相邻的单元格坐标,并且将根据地图确定。

我已经有了一个路径系统,因此这不是一个问题,也不是计算移动的时间成本,尽管出于性能原因这应该被称为最低限度。

我的目的是让计划系统输出一系列所需的状态/动作。例如,在(9,4)处以43度的角度,然后在(12,4)处12度并且在那里启用小单元。

我试图确定5个竞争主要单位中每个主要单位的最佳动作,以便在时间用完时优化其团队的完成位置。这些单元具有模拟传感器,用于填充概率位置,因此收集信息是一种有效的移动。

理想情况下,该算法会向前看一些动作,并考虑一个特定的动作是否能让你处于有利位置以执行下一步动作 - 这个位置的“好”只是路径的倒数成本。

性能在这里非常重要,我可能愿意交换解决方案质量以获得显着的性能提升。

到目前为止,我的想法是:

  • 最完整的解决方案是详尽的搜索,但性能会对此进行排除。

  • 我应该计算每个合理可能的当前状态的重要性,以便我可以确定哪些信息很重要。

  • 平均现代PC上每单位的运行时间应该<= 25ms(如果可能的话) - 不是一成不变的 - 这是C ++,所以它相当快。

  • 调整国际象棋算法可能是一个很好的方法。

  • 我很擅长这个,我应该问互联网。

  • 最好的办法几乎可以肯定是估计。

  • 如果有一个10%的几率有可能获得20倍的积分,那么值得承担风险 - 除非另一个举动几乎保证了良好的终结位置和时间差不多。< / p>

  • 我的问题有些冗长。

  • 我觉得到目前为止我一定有更多的想法,但我不能为我的生活思考它们是什么。

  • 最后一点押韵。

  • 如果你还在读这篇文章,那么我可能愿意嫁给你。

虽然如果有人提供完整的解决方案会很棒,但我绝对愿意接受我能得到的任何帮助/提示,​​并会接受让我走得最远的答案,无论多远与否。我对算法感兴趣而不是代码,我可以自己处理,因为我现在是一个大女孩。

2 个答案:

答案 0 :(得分:1)

您似乎遇到了大型状态空间和规则的问题 - 至少乍一看 - 并不是特别简单。我已经看到了两种声称的方法,这两种方法都涉及反复模拟前进时间 - 蒙特卡罗树搜索(http://en.wikipedia.org/wiki/Monte-Carlo_tree_search)和近似动态规划(http://adp.princeton.edu/Papers/Powell-NRLWhat%20you%20should%20know%20about%20approximate%20dynamic%20programming.pdf)。

蒙特卡洛树搜索记录了用于构建游戏程序的记录。

答案 1 :(得分:0)

老实说,我认为让这项工作最快捷的方法就是从简单开始建立起来。

我建议你从基本博弈论开始,尤其是game trees。设计一个可以玩这种游戏的玩家,向前看固定数量的动作。然后实现A *(“星形算法”)以使其更快。阅读启发式算法,在不解决整个未来树的情况下猜测一个州的价值。

然后尝试大大简化的预期游戏版本(例如,从两个团队开始,每个团队一个大单元,四个小单元,完美信息)。从那里,您可以一次添加一点复杂性。如果您遇到任何这些步骤,我将很乐意提供帮助(或者至少尝试一下)。