首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OptaPy对同一目标的groupBy 2变量的约束

OptaPy对同一目标的groupBy 2变量的约束
EN

Stack Overflow用户
提问于 2021-12-06 17:40:27
回答 2查看 246关注 0票数 1

我正在尝试使用constraint_factory添加一个OptaPy,这是OptaPlanner的Python变体(使用学校时间表快速启动作为基础)来调度体育比赛。每场比赛有两个队,所以比赛类中有两个变量: team1和team2以及一个time_slot和音调。

如果一支球队(无论是team1还是team2变量)在一天内被分配了超过2场比赛,我怎么能有一个约束,可以奖励或惩罚?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-07 09:42:57

我建议以不同的方式对待它。从Team开始,在join中使用Match,其中任何一个团队是相等的,在groupBy()中使用count()。您需要在groupBy、team和比赛日中添加一个组合组密钥。

在OptaPlanner的原生语言Java中,这样的约束是这样的:

代码语言:javascript
复制
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变体应该相对容易;另一个答案可能会提供它。

票数 2
EN

Stack Overflow用户

发布于 2021-12-07 14:53:35

Lukas的Python变体回答:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70249606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档