PHP如何实现带多约束的多变量循环赛赛程编排
多约束循环赛赛程编排问题
场景基础参数
- 参赛队伍共11支
- 可用比赛场地共5块
- 总比赛日共14个
- 每个比赛日每块场地安排2支队伍对阵,当日剩余1支队伍轮空
通用循环赛仅能完成队伍对阵编排,无法满足当前队伍、场地关联匹配的多约束要求。
强制约束规则
- 单支队伍整个赛程轮空总次数不超过2次
- 任意两支队伍的对阵总次数不超过2次
- 单支队伍在同一块场地的参赛总次数不超过3次
基础数据定义
$teams = array("Team 1","Team 2","Team 3","Team 4","Team 5","Team 6","Team 7","Team 8","Team 9","Team 10","Team 11"); $courts = array("Court 1","Court 2","Court 3","Court 4","Court 5","Bye"); $dates = array("Date 1","Date 2","Date 3","Date 4","Date 5","Date 6","Date 7","Date 8","Date 9","Date 10","Date 11","Date 12","Date 13","Date 14");
预期输出结构
赛程按比赛日层级划分,每个比赛日下对应各场地的对阵队伍、当日轮空队伍,结构示例如下:
[Date 1] => [Court 1] => [Team 1] [Team 2] [Court 2] => [Team 3] [Team 4] [Court 3] => [Team 5] [Team 6] [Court 4] => [Team 7] [Team 8] [Court 5] => [Team 9] [Team 10] [Bye] => [Team 11] [Date 2] => ...
当前实现进度与卡点
早期尝试过简化实现逻辑:每个比赛日随机选出1支队伍作为当日轮空队伍,剩余10支队伍随机配对对阵,但该方案无法稳定满足全部约束规则,也无法确认该组约束下的赛程是否100%可实现,未找到无失败概率的生成方式。
目前已完成对阵、轮空维度的编排:基于标准循环赛算法可生成11轮基础对阵(每轮1支队伍轮空,其余队伍对阵对手不重复),追加前3轮对阵即可凑齐14个比赛日的对阵池,随机打乱处理后可稳定满足「单队轮空不超2次」「任意两队对阵不超2次」两项规则。
核心瓶颈在场地分配环节:如果仅校验单支队伍的场地使用次数,逻辑实现难度极低——分配时判断队伍在目标场地的参赛次数达到阈值就重新选择即可。但每块场地同时对应2支参赛队伍,需要同时校验对阵双方的场地使用次数是否都不超限,双主体约束下随机分配极易触发死锁:即某组对阵的双方都已经用完了所有可用场地的参赛配额,无合法场地可分配,需要一套简便、稳定的实现逻辑解决该问题。
内容的提问来源于stack exchange,提问作者ballinamuck
相关产品推荐
相关产品推荐

