我参与的一个体育俱乐部向我寻求帮助,为即将到来的比赛提供一些IT支持。
比赛由球队组成,其中确切的数字在比赛日之前不一定知道。因此需要软件帮助。
所有团队将在许多匹配中与其他所有团队见面。因此,匹配的数量是 N over 2 (2的所有组合),其中N是团队的数量。
我们有一个未知数量的可用法院来玩比赛。可能这个数字将是1或可能是2,但我想要一个普遍的解决方案。
比赛将进入转弯。在每次转弯时,每个球场会有一场比赛。
例如,如果有两个球场和五个球队(A,B,C,D,E),转弯布局可能如下所示:
Turn Court 1 Court 2 -------------------------------- 1 A vs B C vs D 2 A vs C D vs E 3 A vs D B vs E 4 B vs D C vs E 5 A vs E B vs C
因此,我的问题是找到一个生成一组符合以下简单规则的转弯的算法:
规则1和2非常简单,我已经有了解决方案。规则3给了我一些问题。我会尝试展示它的含义:
假设我有5支球队(如上所述)但只有1支球队。超过10回合有10场比赛。 一种可能的布局是
Turn Court 1 1 A vs B 2 A vs C 3 A vs D 4 A vs E 5 . . . . . 10 .
在这种情况下,A打前四场比赛是不公平的,因为他们没有机会在比赛之间恢复精力。 这是我想要避免的。
想法?
答案 0 :(得分:5)
一个简单的贪婪解决方案,每个团队都有疲劳价值。
首先,所有球队的疲劳都设置为0.在转弯nr 1,为不同的球场执行初始比赛,并为这些球队设定与当前回合相同的疲劳值(首先是1)匹配)。
反过来,nr 2选择那些没有相互比较并且与之匹配的疲劳程度最低的队伍(通过保持队伍在优先队列中)。将疲劳值设置为当前转弯值。
举个例子,你会得到:
Turn Court 1 Team:fatigue
0 - A:0 B:0 C:0 D:0 E:0
1 A vs B C:0 D:0 E:0 A:1 B:1
2 C vs D E:0 A:1 B:1 C:2 D:2
3 E vs A B:1 C:2 D:2 E:3 A:3
4 B vs C D:2 E:3 A:3 B:4 C:4
5 D vs E A:3 B:4 C:4 D:5 E:5
6 A vs C B:4 D:5 E:5 A:6 C:6 // Dont match A with B since they already played, jump to team C
.
让新球队始终保持领先。既然你可能不会有超过100支球队,那就足够了。
答案 1 :(得分:1)
懒惰的方法是使用您当前的解决方案,然后将时间段(演示文稿中的行)随机化X次,同时跟踪一些疲劳标准并存储到目前为止找到的最佳解决方案。通过其他解决方案,您需要小心,您可以充分利用所有法院。