OptaPlanner使用.penalizeLong抛出UnsupportedOperationException如何解决
异常引发原因
该异常的核心原因是约束调用的惩罚方法类型与当前分数定义的存储类型不匹配,具体触发场景如下:
- OptaPlanner的分数实例分为int类型(如
SimpleIntScore、HardSoftIntScore)和long类型(如SimpleLongScore、HardSoftLongScore)两类,int类型分数的底层权重影响器(impacter)仅支持接收int类型的惩罚/奖励值 - 你在使用int类型分数的前提下,调用了
penalizeLong()方法传入long类型的惩罚值,int类型的impacter无法处理long入参,因此抛出该异常 - 少数场景下也可能是单条约束手动绑定了int类型的可配置权重,后续却调用long类型的惩罚方法引发类型冲突
解决方法
根据你的业务场景选择对应方案即可:
- 若业务需要用到超过int取值范围的惩罚值,将全局分数定义替换为long类型实现:例如将
HardSoftIntScore改为HardSoftLongScore,同步调整所有分数相关的配置项,调整后即可正常使用penalizeLong()方法 - 若惩罚值的取值范围在int的合法范围内(-231到231-1),直接将
penalizeLong()方法替换为int版本的penalize(),同时将入参的long类型惩罚值转换为int类型即可 - 若使用的是可配置权重的约束,将该约束的权重配置类型从int改为long,同时将方法调用替换为
penalizeConfigurableLong()即可
注:同一个约束的分数维度类型、惩罚/奖励方法类型、权重配置类型必须完全一致,即可避免该类类型不匹配异常
内容的提问来源于stack exchange,提问作者Luka Bradeško
相关产品推荐
相关产品推荐

