单循环赛赛程安排算法研究

摘要:循环赛赛程安排算法是一个很经典的计算机算法,它是分治法的一个经典应用,但该算法只适应于2n支队伍的赛程安排问题,而对于非 2n支队伍的赛程安排问题却没有很好的解决。文章使用可视化语言Visual Basic作为开发工具,借助于循环队列的规律,针对任意n支队伍的赛程安排提出一种直观、方便的算法。
  关键词:单循环赛;赛程安排;算法;Visual Basic 6.0
  中图分类号:TP312文献标识码:A文章编号:1009-3044(2007)15-30805-02
  Single Cycle Match Competition Schedule Arrangement Algorithm Research
  ZHANG Lin-zhong
  (Anhui Agricultural University,College of Applied Mathematics Institute,Hefei 230036)
  Abstract:Round robin schedule algorithm is a classic computer algorithm,it is a representative application of the divide and rule algorithm, but the classical computer algorithm can solve match arrangement of 2n teams only, it can not satisfactorily resolve the problem of not 2n teams. The article using Visual Basic as a development tool, using cohort cycle of the law against arbitrary n teams in the schedule proposed an intuitive and user-friendly algorithm.
  Key words:Single round robin;the schedule;Algorithm;Visual Basic 6.0
  
  1 引言
  
  在计算机算法中,循环赛赛程安排算法是是分治法的一个经典应用,但该算法只适应于2n支队伍的赛程安排问题,而对于任意n支队伍的赛程安排问题却不能很好的解决。文献4中对该算法作了一个补充,可以对任意支队伍进行比赛的赛程进行安排,但该算法不是很直观,而且通过Turbo C实现,操作起来不是很方便。本文采用面向对象的开发工具Visual Basic,提出一种更为简单的算法,得到更为直观、操作方便的结果。
  
  2 单循环赛赛程算法
  
  单循环赛,是所有参加比赛的队伍均能相遇一次,最后按各队在全部比赛中的积分、得失分率排列名次。这种竞赛方法满足(假设有n支队伍):a、每支队伍必须与其他n-1支队伍各赛一次;b、每支队伍每轮只能进行一场比赛。很明显,当 n为奇数时,需进行n轮比赛;当 n为偶数时,需进行n-1轮比赛。首先考虑n为奇数的情况,在此基础上再考虑n为偶数时的情况。
  (1)当比参赛队(或人)为奇数即n=2*k-1 (n≥2)时,考虑到每轮均有一支队伍轮空,先将队伍一分为二,每轮比赛在前后两部分中依次选取一支队伍进行比赛,第一轮将k号选手轮空,利用对称性,将1号队伍和n号队伍比赛,2号队伍和n-1号队伍比赛,依此类推排完第一轮选手的比赛;第二轮将k+1号队伍轮空,再将2号队伍和1号队伍比赛,3号队伍和n号队伍比赛,依此类推排完第二轮选手的比赛;为了避免两个队之间出现重复比赛,所以用循环队列(如图1)的方式解决每轮轮空队伍的编号,即编号为n的队伍轮空的下一轮为编号1的队伍轮空。例:7支队伍参加比赛的排法(见图2):
  图1 循环队列
  第一轮 1-7 2-6 3-5
  第二轮 2-1 3-7 4-6
  第三轮 3-2 4-1 5-7
  第四轮 4-3 5-2 6-1
  第五轮 5-4 6-3 7-2
  第六轮 6-5 7-4 1-3
  第七轮 7-6 1-5 2-4
  图2 7支队伍
  (2)当比赛队伍数为偶数即n = 2*k(n≥2)时,每一轮比赛只需在n=2*k(n≥2)的基础上补上轮空的队伍和编号为n的队伍比赛即可。例:8支队伍参加比赛的排法(见图3):
  第一轮 1-7 2-6 3-5 4-8
  第二轮 2-1 3-7 4-6 5-8
  第三轮 3-2 4-1 5-7 6-8
  第四轮 4-3 5-2 6-1 7-8
  第五轮 5-4 6-3 7-2 1-8
  第六轮 6-5 7-4 1-3 2-8
  第七轮 7-6 1-5 2-4 3-8
  图3 8支队伍
  
  3 算法实现
  
  本算法采用VB语言来实现,在编程时用两个了变量a,b(a表示奇数列选手编号,b表示偶数列选手编号),并用两个循环分别控制a和b的变化。由于a和b是循环变化的,为防止数据溢出,所以在编程时分别用了判断语句来判断,若新增的a和b大于n,便取他们除以n的余数,否则就取他们本身。当n为奇数时的相应程序如下:
  If n Mod 2=1 Then
  For i=1 To n
  a=i
  If n+i- 1>n Then
  b=(n+i-1) Mod n

Else
  b=i+n-1
  End If
  For j=1 To (n-1)/2
  If a+1>n Then
  a=(a+1) Mod n
  Else
  a=a+1
  End If
  If b+n-1>n Then
  b=(b+n-1) Mod n
  Else
  b=b+n-1
  End If
  Next j
  Next i
  End If
  当n为偶数时,程序和奇数的时候基本差不多,这里就不再重复了。该算法的时间复杂度为0(n2),与文献4中提到的算法的时间复杂度相同,但结果更为直观,操作更为方便,其运行结果如图4(n=13)和图5(n=10)所示:
  图4 参赛队伍人数为奇数(n=13)时运行结果
  
  4 结束语
  
  单循环赛赛程安排的算法很多,分治法对任意n支队伍的情况不能解决,扩展循环赛日程表算法是分治法的一个补充,解决了任意n支队伍的情况,但不是很通俗易懂,而且用C语言实现的算法不够直观。本文提出一种更为简单的算法,并且利用可视化语言Visual Basic进行开发,此软件具有界面友好、操作方便、运行可靠的特点,使用起来方便快捷。
  图5 参赛队伍人数为偶数(n=10)时运行结果

