我正在寻找可以在运动队管理模拟器(例如曲棍球或足球)中使用的合适算法。模拟器的一些功能:
可以使用哪些算法以编程方式有效地确定最强大的团队和阵型?
答案 0 :(得分:8)
如果我们按图表对您的问题进行建模,并注意到不同编队的数量很少,则问题是maximum weighted bipartite matching,Hungarian Algorithm可以解决这个问题,....
但是如何使用二分图来模拟问题?将玩家设置为一个部分,并将其定位为另一个部分(例如在足球中),形成一个玩家池并为他们定位11个位置,将所有玩家连接到所有位置,并将相应的边缘权重设置为该位置中的相应玩家等级
现在你应该做的就是在这个完整的二分图中找到maximum (weighted) matching。 (代码在维基链接中提供)。
我认为我们的阵型数量有限,对于每个阵型我们都可以找到相应的匹配图,然后是最大匹配,最后在所有可能的阵型中取最大值(在所有图中)。
答案 1 :(得分:3)
您可以尝试使用现有AI工具进行优化的启发式方法,例如Genetic Algorithms或Hill 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找到其描述(请记住,最大化问题只是反函数的最小化)。