Excel VBA函数求解带场地约束的不可能循环赛排班

Excel VBA函数求解带场地约束的不可能循环赛排班,vba,excel,Vba,Excel,在以下情况下,我真的很难生成循环赛名单: 10队(第1-10队) 5个字段(字段A-E) 9轮(第1-9轮) 每个队必须与其他队比赛一次 同一时间只有两个队可以在同一场地上比赛。(即始终使用的所有5个字段) 任何球队在任何特定场地上的比赛不得超过两次 来吧。。。这对于手动解决方案来说很简单;-) 据我所知,在同一地点没有超过两次的团队检查。请仔细检查 把它分成几轮应该很容易 编辑:这次只有5个场馆:-) 编辑2:现在也有分配的轮次:-) 编辑3:再次删除轮分配,因为它是错误的。我想我至少找到了

在以下情况下,我真的很难生成循环赛名单:

  • 10队(第1-10队)
  • 5个字段(字段A-E)
  • 9轮(第1-9轮)
  • 每个队必须与其他队比赛一次
  • 同一时间只有两个队可以在同一场地上比赛。(即始终使用的所有5个字段)

  • 任何球队在任何特定场地上的比赛不得超过两次 来吧。。。这对于手动解决方案来说很简单;-)

    据我所知,在同一地点没有超过两次的团队检查。请仔细检查

    把它分成几轮应该很容易

    编辑:这次只有5个场馆:-)

    编辑2:现在也有分配的轮次:-)


    编辑3:再次删除轮分配,因为它是错误的。

    我想我至少找到了一个解决问题的方法:

    Round Field Team 1 Team 2 1 A 3 10 1 B 7 8 1 C 1 9 1 D 2 4 1 E 5 6 2 A 8 10 2 B 1 5 2 C 2 6 2 D 3 7 2 E 4 9 3 A 1 4 3 B 2 3 3 C 8 9 3 D 5 7 3 E 6 10 4 A 6 7 4 B 4 10 4 C 2 8 4 D 5 9 4 E 1 3 5 A 2 9 5 B 3 8 5 C 4 7 5 D 1 6 5 E 5 10 6 A 3 9 6 B 4 5 6 C 7 10 6 D 6 8 6 E 1 2 7 A 5 8 7 B 6 9 7 C 1 10 7 D 3 4 7 E 2 7 8 A 4 6 8 B 2 10 8 C 3 5 8 D 1 8 8 E 7 9 9 A 2 5 9 B 1 7 9 C 3 6 9 D 9 10 9 E 4 8 圆形场地1队2队 1 A 3 10 1 B 7 8 1C19 1 D 2 4 1 E 5 6 2 A 8 10 2 B 1 5 2 C 2 6 2 D 3 7 2 E 4 9 3 A 1 4 3B23 3 C 8 9 三维5 7 3 E 6 10 4 A 6 7 4 B 4 10 4 C 2 8 4 D 5 9 4 E 1 3 5 A 2 9 5 B 3 8 5 C 4 7 5 D 16 5 E 5 10 6 A 3 9 6 B 4 5 6 C 7 10 6 D 6 8 6 E 1 2 7 A 5 8 7 B 6 9 7 C 110 7 D 3 4 7 E 2 7 8 A 4 6 8B210 8 C 3 5 8D18 8 E 7 9 9 A 2 5 9 B 17 9 C 3 6 9 D 9 10 9 E 4 8 我使用Excel外接程序找到它(因为问题对于内置的解算器功能来说太大了)。步骤如下:

  • 设置一个表,表中有2025行代表可能的匹配项——也就是说,轮、场和成对团队的可能组合(列与上表类似),加上一个额外的列,该列将是一个二进制(0或1)决策变量,指示是否选择匹配项
  • 建立公式,使用决策变量计算:a)每轮每个场地的比赛次数,b)每对球队之间的比赛次数,c)每轮每个球队的比赛次数,以及d)每队在每个场地的比赛次数
  • 设置使用决策变量计算匹配总数的公式
  • 使用OpenSolver求解一个模型,该模型的目标是通过更改步骤1中的决策变量来最大化步骤3中公式的结果,受决策变量必须为二进制的约束,步骤2.a)到c)中公式的结果必须等于1,步骤2.d)中公式的结果必须小于或等于2
  • 详情如下

    对于步骤1,我设置了表格,使A、B、C和D列分别表示回合、场、团队1和团队2,E列表示决策变量。第1行包含列标题,第2行到2026行分别表示一种可能的匹配

    对于步骤2.a),我在单元格I2到I10中设置了一个第一轮到第九轮的垂直列表,在单元格J1到N1中设置了一个字段a到E的水平列表,以及一系列公式,以计算单元格J2到N10中每轮中每个字段的匹配数,方法是从
    =SUMIFS($E$2:$E$2026,$a$2:$a$2026,$I2,$B$2:$B$2026,J$1)开始
    在单元格J2中,然后复制和粘贴

    对于步骤2.b),我在单元格I13到I21中设置了一个队1到队9的垂直列表,在单元格J12到R12中设置了一个队2到队10的水平列表,以及一系列公式,用于计算单元格J13到R21(包括对角线)的“右上三角半部分”中每对队之间的匹配数通过在单元格J13中以
    =SUMIFS($E$2:$E$2026,$C$2:$C$2026,$I13,$D$2:$D$2026,J$12)
    开头,然后复制和粘贴

    对于步骤2.c),我在单元格I24到I33中设置了一个1到10队的垂直列表,在单元格J23到R23中设置了一个1到9轮的水平列表,并通过从
    =SUMIFS开始,设置了一系列公式来计算每个队在单元格J24到R33中每轮的比赛次数($E$2:$E$2026,$C$2:$C$2026,$I24,$A$2:$A$2026,J$23)+SUMIFS($E$2:$E$2026,$D$2:$D$2026,$I24,$A$2:$A$2026,J$23)
    在J24单元中复制和粘贴

    对于步骤2.d),我在单元格I36到I45中设置了一个队1到队10的垂直列表,在单元格J35到N45中设置了一个场a到B的水平列表,并通过从
    =SUMIFS开始计算每个队在单元格J36到N45中每个场上的比赛次数的一系列公式($E$2:$E$2026,$C$2:$C$2026,$I36,$B$2:$B$2026,J$35)+SUMIFS($E$2:$E$2026,$D$2:$D$2026,$I36,$B$2:$B$2026,J$35)
    在单元格J36中复制和粘贴

    对于第3步,我建立了一个公式来计算单元格G2中的匹配总数,即
    =SUM($E$2:$E$2026)

    对于步骤4,在“OpenSolver模型”对话框(可从Data、OpenSolver、Model获得)中,我将目标单元格设置为$G$2,将变量单元格设置为$E$2:$E$2026,并添加了如上所述和下文详述的约束
    T1  T2  VE
    
    1   2   A
    1   3   A
    1   4   B
    1   5   B
    1   6   C
    1   7   C
    1   8   D
    1   9   D
    1   10  E
    2   3   A
    2   4   B
    2   5   B
    2   6   C
    2   7   C
    2   8   D
    2   9   D
    2   10  E
    3   4   C
    3   5   C
    3   6   D
    3   7   D
    3   8   E
    3   9   E
    3   10  B
    4   5   C
    4   6   D
    4   7   D
    4   8   E
    4   9   E
    4   10  A
    5   6   E
    5   7   E
    5   8   A
    5   9   A
    5   10  D
    6   7   E
    6   8   A
    6   9   A
    6   10  B
    7   8   B
    7   9   B
    7   10  A
    8   9   B
    8   10  C
    9   10  C
    
    Round Field Team 1 Team 2 1 A 3 10 1 B 7 8 1 C 1 9 1 D 2 4 1 E 5 6 2 A 8 10 2 B 1 5 2 C 2 6 2 D 3 7 2 E 4 9 3 A 1 4 3 B 2 3 3 C 8 9 3 D 5 7 3 E 6 10 4 A 6 7 4 B 4 10 4 C 2 8 4 D 5 9 4 E 1 3 5 A 2 9 5 B 3 8 5 C 4 7 5 D 1 6 5 E 5 10 6 A 3 9 6 B 4 5 6 C 7 10 6 D 6 8 6 E 1 2 7 A 5 8 7 B 6 9 7 C 1 10 7 D 3 4 7 E 2 7 8 A 4 6 8 B 2 10 8 C 3 5 8 D 1 8 8 E 7 9 9 A 2 5 9 B 1 7 9 C 3 6 9 D 9 10 9 E 4 8