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

在Drools中调试Optaplanner规则

魏波娃
2023-03-14

在为我的项目实现了一些规则之后,我做了一个“ScoreConsistencyCheck”,以确保规则得到了正确的实现。

"ScoreConst encyCheck"表示实现我自己的Java方法,该方法将在我提前终止求解或通过配置终止后调用,输出预期分数。该方法的参数是一个解决方案实例,基于解决方案的状态计算预期分数,然后将其与来自解决方案实例的“分数”变量的分数进行比较。

当我使用FULL_ASSERT时,它不会抛出Score腐败异常,但是当我这样尝试时,我有时会在构建启发式或本地搜索的特定步骤中获得分数差异。我的猜测是因为OptaPlanner不知道基于解决方案的预期分数是多少,它只关心FULL_ASSERT步骤分数与撤消操作完成后重新计算的分数相同。

因此,由于“ScoreConsistencyCheck”仅在求解结束后调用,我无法真正推断是什么情况导致了问题(如果它导致了任何问题),因为发生这种情况的移动和步骤未知。

因此,我正在寻找一种方法,在每次移动后显示我的预期分数(来自“ScoreConsistencyCheck”),以便我可以将其与OptaPlanner进行比较,并找到计算中遗漏的案例。要做到这一点,我需要一种方法,在每次移动后获得有效的解决方案。

经过一番搜索,我没能找到多少。然而,我发现在Optaplanner 7.0.0测试版中有一个记分验证器(使用Optaplanner 6.4.0),但情况是:

  • 我不知道这是否能实现我想要的,因为几乎没有关于它的文档
  • 我在实施上有困难

我的问题是:

  1. 如何在每次移动后获取工作解决方案,并将其用于检查
  2. Optaplanner 6.4.0中是否有允许我这样做的功能
  3. 如果没有功能,是否有可能的解决方法
  4. 有没有更好的方法来检查规则的分数一致性

暂时还没有答案

 类似资料:
  • 我们有一个使用Drools规则的遗留Java/Spring项目。有什么方法可以在IntelliJ上调试规则文件,比如添加断点和单步执行规则逻辑?

  • 我正在享受Optaplanner的旅程。Java不是我的“母语”,但令我惊讶的是(陡峭?)Optaplanner学习曲线 到目前为止,我得到了什么:我已经制作了一个带有必要类的项目。为了回答我的问题,我将简化为:一个类、一个类、一个类和类,我想在其中获得我完美的Opta计划时间表。 我的员工类有一个变量

  • 我有一个java方法可以从所有不遵循给定首选项的TeamCalendar对象(pinned=true的规划实体)中创建constraintstream。 因此,我希望有一个约束流,表示每个部门存在多少这些差异。这是java代码: 在调试模式下运行时,第一个过滤器(tc- 我尝试了一些琐碎的选择: . groupBy(tc- 以及计数方法的替代方案: 。groupBy(TeamCalendar::g

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

  • 我正在编写一项规则,以根据申诉的类别确定应接受的服务类型。 我写了一个jUnit联调来使用一个新创建的java对象来测试该规则,该对象名为“申诉DTO”。 我写了一个服务类来取消规则。 jUnit测试失败。 java.lang.NullPointerException在cm.grievance.rules.规则est.calculate资格(规则est.java:13) 我用KieContaine

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例