帮我找出使用Python和PostgreSQL的随机调度算法

时间:2009-04-05 23:34:33

标签: python postgresql

我正在尝试为我的模拟棒球队做下一季的赛程安排。我有一个包含旧计划的现有Postgresql数据库。

数据库中有648行:24个团队的27周系列。问题是时间表已经可以预测,并且允许团队提前知道他们的日程安排的薄弱部分。我想要做的是采用现有的时间表并随机化。这样,球队仍然相互播放适当的次数,但与之前的顺序不一样。

有一条规则让我沮丧:每支球队每周只能打一个主场和一个系列赛。我一直在使用基于ORDER BY RANDOM()的SELECT语句,但我还没弄清楚如何确保团队每周只有一个家庭和一个道路系列。

现在,我可以在PHP中执行此操作(这是我最熟悉的语言)但是我正在尝试转换到Python,因此我不确定如何完成此操作在Python中。我知道Python似乎不能很好地处理二维数组。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您是否考虑过保持相同的“时间表”,并且只是改变了团队?生成一个可以让每个人互相播放适当次数的时间表,但是如果你已经有了这样的时间表,那么只需要改组球队就容易得多。

您可以保留当前的表格,但用ID(0-23或AX,或其他)替换其中的每个团队,然后随机生成另一个表格,您可以在其中为每个ID分配每个团队(0 = TeamJoe, 1 = TeamBob等)。然后,当明年再次洗牌时,只需重新生成该映射表。

不确定这是否以你想要的方式回答问题,但可能就是我想要的(实际上我是如何在我的幻想足球网站上做到的)。

答案 1 :(得分:1)

我不确定我是否完全理解这个问题,但我会这样做: 1.创建需要发生的完整匹配列表 2.迭代几周,选择本周需要进行的比赛。

您可以使用Python列表来表示仍然需要发生的匹配,并且,对于每周,您可以使用本周发生的匹配。

在第2步中,选择要发生的匹配将以这种方式工作: 一个。使用random.choice选择要发生的随机匹配。 湾使用random.choice([1,2])确定哪支球队有本轮比赛的回合(如果它可能是任一球队的本垒打) C。暂时删除此选择阻止的所有匹配项。如果其中一支球队本周已经有两场比赛,或者如果两支球队本周都有主场比赛,或者两支球队本周已经有一场比赛,那么比赛就会被阻止。 d。如果一周内没有可用的比赛,请继续下周,阅读前一周被阻止的所有比赛。

答案 2 :(得分:1)

我想我已经正确地理解了你的问题,但无论如何,你可以利用Python的set数据类型和生成器功能:

import random

def scheduler(teams):
    """ schedule generator: only accepts an even number of teams! """
    if 0 != len(teams) % 2:
        return

    while teams:
        home_team = random.choice(list(teams))
        teams.remove(home_team)
        away_team = random.choice(list(teams))
        teams.remove(away_team)
        yield(home_team, away_team)

# team list from sql select statement
teams = set(["TEAM A", "TEAM B", "TEAM C", "TEAM D"])

for team in scheduler(teams):
    print(team)

这使SQL处理保持在最低限度,应该很容易添加到新规则中,比如我不理解的那些;)祝你好运

修改

啊,现在更有意义,应该少喝一杯!在这种情况下,我肯定会推荐NumPy。看看tutorial,看看你正在抓住随机灯具时消耗二维主场球队阵列。最好是将主场和客场球队从主场送到客场比赛,这样你就可以确保每支球队每周都在主场和客场比赛。