解决方案中重复的计划实体

时间:2019-04-19 08:37:42

标签: java optaplanner constraint-programming

我是Optaplanner的新手,我尝试解决一个非常简单的问题(目前,我最终将添加更多约束)。 我的模型如下:我有一些任务(MarkerNesting),它们必须一次在VirtualMachine上运行;目标是分配MarkerNestingVirtualMachine的列表,让所有机器都使用(作为第一近似值,我们可以认为比机器有更多的任务)。因此,我希望每个任务都有一个开始日期和一个结束日期(作为阴影变量-尚未实现)。

我认为我必须使用一个链接变量,VirtualMachine是锚点(通过时间模式链接)-是吗?

所以我写了一个program,它受一些例子启发(茶匙,教练和班车),其中包含4台机器和4个任务,并且我希望每台机器在解决时都有一个任务。但是,在运行它时,我得到一些奇怪的结果:并非所有机器都被使用,但是最糟糕的是我有重复的MarkerNesting实例(输出示例):

[VM 1/56861999]~~~>[Nesting(155/2143571436)/[Marker m4/60s]]~~~>[Nesting(816/767511741)/[Marker m2/300s]]~~~>[Nesting(816/418304857)/[Marker m2/300s]]~~~>[Nesting(980/1292472219)/[Marker m1/300s]]~~~>[Nesting(980/1926764753)/[Marker m1/300s]]
[VM 2/1376400422]~~~>[Nesting(155/1815546035)/[Marker m4/60s]]
[VM 3/1619356001]
[VM 4/802771878]~~~>[Nesting(111/548795052)/[Marker m3/180s]]

实例不同(以读取日志:[Nesting(id/hashcode)]),但是它们具有相同的ID,因此最后它们是相同的实体。如果我理解得很好,Optaplanner会在找到最佳解决方案时克隆该解决方案,但我不知道为什么会混合这样的实例。

我的代码有什么问题吗?这是正常行为吗?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您没有创建的重复MarkerNesting实例具有相同的内容,但是具有不同的内存地址,!=彼此也是如此:这意味着默认解决方案克隆器基于以下内容出现错误:反射。已经有一段时间了,因为那里有人遇到问题。请参阅“计划克隆”文档部分。链变量的复杂模型(will be improved)在这里根本无济于事。

有时候,放置良好的@DeepPlanningClone可以修复它,但是在这种情况下,也可能是由于未选择@InverseRelationShadowVariable导致的。

在任何情况下,setter方法中的system.out都是令人误解的-它们既可以由解决方案克隆程序生成,也可以由移动生成,因此,如果没有解决方案哈希(=内存地址),它们就会告诉您没有。对于原始副本和克隆副本,请尝试在最佳解决方案更改事件或对BestSolutionRecaller的{​​{1}}调用中进行类似的system.out。

答案 1 :(得分:1)

正如预期的那样,我做错了事情:在SchedulePlanningSolution)中,我有一个VirtualMachine集合的吸气剂,该集合是从另一个字段({{1 }}:每个pools拥有Pool个)。结果,那里没有设置器,解决方案克隆程序可能无法正确克隆解决方案(可能是因为VirtualMachine未被标注为问题事实或计划实体吗?)。

为解决此问题,我删除了pools类(并非真正需要),在Pool中保留了VirtualMachine个集合。

总而言之,在需要它们之前切勿引入过多的类^ _ ^'

我在github上推送了正确版本的代码。