当前位置: 首页 > 知识库问答 >
问题:

潜在的OptaPlanner/Drools错误:奇怪的MultiAccumute ClassCastException

邢新
2023-03-14

复制说明如下。

我在OptaPlanner计划引擎中使用Drools进行评分。

  1. OptaPlanner v8。8.0.期末考试
  2. 流v7的口水。55.0.决赛

此格式的规则是否隐式强制转换了MyConstraintConfiguration

以下规则是否有无效的累积

rule "name"
    when
        $cc : MyConstraintConfiguration()
        accumulate(PlanningEntity($key : key, $value : $cc.getCachedValue($key));
                                  $sumKeys : sum($key),
                                  $sumValues : sum($value);
                                  checkSum($sumValues))
    then
        // scoreHolder.penalize(...)
end

在我的实际实现中,我有一个非常类似的规则。它不需要第二个sum函数,但添加第二个函数会导致调用org时在生成的Drools Java中抛出ClassCastException。流口水。模型功能。函数2$Impl::apply

你不能有一个以上的sum吗?考虑到Drools v7.56.0 Doc,图85,我怀疑这不是一个限制

不幸的是,我无法将生成的代码打印出来以供进一步检查。

在8.8上。x分支/标签

  1. 将这段代码添加到ConferenceConstraintConfiguration
    public static final String NOT_A_RULE = "NotARule";
    @ConstraintWeight(NOT_A_RULE)
    private HardMediumSoftScore notARule = HardMediumSoftScore.ofHard(100_000);
    
    private int value = 1;
    
    public int getValue() {
        return this.value;
    }
    
    public void setValue(int value) {
        this.value = value;
    }
    
    public Integer getStringLength(final String s) {
        return map.computeIfAbsent(s, String::length);
    }
    
    public HardMediumSoftScore getNotARule() {
        return this.notARule;
    }
    
    public void setNotARule(HardMediumSoftScore notARule) {
        this.notARule = notARule;
    }
rule "NotARule"
    when
        $ccc : ConferenceConstraintConfiguration($value : value)
        accumulate(Talk($titleLength : $ccc.getStringLength(title));
                   $totalLength : sum($titleLength),
                   $totalLength2 : sum($titleLength);
                   $totalLength > 0)
    then
        scoreHolder.penalize(kcontext, $totalLength);
end

运行会议调度App::main会议调度ScoreHardConstraintTest中的任何测试(删除类级@禁用后),您应该会得到ClassCastException

如果这是一个错误,请告诉我,我可以为它创建一个问题。

16:03:56.339 [EventQueue-0] INFO  Opened: data\conferencescheduling\unsolved\18talks-6timeslots-5rooms.xlsx
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: class org.optaplanner.examples.conferencescheduling.domain.ConferenceConstraintConfiguration cannot be cast to class org.optaplanner.examples.conferencescheduling.domain.Talk (org.optaplanner.examples.conferencescheduling.domain.ConferenceConstraintConfiguration and org.optaplanner.examples.conferencescheduling.domain.Talk are in unnamed module of loader 'app')
    at org.optaplanner.examples.conferencescheduling.solver.P66.LambdaExtractor66506A5C685462CF06C48BF086E06788.apply(LambdaExtractor66506A5C685462CF06C48BF086E06788.java:1)
    at org.drools.model.functions.Function2$Impl.apply(Function2.java:35)
    at org.drools.model.view.BindViewItem2.eval(BindViewItem2.java:89)
    at org.drools.modelcompiler.constraints.BindingEvaluator.evaluate(BindingEvaluator.java:39)
    at org.drools.modelcompiler.constraints.BindingEvaluator.evaluate(BindingEvaluator.java:35)
    at org.drools.modelcompiler.constraints.LambdaAccumulator$BindingAcc.getAccumulatedObject(LambdaAccumulator.java:142)
    at org.drools.modelcompiler.constraints.LambdaAccumulator.accumulate(LambdaAccumulator.java:77)
    at org.drools.core.rule.MultiAccumulate.accumulate(MultiAccumulate.java:118)
    at org.drools.core.phreak.PhreakAccumulateNode.addMatch(PhreakAccumulateNode.java:736)
    at org.drools.core.phreak.PhreakAccumulateNode.doLeftInserts(PhreakAccumulateNode.java:181)
    at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:89)
    at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:588)
    at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:555)
    at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:382)
    at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:342)
    at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:178)
    at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:136)
    at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:228)
    at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:91)
    at org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:33)
    at org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43)
    at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:869)
    at org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:816)
    at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:808)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1345)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1336)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1320)
    at org.optaplanner.core.impl.score.director.drools.DroolsScoreDirector.calculateScore(DroolsScoreDirector.java:105)
    at org.optaplanner.core.impl.score.DefaultScoreManager.updateScore(DefaultScoreManager.java:46)
    at org.optaplanner.examples.common.business.SolutionBusiness.getScore(SolutionBusiness.java:235)
    at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame.resetScreen(SolverAndPersistenceFrame.java:719)
    at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame.setSolutionLoaded(SolverAndPersistenceFrame.java:686)
    at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$QuickOpenAction.actionPerformed(SolverAndPersistenceFrame.java:247)
    at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame.lambda$0(SolverAndPersistenceFrame.java:202)
    at java.desktop/javax.swing.JList.fireSelectionValueChanged(JList.java:1804)
    at java.desktop/javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1818)
    at java.desktop/javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:219)
    at java.desktop/javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:186)
    at java.desktop/javax.swing.DefaultListSelectionModel.setValueIsAdjusting(DefaultListSelectionModel.java:723)
    at java.desktop/javax.swing.JList.setValueIsAdjusting(JList.java:2152)
    at java.desktop/javax.swing.plaf.basic.BasicListUI$Handler.mouseReleased(BasicListUI.java:2958)
    at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:298)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6632)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6397)
    at java.desktop/java.awt.Container.processEvent(Container.java:2263)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

