【发布时间】:2011-12-30 01:01:57
【问题描述】:
我在一个相对较小的二维网格上有许多点,它在两个维度上都环绕。坐标只能是整数。我需要将它们分成最多 N 个靠近在一起的点的集合,其中 N 将是一个很小的截止点,我怀疑最多 10 个。
我正在为游戏设计一个 AI,并且我 99% 确定在所有游戏片段上使用极小极大可以让我获得大约 1 步的可用预测,如果这样的话。但是远距离的棋子应该不会相互影响,直到我们通过大量的移动向前看,所以我想一次将游戏划分为N个子游戏的多个子游戏。但是,我需要确保一次选择合理的 N 件,即靠近在一起的件。
我不在乎异常值是自己留下还是与距离最短的集群混为一谈。分解大于 N 的自然集群是不可避免的,只需要在某种程度上是合理的。因为这是在响应时间有限的游戏 AI 中使用的,所以我正在寻找尽可能快的算法,并愿意在准确性与性能之间进行权衡。
有人对算法进行调整有什么建议吗? K-means 和亲戚似乎不合适,因为我不知道我想找到多少个集群,但我对我想要多大的集群有一个限制。我已经看到一些证据表明通过将点捕捉到网格来近似解决方案可以帮助一些聚类算法,所以我希望整数坐标可以使问题更容易。基于层次距离的聚类将很容易适应环绕坐标,因为我只是插入了不同的距离函数,并且也相对容易限制聚类的大小。我还有什么其他的想法吗?
我对算法比对库更感兴趣,尽管欢迎有关于其工作原理的良好文档的库。
编辑:我最初在为Fall 2011 AI Challenge 编写条目时提出了这个问题,遗憾的是我从未完成。我链接到的页面对游戏有相当简短的高层次描述。
两个关键点是:
- 每个玩家都有潜在的大量蚂蚁
- 每只蚂蚁每转一圈,向北、向南、向东或向西移动 1 个方格;这意味着游戏的分支因子为 O(4ants)。
在比赛中,每个机器人的回合也有严格的时间限制。我曾想过通过使用极小极大来接近游戏(回合实际上是同时的,但作为一种启发式,我认为这还可以),但我担心如果我考虑整个游戏,就没有时间向前看很多动作立刻。但是由于每只蚂蚁每回合只移动一格,因此两只蚂蚁不能通过最短路径相隔 N 个空间,因此可能会相互干扰,直到我们向前看 N/2 次移动。
因此,我正在寻找的解决方案是一次选择较小的蚂蚁组并分别选择每个组的最小最大蚂蚁的好方法。我曾希望这能让我在不损失太多准确性的情况下更深入地搜索移动树。但显然,使用非常昂贵的聚类算法作为一种节省时间的启发式算法是没有意义的!
我仍然对这个问题的答案很感兴趣,尽管我可以从这些技术中学到的东西比这次特定的比赛更多,因为它已经结束了!感谢到目前为止的所有答案。
【问题讨论】:
-
网格有多大? 10“关闭”是否意味着所有相邻或有间隙,例如围棋板上的组?
-
网格不同。我相信它多达数百个。接近我的意思是理想地彼此接近,而不是与不在分区中的部分接近。如果板上只有 10 块,一个隔板可以覆盖整个板。但如果有 20 个团块,则必须分成两组,每组 10 个;不应该有一个包含一些丛和一些更远的部分的组。
-
我认为你应该发布更多关于游戏规则以及棋子如何相互作用的细节。您首先需要创建这些组的假设可能是不正确的。
-
有多少只蚂蚁?进行
O(n^2)设置听起来还不错,如果它将第二步从O(4^n)减少到O(4^sqrt(n))左右。 -
@ThomasAhle 蚂蚁的数量在技术上是无限的。比赛主页ants.aichallenge.org有一个随机游戏的flash可视化;我刚刚看到的那只蚂蚁接近 300 只。
标签: algorithm cluster-analysis