【发布时间】:2013-07-21 02:50:05
【问题描述】:
一些背景:
在排球比赛中,球员们在台球中进行比赛以确定排名。团队是成对的玩家。比赛是一对球员对另一对球员。对于这个例子,假设只有一个球场可以进行比赛,当一名球员不比赛时,他们正在坐下/等待。池中的玩家人数将在 4 到 7 之间。如果池中有 8 名玩家,他们会将其分成 2 个 4 人池。
我想计算最少的比赛次数,以便每个玩家与其他玩家一起玩。
例如,一个 4 人池将有以下球队:
import itertools
players = [1,2,3,4]
teams = [t for t in itertools.combinations(players,2)]
print 'teams:'
for t in teams:
print t
输出:
teams:
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
以及匹配的数量:
matches = []
for match in itertools.combinations(teams,2):
# A player cannot be on both teams at the same time
if set(match[0]) & set(match[1]) == set():
matches.append(match)
for match in matches:
print match
输出:
((1, 2), (3, 4))
((1, 3), (2, 4))
((1, 4), (2, 3))
这是正确的,但是当我将第 5 个玩家添加到池中时,此算法会中断:
((1, 2), (3, 4))
((1, 2), (3, 5))
((1, 2), (4, 5))
((1, 3), (2, 4))
((1, 3), (2, 5))
((1, 3), (4, 5))
((1, 4), (2, 3))
((1, 4), (2, 5))
((1, 4), (3, 5))
((1, 5), (2, 3))
((1, 5), (2, 4))
((1, 5), (3, 4))
((2, 3), (4, 5))
((2, 4), (3, 5))
((2, 5), (3, 4))
团队多次重复。
我试图保留一份参赛球队的名单,但该算法被证明是贪心的。我的意思是当它到达(1,5)队时,所有其他队[(2,3),(2,4),(3,4)]已经参加过比赛并且(1,5)永远不会玩。
我在寻找什么:
((1,2), (3,4)) (player 5 waits)
((1,3), (2,5)) (player 4 waits)
((1,4), (3,5)) (player 2 waits)
((1,5), (4,2)) (player 3 waits)
((2,3), (4,5)) (player 1 waits)
为每个池大小手动计算会更容易,还是可以在 python 中轻松完成?
感谢您的帮助!
编辑: 删除了 Python 标记。任何语言都可以,我可以将其转换为 Python。
【问题讨论】:
-
你所说的“一起玩”是指“在同一个游戏中玩”、“在同一边玩”还是“玩对抗”?
-
@user2357112 - “一起玩”我的意思是在同一边玩。例如,球队 (1,2) 将只与 5 名球员池中的另一支球队比赛。预计他们不会与其他所有球队比赛。
-
另外 - 它开始看起来像一个 6 人池,至少一个团队将一起玩两次。
-
有人能解释为什么这会得到很多赞成吗?我发现它是一个没有信息的标题,而且粗体的问题甚至与 Python 无关。这是一个有趣的问题,但除非措辞不同,否则不属于这一类。
-
@Dualinity:Python中有示例代码,OP正在寻找Python中的解决方案。标签是正确的。至于赞成票,他们可能在那里,因为这是一个有趣的问题。