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