确定最佳团队和阵型的算法?

时间:2012-05-29 19:03:26

标签: algorithm math language-agnostic

我正在寻找可以在运动队管理模拟器(例如曲棍球或足球)中使用的合适算法。模拟器的一些功能:

  • 球队可以使用不同阵型(例如足球4-4-2)。
  • 团队中的每位玩家都有一个数字等级,表明他们对阵地中每个位置的好坏程度。
  • 有一群不同能力的小队队员可以从中选择

可以使用哪些算法以编程方式有效地确定最强大的团队和阵型?

3 个答案:

答案 0 :(得分:8)

如果我们按图表对您的问题进行建模,并注意到不同编队的数量很少,则问题是maximum weighted bipartite matchingHungarian Algorithm可以解决这个问题,....

但是如何使用二分图来模拟问题?将玩家设置为一个部分,并将其定位为另一个部分(例如在足球中),形成一个玩家池并为他们定位11个位置,将所有玩家连接到所有位置,并将相应的边缘权重设置为该位置中的相应玩家等级

现在你应该做的就是在这个完整的二分图中找到maximum (weighted) matching。 (代码在维基链接中提供)。

我认为我们的阵型数量有限,对于每个阵型我们都可以找到相应的匹配图,然后是最大匹配,最后在所有可能的阵型中取最大值(在所有图中)。

答案 1 :(得分:3)

您可以尝试使用现有AI工具进行优化的启发式方法,例如Genetic AlgorithmsHill Climbing。 我会详细介绍登山,因为这是我的最爱。

将状态图表 G = (V,E)表示为V = {all possible states }E = {(u,v) | swapping one player you can move from u to v }
另外,让u:V->R成为一个形成的效用函数。
由于我们不想生成图表,因此next:V->2^V应该是next(v) = {all possible formation that you can get by changing one player }

的函数

登山的想法是从随机阵型开始,贪婪地做出最好的改变,当你遇到困难时 - 从一个新的随机阵型重新启动算法。

1. best<- -INFINITY
2. while there is more time
3. choose a random matching
4. NEXT <- next(s)
5. if max{ u(v) | for each v in NEXT} < u(s): //s is a local maximum
   5.1. if u(s) > best: best <- u(s) //if s is better then the previous result - store it.
   5.2. go to 2. //restart the hill climbing from a different random point.
6. else:
   6.1. s <- max { NEXT }
   6.2. goto 4.
7. return best //when out of time, return the best solution found so far.

请注意,这种爬坡变化(爬山随机重启)是 any time algorithm - 意味着当给予更多时间时会变得更好,并且当给予无限时间时 - 它创造了全球最大值。

答案 2 :(得分:1)

可以应用于您的问题的简单启发式算法是贪婪算法,其解释可以在http://en.wikipedia.org/wiki/Greedy_algorithm找到。

另一个解决方案是创建两个虚拟节点(开始和结束)并将您的玩家池视为有序图(首先是守门员,然后是右翼防御者,依此类推)。边缘将由所考虑位置的玩家评级组成。在这个场景中,您将有一个场景,您可以应用A *算法,您将在http://en.wikipedia.org/wiki/A*_search_algorithm找到其描述(请记住,最大化问题只是反函数的最小化)。