首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有约束问题的光学装置(groupBy和sum)

有约束问题的光学装置(groupBy和sum)
EN

Stack Overflow用户
提问于 2021-12-28 12:31:51
回答 1查看 65关注 0票数 1

刚开始测试optapy,我在尝试使用optapy、groupBy和sum时出错了:

TypeError:“函数”对象不可迭代

可能是为了求和的理由。有什么帮助吗?

代码语言:javascript
复制
def lecturer_teaching_load(constraint_factory: ConstraintFactory):
    print("Restricting by Teaching Load")
    return constraint_factory.forEach(SubjectClass) \
        .groupBy(lambda subject: subject.lecturer, sum(lambda subject: subject.teaching_load)) \
        .filter(lambda lecturer, load: lecturer.real_cap > load) \
        .penalize("Capacity conflict", HardSoftScore.ONE_HARD)

如果为同一位讲师计划的课程太多,就会受到惩罚。

EN

回答 1

Stack Overflow用户

发布于 2022-01-14 18:02:39

这里的主要问题是您使用的是内置的python sum函数(它需要一个可迭代的,并返回一个数字),而不是ConstraintCollectors.sum函数(它接受一个函数,并返回一个ConstraintCollector)。

JPype目前无法在没有显式强制转换的情况下区分函数重载,因此目前需要在和内将lambda转换为适当的类型(在本例中为java.util.function.ToIntFunction)。这是为Joiners自动完成的,但对于ConstraintCollectors则不是这样(ConstraintCollectors在不同的地方使用各种不同的类型,这使得在不重复API的情况下自动化过程变得更加困难)。这一守则应适用于:

代码语言:javascript
复制
from optapy.constraint import ConstraintCollectors
from java.util.function import ToIntFunction

def lecturer_teaching_load(constraint_factory: ConstraintFactory):
    print("Restricting by Teaching Load")
    return constraint_factory.forEach(SubjectClass) \
        .groupBy(lambda subject: subject.lecturer, ConstraintCollectors.sum(ToIntFunction @ (lambda subject: subject.teaching_load))) \
        .filter(lambda lecturer, load: lecturer.real_cap > load) \
        .penalize("Capacity conflict", HardSoftScore.ONE_HARD)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70507127

复制
相关文章

相似问题

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