我正在尝试使用constraint_factory添加一个OptaPy,这是OptaPlanner的Python变体(使用学校时间表快速启动作为基础)来调度体育比赛。每场比赛有两个队,所以比赛类中有两个变量: team1和team2以及一个time_slot和音调。
如果一支球队(无论是team1还是team2变量)在一天内被分配了超过2场比赛,我怎么能有一个约束,可以奖励或惩罚?
发布于 2021-12-07 09:42:57
我建议以不同的方式对待它。从Team开始,在join中使用Match,其中任何一个团队是相等的,在groupBy()中使用count()。您需要在groupBy、team和比赛日中添加一个组合组密钥。
在OptaPlanner的原生语言Java中,这样的约束是这样的:
constraintFactory.forEach(Team.class)
.join(Match.class,
Joiners.filtering((team, match) -> team == match.team1 || team == match.team2))
.groupBy((team, match) -> team,
(team, match) -> match.day,
countBi())
.filter((team, day, matchCount) -> matchCount > 2)
.penalize(..., (team, day, matchCount) -> matchCount - 2);从它得到Python变体应该相对容易;另一个答案可能会提供它。
发布于 2021-12-07 14:53:35
Lukas的Python变体回答:
from org.optaplanner.core.api.score.stream.ConstraintCollectors import countBi
constraint_factory.forEach(TeamClass)
.join(MatchClass,
Joiners.filtering(lambda team, match: team == match.team1 or team == match.team2)) \
.groupBy(lambda team, match: team,
lambda team, match: match.day,
countBi()) \
.filter(lambda team, day, matchCount: matchCount > 2) \
.penalize(..., lambda team, day, matchCount: matchCount - 2)https://stackoverflow.com/questions/70249606
复制相似问题