双循环比赛队伍排列组合问题

2024-06-15 17:08

本文主要是介绍双循环比赛队伍排列组合问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019/05/12

引言

昨天看比赛的时候,看到了各个队伍的对战,这种应用应该是排列组合中的算法,但不是很明确。搜索了一下相关的算法,看到有用分治法的。这里来把这部分的问题来描述一下。

问题分析

问题来源于最近的MSI比赛:

小组赛共计6支队伍,按照双循环赛事,共计比赛5天,每天打6场,每个队每天打2场,第3天的上半轮(即前三场)完成第一轮循环赛,共计30场比赛。

转化为数学形式:

小组赛共计n支队伍,按照双循环赛事,共计比赛n-1天,每天打n场,每个队伍每天打两场,小组赛共计n支队伍,按照双循环赛事,共计比赛n(n-1)场,每支队伍与其他任意一支队伍交手2次,前n(n-1)/2场比赛,完成一轮循坏比赛,即每一只队伍已经与其他任意一支队伍交手1次。

(上面这个说明并不是非常的具体,说明我对这个问题的理解还是不够深入 2019/05/12)
我感觉还有具体的,对于每天的限制什么的,可能要假设比赛多少场什么的。这个应该算是非常经典的排列组合算法吧。
经过思考之后,加入一些限制条件,重新进行问题定义

现在2n支队伍(这里是不考虑队伍为奇数的情况),共计进行2n (2n -1)场比赛;每天至少进行m (m>=1)轮比赛,每轮n场比赛,那么2n * (2n -1) / (nm) = 2(2n - 1) / m,要保证天数是完整的,
同时保证每天的轮数都相等;前面说过的每个队每天要进行m场比赛,而且赛程安排必须保证每天对阵的m个队伍不同

解决思路

( 这个问题并不是为了提供多好的算法,而是说,我来记录一下我的思路过程 2019/05/12)

  1. 前面的问题定义已经清楚了,但是因为这个参数并没有确定,所以有时候直接去思考宏观上的通用方式有点麻烦,有很多细节问题需要思考,所以我这里选择将m定义为2轮;因为1轮就不需要考虑梅每天队伍碰撞的问题了。
  2. 同时因为是双循环赛,分为上半轮循环和下半轮循环,就是说,可以单纯的安排上半场比赛,即1轮循环赛;下半轮的时候,第一小轮不和上班论的最后小轮不比赛碰撞即可(因为m = 2)。
  3. 再来进行细节讨论,整体上,最终对战的比赛已经确定,每只队伍反正就是对战(n - 1 )场,他们队伍之间匹配问题,已经是固定的,只需要进行排列他们比赛场次的问题即可。
    (到这里我感觉到这个m好像也是有一定确定关系的 2019/05/12)
  4. 已经确定m = 2,那么一共就是比赛2 n * ( 2n - 1) / n * m = 2*n - 1 天
  5. 其实到现在这个情况,貌似很简单了就。我凑够一轮小比赛,共n场,每天两轮,保证每个队伍都对战不同的就可以了;然后先考虑把一场循环弄完,也就是整轮循环就是对战5个不同的队伍。(但我怀疑我是不是想的简单了,因为他们那些什么分治法,好像考虑的更多,我这个还是有点陷入比赛安排的细节了)

思考过程

  1. 首先,在看到问题之后,根据MSI的比赛情况,写出了自己对赛制的理解;
  2. 进一步抽象,看到了文章[1]对问题的描述,利用符号来对具体的书进行代表;但是这里有一个问题,他们同时对n这个队伍数也进行了限制,而且,对于比赛天数什么的,我也没有进行假设,所以说,从问题的定义来看,并不完整;
  3. 思考解决的办法,在看到这个东西的第一想法,是通过搜索的角度来进行解决;但搜索到的一些算法都是跟分治法相关;
  4. 在仔细观察了问题之后,第二步中需要思考的问题真的很重要,我看了一些单循环的问题,每天就是打一场,这个很直白,但对于这个问题来说,他并没有说明;但我仔细想了想,很多参数,比如说,每天一共比几场,每天每只队伍比几场,都是收到限制的,并不是完全就很随意;如果能把所有的情况都考虑清楚,问题应该是很好回答的。这个过程,就很像很早的时候,以前学习这个相应的公式推理的时候,就最后一个题,那个n的内容,叫什么想不起来了。
  5. 思考了几个必要的限制条件,两个队伍的比赛,那么队伍总数最好是2*n,这样的话,如果是6支队伍,也就是说一轮比赛下来是3场,这3场情况下就可以保证所有的队伍都参战了。那么我可以给这个赛制安排加上一个限制,每天最起码进行n场比赛,即一轮比赛;那么最后问题的最后结果定义就是:

现在2n支队伍(这里是不考虑队伍为奇数的情况),共计进行2n (2n -1)场比赛;每天至少进行m (m>=1)轮比赛,每轮n场比赛,那么2n * (2n -1) / (nm) = 2(2n - 1) / m,要保证天数是完整的,
同时保证每天的轮数都相等;前面说过的每个队每天要进行m场比赛,而且赛程安排必须保证每天对阵的m个队伍不同(开始解决思路的书写

  1. 限制m参数实现基本算法(解决思路进行到第5步)
  2. 查看了很多现有的博客,他们都是针对的单循环赛,利用的都是分治法,我也看不懂,感觉他们写的不具体;但我自己模拟了一下,如果是直接利用他们所说分治法,对于非2^n的情况就无法满足,而且在文章[2]中也找到了同样的说辞,跟我的想的一样,必须进行一些改进,可以在分治法的基础上。

参考文献

[1]分治法:循环赛日程安排问题
[2]循环赛算法分析

这篇关于双循环比赛队伍排列组合问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064058

相关文章

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复