相关资料:http://www.cppblog.com/cdy20/archive/2009/04/01/78573.html

转载于:https://www.cnblogs.com/kelin1314/archive/2009/07/15/1523905.html

【转】单循环赛赛程安排算法研究相关推荐

  1. 比赛赛程安排算法--分治算法

    问题在注释中已说明,直接贴代码! /** bisaisaicheng.c** Created on: Nov 30, 2013* Author: bing** 每个选手必须与其他所有选手进行一次比赛, ...

  2. 分治算法实例:赛程安排(VB.net代码)

    Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadlblTel ...

  3. 数学结果告诉你足球的赛程安排并不能做到完全公平

    2007年,白兰恩足球俱乐部在挪威超级联赛中笑到了最后.球迷们欣喜若狂,他们都觉得胜利归属于于巴西球员阿兰齐尼奥.只有阿兰齐尼奥没有为白兰恩效力过,他曾效力于白兰恩的对手斯塔贝克.所以,这到底是怎么回 ...

  4. Python解决数学建模问题:赛程安排

    五支足球队在同一场地上进行足球赛.进行单循环比赛,也就是说这五支球队的每两支球队在这次比赛中都要结对比赛一次.共进行十场比赛,在连续的十天中每天比赛一场.问:如何安排这次比赛的赛程对各队来说都是公平的 ...

  5. matlab建模大赛程仁山,基于MATLAB赛程安排方案设计.doc

    基于MATLAB赛程安排方案设计 摘要 单循环赛是一种全面而公平的竞赛机制,赛程安排的恰当与否,在很大程度上影响比赛的结果.本文主要针对单循环赛的最优赛程安排方案建立相应的数学模型,给出最优赛程的安排 ...

  6. matlab建模大赛程仁山,基于MATLAB的赛程安排方案设计

    摘要 单循环赛是一种全面而公平的竞赛机制,赛程安排的恰当与否,在很大程度上影响比赛的结果.本文主要针对单循环赛的最优赛程安排方案建立相应的数学模型,给出最优赛程的安排方案. 对于问题一,通过直接拼凑的 ...

  7. 近期活动盘点:心电数据标注系统和深度学习诊断算法研究、2019年第六届清华大学大数据社会科学讲习班...

    想知道近期有什么最新活动?大数点为你整理的近期活动信息在此: 第四期医工结合研讨会:心电数据标注系统和深度学习诊断算法研究 2019年7月11日 7月11日,"医工结合系列研讨会第四期会议: ...

  8. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...

    基于MATLAB的数字图像处理算法研究与仿真开题报告 毕 业 设 计 (2013 届) 题 目基于 MATLAB 的数字图像 处理算法研究与仿真 学 院 物理电气信息学院 专 业 通信工程 年 级 0 ...

  9. matlab人脸识别开题报告,基于人脸识别的出勤点名系统中特征提取算法研究开题报告...

    基于人脸识别的出勤点名系统中特征提取算法研究 一.本课题研究的目的,意义 人脸识别是一项既有科学研究价值,又有广泛应用前景的研究课题.国际上大量研究人员几十年的研究取得了丰硕的研究成果,自动人脸识别技 ...

  10. 基于遗传算法的无人机监视覆盖航路规划算法研究

    基于遗传算法的无人机监视覆盖航路规划算法研究 人工智能技术与咨询 点击蓝字 · 关注我们 来源:< 计算机科学与应用> ,作者 李御驰等 关键词: 人工势场法:无人机:监视覆盖航路规划 摘 ...

最新文章

  1. DeepSpeed超大规模模型训练工具
  2. 单元、集成、系统、验收测试比较
  3. first dairy----the birth of my blog···
  4. malware分析视频
  5. ionic项目相关的操作命令
  6. 小米路由器是基于openWRT的,为啥小米路由器不开源?
  7. Python之网络图片爬取
  8. STL常用对象,不会搞得C++跟没学一样
  9. 金山吹响讨伐灰鸽子的号角
  10. NetBeans Java EE技巧#1 –数据库中的实体类
  11. 最简洁的js鼠标拖曳效果【原】
  12. STM32工作笔记0095---MDK KEIL5宏定义报红叉
  13. 计算机刻录光盘不显示,为什么我的CD刻录光盘的容量在
  14. 关于iOS13 的一些适配
  15. Java开发学习教程之对象的创建与使用
  16. LeetCode每周刷题(2019.7.1-2019.7.7)
  17. 上星远程控制实验(一)
  18. android设置闹钟日期,在Android中将闹钟设置为特定日期和时间
  19. 如何用计算机设置热点,电脑技巧:怎么用电脑设置wifi热点
  20. 对马科维兹投资组合理论的总结

热门文章

  1. 浙大 计算机 毕业论文格式,浙大硕士毕业论文格式
  2. matlab点在直线上运动,求助如何用matlab取出直线上的点
  3. matlab 画x a的直线方程式,matlab画如x=a和y=b这种水平线和垂线的命令是什么,谢谢...
  4. keil4 破解心得
  5. 用css美化的简易计算器 |完整代码及注解
  6. Coding and Paper Letter(五十九)
  7. 大数据采集与预处理技术
  8. Hadoop集群搭建及配置⑥ —— Hadoop组件安装及配置
  9. 2048小游戏(变态版哦)
  10. vue引入高德地图获取经纬度地址