Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解决方案中存在重复的规划实体_Java_Optaplanner_Constraint Programming - Fatal编程技术网

Java 解决方案中存在重复的规划实体

Java 解决方案中存在重复的规划实体,java,optaplanner,constraint-programming,Java,Optaplanner,Constraint Programming,我是Optaplanner的新手,我尝试解决一个非常简单的问题(现在,我最终会添加更多约束)。 我的模型如下:我有任务(MarkerNesting),必须在VirtualMachine上一次运行一个任务;我们的目标是将一个列表的代码> >标记嵌套< /代码> s到虚拟机< /代码> s,使用所有机器(我们可以认为我们有比机器更多的任务作为第一个近似值)。因此,我希望每个任务都有一个开始和结束日期(作为影子变量-尚未实现) 我想我必须使用一个链式变量,VirtualMachine作为锚(通过时间模

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

我想我必须使用一个链式变量,
VirtualMachine
作为锚(通过时间模式链式)-对吗

所以我根据一些例子(tsp、coach和shuttle)写了一篇有4台机器和4个任务的文章,我希望每台机器在解决问题时都有一个任务。但在运行它时,我得到了一些奇怪的结果:并不是所有的机器都被使用,但最糟糕的是我有重复的
MarkerNesting
实例(输出示例):

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

我的代码有什么错误吗?这是正常的行为吗


提前谢谢你

未创建的重复MarkerName实例具有相同的内容,但具有不同的内存地址,
也是如此=来自彼此:这意味着默认解决方案克隆器(基于反射)出现错误时会出现问题。已经有一段时间没有人在那里遇到问题了。请参阅“计划克隆”的文档部分。链式变量的复杂模型(它)在这里一点帮助都没有

有时,一个位置合适的
@DeepPlanningClone
会修复它,但在这种情况下,这可能是由于没有拾取
@InverseRelationShadowVariable
造成的


在任何情况下,setter方法中的那些
system.out
都是误导性的-它们既可能由解决方案克隆者发生,也可能由移动发生,因此如果没有解决方案哈希(=内存地址),它们将一无所获。在您的最佳解决方案更改事件中,或者在调用
cloneWorkingSolution()
BestSolutionRecaller
中,尝试对原始和克隆执行类似的system.out。

正如所料,我做了一些错误的事情:在
计划中(
规划解决方案
),我有一个用于
VirtualMachine
集合的getter,它从另一个字段计算(
Pool
:每个
Pool
都包含
VirtualMachine
s)。因此,没有setter,解决方案克隆人可能无法正确克隆解决方案(可能是因为
未注释为问题事实或规划实体?)

为了解决这个问题,我删除了
类(实际上不需要),在
计划中留下了
虚拟机
的集合

总而言之,在你需要它们之前,千万不要引入太多的类


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

找到实际原因后请发表评论!这样我可以让OptaPlanner在引导时检测到它。不确定它是否相关,但在非侵入性的全断言模式下运行时,我会遇到一个异常:请参阅stacktrace。此外,我在解算器中添加了一个事件侦听器,这样当我得到一个最佳解决方案时,我就可以将其记录下来(但我无法得到旧的);第一次移动后的解决方案仍然正常,但下一次移动已损坏。FULL_ASSERT也应给出该异常。传递给
解算器的初始解决方案。solve(…)
的下一个解决方案不一致,因此它已损坏。没错,我使用同一台计算机上的所有任务初始化了一个解决方案,因此下一个解决方案是
null
(在所有其他
虚拟机上)。解决方案克隆器查看字段,而不是获取者。但这确实解释了这一点:出于某种原因,VirtualMachine类正在计划克隆(它们包含一个真实或影子变量或指向实体类),但解决方案克隆器没有进入池类,因此它只替换了这些类中的引用。解决方案是@DeepPlanningClone解决方案中的pools字段。好的,我也会试试这个。也许我最终会需要它,知道这一点很好。非常感谢。它确实在
类上与
@DeepPlanningClone
一起工作,但在字段上不起作用。嗯,它应该:。那听起来像个虫子。如果你确定它是那样的,请创造一个jira。我可以随意复制它。我创建了一个jira:
[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]]