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

在optaplanner中,分数依赖于多个工作的VRP

鲁炳
2023-03-14

我们正在尝试使用Optaplanner解决VRP。分数计算通过约束流运行。

现在我有两辆车(A和B),想安排两个作业(J1和J2)。构造启发式(FIRST\u FIT\u Desculating)将J1调度到A,J2调度到B,这到目前为止是正确的。

现在这两个作业也有一个属性“customer”,如果这两个作业的客户相同,但车辆不同,我想分配一个惩罚。

为此,我在ConstraintProvider中创建了一个约束,通过groupBy过滤具有相同客户但不同车辆的所有作业。

如果现在打开FULL\u ASSERT\u模式,则在调度J2后会发生IllegalStateException,因为增量计算的分数与完整计算的分数不同。我怀疑这是因为重新计算作业时间的VariableListener只告诉ScoreDirector我的shadowvariables对作业J2的更改,因此只更改与其相关的分数部分。

我如何告诉Optaplanner J1的分数也必须重新计算?我无法通过VariableListener到达作业J1,告诉ScoreDirector必须在此处更改分数。

或者这个问题需要不同的方法吗?

共有1个答案

徐皓君
2023-03-14

这是一个有点难以完全解释的问题。TLDR版本:约束流仅对来自from()connect()ifExist()的对象的更改做出反应。不通过这些语句的对象的更改将不会被捕获,因此会导致分数损坏。下面有更长的解释。

考虑这样一个假设的约束流:

constraintFactory.from(Shift.class)
    .join(Shift.class)
    .filter((shift1, shift2) -> shift1.getEmployee() == shift2.getEmployee())
    ...

这个约束流将很好地工作,因为如果您通过设置不同的员工来更改班次,班次将被重新评估。它们通过from()join()进入流,这就是CS知道如何在移位时重新计算移位。

现在考虑这个约束流:

constraintFactory.from(Shift.class)
    .filter(shift -> shift.getEmployee().getName() == "Lukas")
    ...

如果Shift更改,将重新评估该约束流。但是当员工的姓名发生变化时,约束流不会被重新评估Employee既不在from()中,也不在join()中,对Employee的更改不会触发约束流的重新评估。

在您的特殊情况下,您需要确保以下几点:

  • 变量侦听器将实际发生变化的一切标记为已更改
  • 如果修改问题事实,则需要确保变量侦听器也能处理该问题
  • 您希望约束流作出反应的对象是通过from()join()传入的

 类似资料:
  • 我正在编写一个java jar库。我只想为Gradle的项目添加游戏服务依赖项。我的gradle构建脚本: Gradle sync完成得很好,android studio告诉我一切都好,但当我试图构建: 我的gradle版本2.13。另外,我使用了最新的gradle版本候选版本。没什么。

  • 我一直在尝试将< code>webdriver注入到步骤中。我已经使用了这个说明,效果很好。 想法是将WebDriver作为服务注入到steps类中。在初始步骤,您需要添加以下依赖项。 依赖关系注入涉及三个主要类。在这里,我们逐一介绍它们。 BaseUtil BaseUtil是具有WebDriverof Selenium属性的类。这个类非常简单: 钩 钩子类包含之前和之后的

  • 我对匕首2还不太熟悉。我正试图在我的Android项目中实现它。我有一个需要。我用匕首把它注射到这个服务中。 、和具有标记为的方法当我构建项目时,我收到以下错误: locationServiceComponent依赖于多个作用域组件:@Singleton NetComponent@Singleton RepositoryComponent 我知道我的不能依赖于两个作用域组件,但我的服务中需要这两个

  • 问题内容: 我有两个工作: 上载 发射实例 我想使 Launch-instance 依赖于另一个,以便触发 Launch-instance 自动导致上 载 首先运行。 我可以使用内置的Jenkins功能还是使用插件来实现? 请注意,我 不 希望 上传 总是触发 启动实例 ,这是“建等项目后建”的选项 启动实例 会做。我想要的东西更 类似于 Ant中的 attribute 如何工作 。 问题答案:

  • 本文向大家介绍DBMS中的多值依赖,包括了DBMS中的多值依赖的使用技巧和注意事项,需要的朋友参考一下 什么是多值依赖? 当表中存在一个或多个行时,意味着同一表中存在一个或多个其他行,则发生多值依赖关系。 如果表具有属性P,Q和R,则Q和R是P的多值事实。 用双箭头表示- ->-> 对于我们的示例: P->-> Q P->-> R 在上述情况下,仅当Q和R是独立属性时,才存在多值依赖关系。 具有多

  • 这个问题类似于使一个源集依赖于另一个源集 这不起作用,因为您不能直接将源集添加为依赖项。建议的方法是: 但是这在eclipse中不能正常工作,因为当我清理gradle build文件夹时,eclipse不能再编译了,因为它依赖于gradle build。此外,如果我更改了主代码,我必须在gradle中重新构建项目,以便更改在Eclipse中生效。 如何正确声明依赖项? 这个 适用于主源代码,但由于