这个问题指的是Google赞助的AI Challenge,这是一个每隔几个月发生的竞赛,竞争者需要提交一个能够自主玩其他机器人玩家游戏的机器人。刚关闭的比赛被称为“蚂蚁”,如果您有兴趣,可以阅读其所有规范here。
我的问题是针对 ants 的一个方面:combat strategy。
给定一个离散坐标网格[像棋盘一样]并且假设每个玩家在每个回合都有许多蚂蚁:
一个直观的例子:
在这种情况下,黄色的蚂蚁将向西移动,橙色的蚂蚁,不能移开[蓝色瓷砖阻挡]将有两个黄色的蚂蚁“在范围内”并将死亡(如果解释仍然不清楚,我邀请您访问link above以查看更多示例并解释方案。
我的问题主要是关于复杂性。我对这个问题进行了广泛的思考,但我仍然无法想出一个可以接受的方法来计算合理时间内的最佳动作。在我看来,为了为我的蚂蚁找到最好的一组动作,我应该评估每种可能情景的结果,但由于战斗可能会非常拥挤,这意味着计算时间会呈指数增长({{1 n是所涉及的蚂蚁的数量)。
这种方法的另一个限制是,正在处理的解决方案并没有提高其计算时间成功的效率,因此任意中断其执行可能会让您失去非可接受的解决方案。
我怀疑通过一些几何考虑可以找到一个好的解决方案结合线性代数,(也许可以为蚂蚁群计算一些“重心”?)但我无法通过这个“直觉”的水平......
所以,我的问题归结为:
如何在现代机器上以约50-100毫秒的计算时间找到[近似]最优解的问题(这个数字是由官方竞赛规则推导出来的)?
如果您对此问题感兴趣并需要一些灵感,我强烈建议您观看一些可用的game replays。
答案 0 :(得分:2)
我认为你的问题可以通过解决问题来解决。 而不是计算最佳动作 - 每个蚂蚁 - 你可以在你的游戏板上按照离散位置计算最佳移动候选者。
这将以线性方式扩展 - 但在不提供最佳个人运动方面有一些折衷。
也许值得一试:)
答案 1 :(得分:2)
当然,使用几何可以简化问题:邻域中蚂蚁的相对位置比绝对位置更重要。而且light_303的解决方案也是我提出的搜索模式的补充。
答案 2 :(得分:1)
来自OP的编辑:
我选择这个答案被接受为比赛的获胜者发布了他的代码的事后分析,实际上他遵循了这个答案的作者建议的方法。您可以阅读获奖者的博客文章here。
对于这类问题,通常会使用MinMax algorithm alpha beta pruning。 (*)[minmax和alpa beta prunning的简单解释在最后,但是更多细节,也应该阅读维基百科页面]。
为了克服你提到的关于极大数量可能移动的问题,常见的改进是迭代地进行minmax算法。首先,您将探索所有节点,直到深度为1,并找到最佳解决方案。如果你还有一些时间:探索所有节点直到深度2,现在选择一个新的更明智的最佳解决方案,依此类推......
不合时宜时:在您探索的最后一级提供最佳解决方案。
为了进一步改进您的解决方案,您可能希望重新排序您开发的节点:对于迭代i,在迭代(i-1)中对节点进行排序[按每个顶点的启发式值]并根据顺序探索每种可能性。如果您首先研究“最佳”解决方案,那么它背后的想法是您更有可能修剪更多顶点。
这里的问题仍然是找到一个良好的启发式功能,评估“状态有多好”
(*)MinMax算法很简单:你可以探索游戏树,然后决定你将为每个状态做些什么,以及你的对手最有可能为每个动作做些什么。这样做直到深度k
,其中k被赋予算法。
alpha beta prunning是minmax的补充,它告诉你“不应再探索哪些节点,因为我不会选择它们,因为我有更好的解决方案”
答案 3 :(得分:0)
我的问题主要是关于复杂性。我想到了这个 问题广泛,但我仍然无法接受 在合理的时间内计算出最佳动作的方法。
完全!
这是 AI 比赛。 AI处理的问题太多复杂,需要通过最佳算法解决。
所以你必须尝试“东西”,就像你对重心的想法一样。更好的是一些遗传算法,通过自然选择找到更好的策略(但很难建立一些不断发展的“框架”)。
顺便说一句:你可以看到当前领导者的blog,他的策略非常简单。