Algorithm 确定最佳团队和队形的算法?

Algorithm 确定最佳团队和队形的算法?,algorithm,math,language-agnostic,Algorithm,Math,Language Agnostic,我正在寻找适合我在运动队管理模拟器(如曲棍球或足球)中使用的算法。模拟器的一些功能: 球队可以采用不同的阵型(如足球队的4-4-2) 球队中的每个球员都有一个数字等级,来衡量他们在队形中每个位置的表现 有一批能力各异的队员可供挑选 哪些算法可用于以编程方式高效地确定最强大的团队和编队?可应用于您的问题的简单启发式算法是贪婪算法,其解释见 另一个解决方案是创建两个虚拟节点(开始和结束),并将你的玩家池视为有序图(首先是守门员,然后是右翼防御者,等等)。边缘将包括考虑中位置的球员等级。在此场景中

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

  • 球队可以采用不同的阵型(如足球队的4-4-2)
  • 球队中的每个球员都有一个数字等级,来衡量他们在队形中每个位置的表现
  • 有一批能力各异的队员可供挑选

哪些算法可用于以编程方式高效地确定最强大的团队和编队?

可应用于您的问题的简单启发式算法是贪婪算法,其解释见


另一个解决方案是创建两个虚拟节点(开始和结束),并将你的玩家池视为有序图(首先是守门员,然后是右翼防御者,等等)。边缘将包括考虑中位置的球员等级。在此场景中,您将有一个场景,可以应用a*算法,您将在中找到该算法的描述(请记住,最大化问题只是反函数的最小化)。

您可以尝试使用现有AI工具进行优化的启发式方法,如或。
我会提供更多关于爬山的细节,因为它是我的最爱

将你的问题表示为状态图
G=(V,E)
这样
V={所有可能的状态}
E={(u,V)|交换一个玩家,你可以从u移动到V}

同样,让
u:V->R
成为编队的效用函数。
因为我们不想生成图形,所以让
next:V->2^V
成为一个函数,这样
next(V)={通过改变一个玩家可以得到的所有可能的队形}

爬山的想法是从一个随机的队形开始,当你陷入困境时,贪婪地尽可能地做出最好的改变-从一个新的随机队形重新启动算法

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.

1。最好如果我们通过图形对问题进行建模,并注意到不同形式的数量很小,那么问题是

为了用二部图对问题进行建模,将球员放在一个部分,将位置放在另一部分(例如在足球中),形成一个球员池和11个位置,将所有球员连接到所有位置,并将相应的边权重设置为相应位置的球员等级

现在你要做的就是在这个完整的二部图中找到一个。(代码在wiki链接中提供)


我想我们的阵型数量是有限的,对于每个阵型,我们可以找到相应的匹配图,以及它的最大权重匹配,最后在所有可能的阵型上取最大值(在所有的图中)。

它闻起来是NP难的(尽管我没有想到减少)你想要启发式方法吗?是的,无论什么都能很快完成任务!如果它“简单”到在队形的每个位置都放上最高等级的球员,那么贪婪算法应该表现得相当好。我同意采用启发式方法,因为不需要考虑每一种不同的组合。@amit NP complete,我认为。可能和你有关,不是吗?非常感谢大家!很好的答案,我真的很高兴我现在问了这个问题。因为我觉得自己没有资格,所以我很难选择一个胜利者!A*是一种寻路算法,我不确定你在寻找什么路径,在这种情况下,目标节点是什么?我不确定我是否遵循了这一思路,您是否愿意详细说明\A*是一种启发式算法,用于查找两个节点之间的最小成本路径。目标将是我告诉您要创建的虚拟节点“end”。多条路径是每个位置的所有玩家之间的组合。不要担心组合爆炸,因为您只会探索一些路径(那些对于算法的每次迭代都有希望的路径)。这非常符合我的要求。谢谢