You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OR-Tools体育排程约束建模求助:球队参赛及场馆容量约束

OR-Tools体育排程约束建模方案

1. 每支球队每周仅参赛1次

不需要额外引入played变量,直接基于已有的schedule变量构建约束即可。对于每个分区h、球队i、周次k,球队i要么作为主队(对应schedule[h,i,j,k,l]中j > i的情况),要么作为客队(对应schedule[h,j,i,k,l]中j < i的情况),所有这些变量的总和需等于1(确保每周参赛恰好1次):

# 约束:每支球队每周仅参赛1次
for h in range(divisions):
    for i in range(teams_per_division):
        for k in range(weeks):
            # 收集球队i所有可能的参赛情况:作为主队或客队,所有场馆
            game_instances = []
            # 作为主队,对手j > i
            for j in range(i + 1, teams_per_division):
                for l in range(venues):
                    game_instances.append(schedule[h, i, j, k, l])
            # 作为客队,对手j < i
            for j in range(i):
                for l in range(venues):
                    game_instances.append(schedule[h, j, i, k, l])
            # 总和等于1,确保每周恰好参赛1次
            model.Add(sum(game_instances) == 1)

若需求为每周最多参赛1次(允许轮空),只需将==1改为<=1。

2. 场馆每周最多举办指定数量赛事

假设max_games_per_venue_per_week为每个场馆每周的最大赛事数,对每个场馆l、周次k,所有分区、所有球队组合的赛事总和不能超过该上限:

# 示例:每个场馆每周最多举办2场赛事,可按需调整
max_games_per_venue_per_week = 2

# 约束:场馆每周最多举办指定数量赛事
for l in range(venues):
    for k in range(weeks):
        venue_games = []
        for h in range(divisions):
            for i in range(teams_per_division):
                for j in range(i + 1, teams_per_division):
                    venue_games.append(schedule[h, i, j, k, l])
        model.Add(sum(venue_games) <= max_games_per_venue_per_week)

3. 常见其他相关约束示例

每对球队赛季交手次数限制

要求同一分区内每对球队赛季中恰好交手2次(主客场各1次):

# 约束:每对球队赛季内恰好交手2次
for h in range(divisions):
    for i in range(teams_per_division):
        for j in range(i + 1, teams_per_division):
            total_games = []
            for k in range(weeks):
                for l in range(venues):
                    total_games.append(schedule[h, i, j, k, l])
            model.Add(sum(total_games) == 2)

避免同一球队连续两周在同一场馆参赛

# 约束:同一球队连续两周不在同一场馆参赛
for h in range(divisions):
    for i in range(teams_per_division):
        for l in range(venues):
            for k in range(weeks - 1):
                # 收集本周和下周球队i在该场馆的参赛情况
                this_week = []
                next_week = []
                # 本周参赛情况
                for j in range(i + 1, teams_per_division):
                    this_week.append(schedule[h, i, j, k, l])
                for j in range(i):
                    this_week.append(schedule[h, j, i, k, l])
                # 下周参赛情况
                for j in range(i + 1, teams_per_division):
                    next_week.append(schedule[h, i, j, k+1, l])
                for j in range(i):
                    next_week.append(schedule[h, j, i, k+1, l])
                # 本周参赛则下周不能在同一场馆参赛
                model.Add(sum(this_week) + sum(next_week) <= 1)

关于played变量的关联(若需使用)

若坚持引入played变量跟踪球队参赛场馆,可通过以下方式关联schedule变量:

# 初始化played变量
played = {}
for h in range(divisions):
    for i in range(teams_per_division):
        for k in range(weeks):
            for l in range(venues):
                played[h, i, k, l] = model.NewBoolVar(f"played_div{h}_team{i}_week{k}_venue{l}")

# 关联played与schedule:played为1当且仅当球队i在周k、场馆l参赛(无论主客)
for h in range(divisions):
    for i in range(teams_per_division):
        for k in range(weeks):
            for l in range(venues):
                game_instances = []
                for j in range(i + 1, teams_per_division):
                    game_instances.append(schedule[h, i, j, k, l])
                for j in range(i):
                    game_instances.append(schedule[h, j, i, k, l])
                model.Add(sum(game_instances) == played[h, i, k, l])

# 用played变量构建球队每周参赛1次的约束
for h in range(divisions):
    for i in range(teams_per_division):
        for k in range(weeks):
            model.Add(sum(played[h, i, k, l] for l in range(venues)) == 1)

这种方式会增加模型变量数量,可能降低求解效率,推荐优先使用无需额外变量的约束方式。

内容的提问来源于stack exchange,提问作者pmueller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:53:12