赛程安排问题.docx
《赛程安排问题.docx》由会员分享,可在线阅读,更多相关《赛程安排问题.docx(22页珍藏版)》请在冰豆网上搜索。
赛程安排问题
赛程安排问题
摘要:
本文针对单循环比赛的赛程安排中每两场比赛间相隔场次数Q这一指标,运用了抽屉原理的方法,从理论上确定了
。
而后通过计算机的多次模拟运算,验证出
的科学性和合理性。
本模型的程序是采用回溯搜索法搜索出满足Q的一个赛程。
然后通过改变搜索顺序分别得出各种不同的赛程,列成表格,对其进行分析,得出衡量一个赛程优劣的其它指标,即球队出场顺序和间隔场次的方差,并分析这些指标从而给出更公平、合理的赛程安排。
一、问题的重述:
你所在的年级有5个班,每班一支球队在同一块场地上进行单循环赛,共要进行10场比赛.如何安排赛程使对各队来说都尽量公平呢.下面是随便安排的一个赛程:
记5支球队为A,B,C,D,E,在下表左半部分的右上三角的10个空格中,随手填上1,2,10,就得到一个赛程,即第1场A对B,第2场B对C,,第10场C对E.为方便起见将这些数字沿对角线对称地填入左下三角.
这个赛程的公平性如何呢,不妨只看看各队每两场比赛中间得到的休整时间是否均等.表的右半部分是各队每两场比赛间相隔的场次数,显然这个赛程对A,E有利,对D则不公平.
A
B
C
D
E
每两场比赛间相隔场次数
A
×
1
9
3
6
1,2,2
B
1
×
2
5
8
0,2,2
C
9
2
×
7
10
4,1,0
D
3
5
7
×
4
0,0,1
E
6
8
10
4
×
1,1,1
从上面的例子出发讨论以下问题:
1)对于5支球队的比赛,给出一个各队每两场比赛中间都至少相隔一场的赛程.
2)当n支球队比赛时,各队每两场比赛中间相隔的场次数的上限是多少.
3)在达到2)的上限的条件下,给出n=8,n=9的赛程,并说明它们的编制过程.
4)除了每两场比赛间相隔场次数这一指标外,你还能给出哪些指标来衡量一个赛程的优劣,并说明3)中给出的赛程达到这些指标的程度.
二、模型假设:
1、赛程能够按计划正常地进行(即不考虑比赛期间的天气状况,每场比赛的裁判安排等因素)
2、每场比赛时间一样长(不考虑加时赛等情况)
三、符号说明:
n:
球队的支数
N:
n支球队进行单循环比赛所要进行的场数
Q:
各队每两场比赛中间相隔的场次数的上限
M:
各队每两场比赛中间相隔的场次数理论上的最大值
四、问题的分析:
n支球队在同一场地上进行单循环赛,可以知道总的比赛场数为
,为了使比赛公平,我们应该使每支球队所进行的每两场比赛中间隔的场次数尽可能地均等。
我们先将问题简化为各队每两场比赛中间至少相隔的场次数Q,并找到在满点Q的条件下的赛程安排。
可以用抽屉原理的方法,确定Q的理论上最大值M,根据所求的M,我们采用计算机进行搜索,若能搜索出满足约束条件的赛程安排,则显然Q=M,若不能安排,再以Q=M-1进行搜索,一直到找到满足条件为止。
为了得到其它指标,我们先得出不同的赛程,列成表格形式,进行分析。
五、模型的建立与求解:
第一问:
对于5个球队,总共要进行10场比赛,设这5个队编号为A,B,C,D,E,我们可以罗列出所有的组合:
(AB,AC,AD,AE,BC,BD,BE,CD,CE,DE)。
我们要解决的问题就是如何安排这些组合,排列成满足各队每两场比赛中间都至少相隔一场的赛程。
设所有组合为有序集合X={AB,AC,AD,AE,BC,BD,BE,CD,CE,DE},所求的为有序集合Y,初始化为空集。
我们可以进行如下搜索:
1)从左至右在(X-Y)中搜索第一个满足约束条件的组合,置入到有序集合Y中,如果没有满足条件的组合,则回溯。
2)以Y的最后一个组合为起点重复步骤1,直到有序集合Y中的个数为10止。
也可用计算机编写程序,采用回溯搜索法求得。
所求的结果Y={AB,CD,AE,BC,DE,AC,BD,CE,AD,BE}
其赛程表格为:
A
B
C
D
E
每两场比赛间相隔场次数
A
×
1
6
9
3
1,2,2
B
1
×
4
7
10
2,2,2
C
6
4
×
2
8
1,1,1
D
9
7
2
×
5
2,1,1
E
3
10
8
5
×
1,2,1
第二问:
首先确定n支球队所进行的赛程中各队每两场比赛中间至少可以相隔的场次数的最大值,下面我们可以分两种情况来讨论:
1、n为奇数
当进行到
场比赛时,不管怎样安排赛程,根据抽屉原理,必定至少有一球队参加了两场比赛,而且只有在该队参加第1场比赛和第
场比赛时的时间间隔最大,为
,即有
2.当n为偶数,进行到
场比赛时,也不管怎样安排赛程,根据抽屉原理,可分两种情况:
1)至少有两个球队参加了两场比赛,2)至少有一个队参加了三场比赛。
对于后一种情况,显然要比前一种情况要差;而前一种情况,在这两个球队中,在其中一个球队参加第1场比赛和第
场比赛,而另一个球队参加第2场与第
场比赛时,其间隔为最大(虽然还有其它几种情况,但其间隔的最大值相同),为
,即有
。
将其统一起来为
(注,[X]为取X的整数部分)
通过程序验证,M就是各队每两场比赛中间相隔的场次数的上限Q,即
(见附录二中我们由此得出的部分赛程安排)。
第三问:
当n=8时,其各队每两场比赛中间相隔的场次数的上限为
=2
满足问题2)中的上限条件的赛程有多种,我们给出其中的一种赛程如下表所示:
表—:
A
B
C
D
E
F
G
H
每两场比赛间相隔场次数
A
×
1
23
14
26
7
4
10
2,2,2,3,8,2
B
1
×
5
11
17
20
8
25
3,2,2,5,2,4
C
23
5
×
2
9
12
15
19
2,3,2,2,3,3
D
14
11
2
×
6
27
18
22
3,4,2,2,3,4
E
26
17
9
6
×
3
21
13
2,2,3,3,3,4
F
7
20
12
27
3
×
24
16
3,4,3,3,3,2
G
4
8
15
18
21
24
×
28
3,6,2,2,2,3
H
10
25
19
22
13
16
28
×
2,2,2,2,2,2
当n=9时,其各队每两场比赛中间相隔的场次数的上限为
=3
满足问题2)中上限条件的赛程有多种,我们给出其中的一种赛程如下表所示:
表二:
A
B
C
D
E
F
G
H
I
每两场比赛间相隔场次数
A
×
1
10
35
15
30
20
25
5
3,4,4,4,4,4,4
B
1
×
6
31
11
26
16
21
36
4,4,4,4,4,4,4
C
10
6
×
2
19
34
24
29
14
3,3,3,4,4,4,4
D
35
31
2
×
7
22
12
17
27
4,4,4,4,4,3,3
E
15
11
29
7
×
3
28
33
23
3,3,3,3,3,3,4
F
30
26
34
22
3
×
8
13
18
4,4,4,3,3,3,3
G
20
16
24
12
28
8
×
4
32
3,3,3,3,3,3,3
H
25
21
29
17
33
13
4
×
9
4,3,3,3,3,3,3
I
5
36
14
27
23
18
32
9
×
3,4,3,4,3,4,3
它们的编制过程如下:
为了便于叙述,对于8支球队,分别编号为A、B、C、D、E、F、G、H,再把其所有组合按一定的顺序写出来,其所有组合构成数组如下:
ABCD[]={AB,AC,AD,AE,AF,AG,AH,
BC,BD,BE,BF,BG,BH,
CD,CE,CF,CG,CH,
DE,DF,DG,DH,
EF,EG,EH,
FG,FH,
GH}
而对于9支球队,分别编号为A、B、C、D、E、F、G、H、I,再把其所有组合按一定的顺序写出来,其所有组合构成数组如下:
ABCD[]={AB,AC,AD,AE,AF,AG,AH,AI,
BC,BD,BE,BF,BG,BH,BI,
CD,CE,CF,CG,CH,CI,
DE,DF,DG,DH,DI,
EF,EG,EH,EI,
FG,FH,FI,
GH,GI,
HI}
其具体实现过程是编程序采用回溯试探法进行编制的,程序见附录三。
编制思路为:
定义一个数组,用来标记其组合是否已经被安排,从左至右依次判断各组合是否满足约束条件,如果满足,则先将其对应的标记位打上标记,然后继续向前寻找,否则退到上一步,寻找其它的组合,如此循环下去,直到将所有组合排完为止。
这时,所要满足约束条件的出场的组合队分别为:
(AB、CD、EF、AG、BC、DE、AF、BG、CE、AH、BD、CF、EH、AD、CG、FH、BE、DG、CH、BF、EG、DH、AC、FG、BH)
(AB、CD、EF、GH、AI、BC、DE、FG、HI、AC、BE、DG、FH、CI、AE、BG、DH、FI、CE、AG、BH、DF、EI、CG、AH、BF、DI、EG、CH、AF、BD、GI、EH、CF、AD)
第四问:
使用上面的模型已经可以很好的解决满足每两场比赛间隔的场次数这一指标。
但在实际比赛中,科学、合理的衡量一个赛程的优劣还有一些其它指标,我们通过分析对n支球队的不同赛程安排(其具体分析见附录一),得出了以下两个指标:
1、每支球队每两场比赛间隔的场次的分布情况,可以通过比较它们的方差来衡量优劣,应该说其方差值越小就越好。
2、各球队参加某场比赛时,其对手已经参加了比赛的次数。
对于第1个指标(即间隔的场次的方差值),当n=8时,表一给出的赛程其达标程度如下:
方差S=1.1788。
当n=9时,表二给出的赛程其达标程度如下:
方差S=0.5030
对于第2个指标有如下表格:
表三:
(n=8时,其中第i行第j列上的数字表示第i个球队与第j个球队比赛时,j已经参加的比赛场数)
j
I
A
B
C
D
E
F
G
H
A
×
0
6
3
6
1
0
0
B
0
×
1
2
4
4
1
5
C
5
1
×
0
2
2
2
3
D
4
3
0
×
1
6
3
4
E
6
4
2
1
×
0
4
1
F
2
5
3
6
0
×
5
2
G
1
2
4
4
5
5
×
6
H
3
6
5
5
3
3
6
×
从以上数据可以看到,A与对手B、C、D、E、F、G、H比赛时,他们已经参加了的比赛场数分别为0、6、3、6、1、0、0。
而H与对手A、B、C、D、E、F、G比赛时,他们已经参加了的比赛场数分别为3、6、5、5、3、3、6。
由此可看出这种赛程对H队有利。
表四:
(n=9时,其中第i行第j列上的数字表示第i个球队与第j个球队比赛时,j已经参加的比赛场数)
j
i
A
B
C
D
E
F
G
H
I
A
×
0
2
7
3
6
4
5
0
B
0
×
1
6
2
5
3
4
7
C
2
1
×
0
4
7
5
6
2
D
7
6
0
×
1
4
2
3
5
E
3
2
4
1
×
0
6
7
4
F
6
6
7
4
0
×
1
2
3
G
4
3
5
2
6
1
×
0
6
H
5
4
6
3
7
2
0
×
1
I
1
7
3
5
5
3
7
1
×
六、模型的评价及改进
本模型理论上可以用于解决任意n支队进行单循环赛的赛程编排问题,成功的运用回溯搜索法,用计算机模拟求出了所需赛程,节约大量人力、物力,值得进行社会推广。
但由于是采用回溯法进行搜索,其复杂度与n及搜索的起点顺序有很大关系。
但考虑到单循环赛在日常生活中的应用范围,本模型确实是可行的。
参考文献:
[1]严蔚敏,吴伟民,数据结构,清华大学出版社,北京
[2]刘来福,曾文艺,数学模型与数学建模,北京师范大学出版社,北京,1997
[3]胡运权,郭耀煌,运筹学教程,清华大学出版社,北京,1998
附录一:
表五:
A
B
C
D
E
F
G
H
每两场比赛间相隔场次数
A
×
14
1
17
23
7
4
10
2,2,2,3,2,5
B
14
×
5
2
11
20
8
25
2,2,2,2,5,4
C
1
5
×
9
26
12
18
22
3,3,2,5,3,3
D
17
2
9
×
6
27
21
13
3,2,3,3,3,5
E
23
11
26
6
×
3
5
19
2,4,3,3,3,2
F
7
20
12
27
3
×
24
16
3,4,3,3,3,2
G
4
8
18
21
5
24
×
18
3,6,2,2,2,3
H
10
25
22
13
19
16
18
×
2,2,2,2,2,2
方差:
1.0175平均值:
2.833
表六:
A
B
C
D
E
F
G
H
每两场比赛间相隔场次数
A
×
2
26
11
14
8
5
19
2,2,2,2,4,6
B
2
×
6
15
18
12
9
22
3,2,2,2,2,3
C
26
6
×
3
10
23
17
13
2,3,2,3,5,2
D
11
15
3
×
7
20
24
28
3,3,3,4,3,3
E
14
18
10
7
×
4
21
25
2,2,3,3,2,3
F
8
12
23
20
4
×
27
16
3,3,3,3,2,3
G
5
9
17
24
21
27
×
1
3,3,7,3,2,2
H
19
22
13
28
25
16
1
×
11,2,2,2,2,2
方差:
1.5765平均值:
2.9357
表七:
A
B
C
D
E
F
G
H
每两场比赛间相隔场次数
A
×
14
2
11
5
26
8
22
2,2,2,2,7,3
B
14
×
17
20
1
7
4
10
2,2,2,3,2,3
C
2
17
×
6
9
12
21
25
3,2,2,4,3,3
D
11
20
6
×
27
3
24
16
2,4,4,3,3,2
E
5
1
9
27
×
23
18
13
3,3,3,4,4,3
F
26
7
12
3
23
×
15
19
3,4,2,3,3,2
G
8
4
21
24
18
15
×
28
3,6,2,2,2,3
H
22
10
25
16
13
19
28
×
2,2,2,2,2,2
方差:
1.0566平均值:
2.7708
由上面表一、表五、表六、表七的数据分析可很明显地看出每支球队每两场比赛间隔的场次有较差距,当以AB,AC,GH,BE为起点开始搜索出来的赛程安排中,排出的比赛间隔不同。
由各表所求的对应的的方差值可知,在这四个表中,以AC为起点的表相对来说要比其它三个表要好,它的赛程中的间隔场次分布波动幅度最小,所以这也是一个衡量赛程优劣的指标。
附录二:
1.用计算机编写程序求得部分赛程的安排情况如下:
n=6时:
A
B
C
D
E
F
每两场比赛间相隔场次数
A
×
1
14
5
3
7
1,1,1,6
B
1
×
4
8
6
11
2,1,1,2
C
14
4
×
2
12
9
1,5,2,1
D
5
8
2
×
10
13
2,2,1,2
E
3
6
12
10
×
15
2,3,1,2
F
7
11
9
13
15
×
1,1,1,1
由上表可得到各队每两场比赛中间相隔的场次数的上限Q是1(也即
)。
n=7时:
A
B
C
D
E
F
G
每两场比赛间相隔场次数
A
×
1
8
20
12
16
4
2,3,3,3,3
B
1
×
5
17
9
13
21
3,3,3,3,3
C
8
5
×
2
15
19
11
2,2,2,3,3
D
20
17
2
×
6
10
14
3,3,3,2,2
E
12
9
15
6
×
3
18
2,2,2,2,2
F
16
13
19
10
3
×
7
3,2,2,2,2
G
4
21
11
14
18
7
×
2,3,2,3,2
由上表可得到各队每两场比赛中间相隔的场次数的上限Q是2(也即
)。
n=11时:
A
B
C
D
E
F
G
H
I
J
K
每两场比赛间相隔场次数
A
×
1
12
54
18
48
24
42
30
36
6
4,5,5,5,5,5,5,5,5
B
1
×
7
49
13
43
19
37
25
31
55
5,5,5,5,5,5,5,5,5
C
12
7
×
2
23
53
29
47
35
41
17
4,4,4,5,5,5,5,5,5
D
54
49
2
×
8
38
14
32
20
26
44
5,5,5,5,5,5,5,4,5
E
18
13
23
8
×
3
34
52
40
46
28
4,4,4,4,4,5,5,5,5
F
48
43
53
38
3
×
9
27
15
21
33
5,5,5,5,5,4,4,4,4
G
24
19
29
14
34
9
×
4
45
51
39
4,4,4,4,4,4,4,5,5
H
42
37
47
32
52
27
4
×
10
16
22
5,5,5,4,4,4,4,4,4
I
30
25
35
20
40
15
45
10
×
5
50
4,4,4,4,4,4,4,4,4
J
36
31
41
26
46
21
51
16
5
×
11
5,4,4,4,4,4,4,4,4
K
6
55
17
44
28
33
39
22
50
11
×
4,5,4,5,4,5,4,5,4
附录三:
源程序代码:
#include
#include
#include
typedefstructtagStructTeam{//用来定义存放组合的结构
charch1;
charch2;
}StructTeam;
#defineMAXLEN9//通过修改该宏,可以求出MAXLEN支球队的编制解
intStep=(MAXLEN-3)/2;//各队每两场比赛中间相隔的场次数
StructTeam*ABCD,*ABCDHead;//用来存放所有组合的结构数组指针
int*SolveMap;//用来存放出场次序的数组指针
int*DichMap,*DichHead;//用来顺序存放出场次序的组合队在结构数组中的下标
intTotalTeam;//总共有多少种组合
intMaxStep;//记录最大相隔上限
intQuequLength;//已经排了次序的元素个数
//该函数先求出总共的组合数,然后分配好空间,再作相应的一些处理
voidCount()
{
inti;
for(i=0;iTotalTeam+=i;
ABCDHead=(StructTeam*)malloc((TotalTeam+10)*sizeof(StructTeam));
ABCD=ABCDHead+10;//保护措施,防止数组进入非法区
DichHead=(int*)malloc((TotalTeam+10)*sizeof(int));
DichMap=DichHead+10;//保护措施,防止数组进入非法区
SolveMap=(int*)malloc(TotalTeam*sizeof(int));
for(i=0;i<10;i++){
ABCDHead[i].ch1=0;
ABCDHead[i].ch2=0;
DichHead[i]=i-10;
}
}
//用来初始化数据
voidInitData()
{
registerinti;
for(i=0;iSolveMap[i]=0;
DichMap[i]=0;
}
SolveMap[0]=1;
DichMap[0]=0;
QuequLength=1;
}
//核心函数,用回溯法进行搜索
intFun()
{
registerinti,j,k;
for(i=0;iif(SolveMap[i]==0){
j=1;
while(j<=Step){
k=DichMap[QuequLength-j];
if(!
((ABCD[i].ch1!
=ABCD[k].ch1)&&
(ABCD[i].ch1!
=ABCD[k].ch2)&&
(ABCD[i].ch2!
=ABCD[k].ch2)&&
(ABCD[i].ch2!
=ABCD[k].ch1)))
break;
j++;
}
if(j>Step){
DichM