共有1个答案

宋伯寅
2023-03-14

这是Drools的可执行模型没有提供正确的错误消息,因为这部分规则不正确:

$cc : MyConstraintConfiguration()
accumulate(PlanningEntity($key : key, 
                          $value : $cc.getCachedValue($key)
...

不能在PlanningEntity绑定中使用$cc变量。

我已经申请了JIRA。

 类似资料:
  • 嗨,我刚刚开始将OptaPlanner与drools结合使用。然而,我有两个问题。我相信这取决于我对语法的理解。 当我尝试实例化求解器时,以下规则会引发一个错误。 乘法10000是从双精度值到int的临时转换,我们还不知道它的语法。 该规则旨在计算分配有许多组件的纸张的腰围值。 该规则抛出以下错误。 任何解释都会有帮助。

  • 问题内容: 我正在使用此代码: 但是在编译时出现此错误: 然后是堆栈跟踪的编译器错误。 我将在课堂开始时同时进行这两种导入: 有什么事吗 在Netbeans中,我看到自动完成选项并且Locale对象没有语法错误… 问题答案: 您的设置有些麻烦,下面的程序对我来说很好用。 它要求源代码的事实使我相信它正在尝试以某种调试模式进行编译或运行。您不需要编译java.util。*的源代码,这很奇怪。 看看我

  • 问题内容: 我目前正在开发一个纯粹的HTML和JavaScript驱动的Web应用程序,该应用程序使用CORS来使用远程Web服务,但目前在IE 11发出GET请求时遇到了麻烦。有趣的是,我们在IE8 / 9/10中可以正常运行,而不仅仅是11。 问题是IE 11似乎超时,而不是等待服务器的响应。ajax调用很简单: 在“网络”选项卡中,使用Fiddler,我可以看到IE从不发送请求。 请问有人有

  • 我最近开始了我的第一个libGDX游戏,一切都进行得很好,所有的东西都呈现得很好,但是大约一分钟后什么都没有呈现,呈现调用仍然被发出,并且spritebatch工作得很好,我只是留下了一个黑屏,我甚至把'gl clearcolor()'改成了但我仍然留下了一个黑屏。我不知道这会是什么。 我的主要类: 编辑:我们已经确定,经过一段时间SpriteBatch渲染一个黑色屏幕的红色清晰颜色,它也停止渲染

  • 所以我在做这个素数家庭作业,举了一个很好的例子,我想我已经把大部分都记下来了。我遇到的一件事是“公共静态空隙筛(int n)”一行的错误,这也发生在“私有静态int twinPrime()”中 代码如下: 以下是错误: void是变量筛的无效类型 预期令牌 "(", ; 语法错误 令牌 “)” 上的语法错误, ;预期 和 标记“int”语法错误,应为@ 语法错误,请插入“EnumBody”以完成B

  • 问题内容: 继承人错误: 这是导致它的代码: 图标是文件数组。奇怪的是,我的计算机可以在任何图像查看器中正常读取图像。谷歌搜索错误没有给我任何结果。我有很多图像需要阅读,因此除了将图像转换为BufferedImage之外,它们是获取图像尺寸的一种替代方法吗?这样可以解决问题吗?有没有办法修复这些图像?我是通过从iOS设备收集应用程序图标来获得它们的。使用我自己的设备进行的测试没有产生任何错误,尽管