OPL约束编程:从体育赛程到作业调度与配置问题的应用探索
1. 体育赛程调度模型
在体育赛程调度问题中,我们可以使用OPL(Optimization Programming Language)来构建模型。首先,介绍几个重要的约束条件:
- distribute(occur, values, all(w in EWeeks & s in Slots) team[p, w, s]) extendedPropagation
:该约束指定一个团队在“扩展”赛季中恰好比赛两次。第一个参数指定第二个参数指定的值在第三个参数指定的变量集合中出现的次数,第三个参数收集了所有在周期p中比赛的变量。 extendedPropagation
注解指定对该约束强制执行弧一致性。
- alldifferent(game) onDomain
:该约束指定所有比赛都是不同的,即所有团队都相互比赛。
- link(team[p, w, home], team[p, w, away], game[p, w])
:该约束指定比赛 game[p, w]
由团队 team[p, w, home]
和 team[p, w, away]
组成。OPL对这个符号约束强制执行弧一致性。
搜索过程非常简单,使用“首次失败”原则为比赛生成值。通过约束传播,为比赛生成值会自动为团队分配值。该模型在现代PC(400mhz)上大约44秒内可以为14支球队找到解决方案。
以下是相关代码: