如何解决具有链式规划变量的PartitionedSearch的最佳做法?
我一直在尝试使用链式计划变量和锚点对TWVSP进行修改。与TWVSP带有“停止”的示例类似的方法。
它看起来像这样:
Vehicle1 (AnchorShadowVarialbe) - Trip1_1 - Trip1_2 - ... - Trip1_k1
...
VehicleM (Anchor) - TripM_1 - TripM_2 - ... - TripM_kM
将小点分配给车辆。每个行程都有一个开始/结束时间戳记。一辆车不能服务两次重叠的旅程。
为了加快求解速度,我开始使用SolutionPartitioner
实现将搜索空间划分为多个分区,因为可以根据行程的时间范围将行程分组。我们的目标是为这些集群分配出行车辆,但是我只有一个车队。
第一个问题,我不能使用相同的车辆对象,因为求解器将失败并显示IllegalStateException
-很好,我为每个分区克隆了车辆列表,并分配了前往这些克隆对象的行程
然后,我捕获phaseEnded
事件,其中phaseScope
是PartitionedSearchPhaseScope
的一个实例(即分区搜索结束事件),然后将行程重新分配给原始车辆对象(确保指针都指向各个方向上的相同对象(类似于示例中的prevIoUsstandstill,nextVisit),并手动修复了链条,因此群集链仅锚定在原始车辆上,并且将它们链接在一起:
vehicleX - (partition0.trip(0)) - ... - (partition(i-1).trip(last)) - (partition(i).trip(0)) - ...
partitionPhaseScope.getSolverScope().setBestSolution(mergedSolution);
Caused by: java.lang.IllegalStateException: The move thread with moveThreadindex (65) has thrown an exception. Relayed here in the parent thread.
at org.optaplanner.core.impl.heuristic.thread.OrderByMoveIndexBlockingQueue.take(OrderByMoveIndexBlockingQueue.java:147)
at org.optaplanner.core.impl.localsearch.decider.MultiThreadedLocalSearchDecider.forageResult(MultiThreadedLocalSearchDecider.java:188)
at org.optaplanner.core.impl.localsearch.decider.MultiThreadedLocalSearchDecider.decideNextStep(MultiThreadedLocalSearchDecider.java:159)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:71)
at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:99)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:189)
at com.mynamespace.planner.v4.rest.ScheduleResource.startSolving(ScheduleResource.java:221)
at com.mynamespace.planner.v4.rest.ScheduleResource.solve(ScheduleResource.java:112)
at com.mynamespace.planner.v4.rest.ScheduleResource_ClientProxy.solve(ScheduleResource_ClientProxy.zig:156)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:638)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:504)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:454)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:456)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:417)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:391)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
at org.jboss.resteasy.core.Synchronousdispatcher.invoke(Synchronousdispatcher.java:488)
... 49 more
Caused by: java.lang.NullPointerException
at org.drools.core.common.NamedEntryPoint.update(NamedEntryPoint.java:353)
at org.drools.core.common.NamedEntryPoint.update(NamedEntryPoint.java:338)
at org.drools.core.impl.StatefulKNowledgeSessionImpl.update(StatefulKNowledgeSessionImpl.java:1587)
at org.drools.core.impl.StatefulKNowledgeSessionImpl.update(StatefulKNowledgeSessionImpl.java:1559)
at org.optaplanner.core.impl.score.stream.drools.DroolsConstraintSession.update(DroolsConstraintSession.java:47)
at org.optaplanner.core.impl.score.director.stream.ConstraintStreamscoreDirector.afterVariableChanged(ConstraintStreamscoreDirector.java:141)
at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.retract(SingletonInverseVariableListener.java:96)
at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.beforeVariableChanged(SingletonInverseVariableListener.java:46)
at org.optaplanner.core.impl.domain.variable.listener.support.VariableListenerSupport.beforeVariableChanged(VariableListenerSupport.java:174)
at org.optaplanner.core.impl.score.director.AbstractscoreDirector.beforeVariableChanged(AbstractscoreDirector.java:433)
at org.optaplanner.core.impl.score.director.AbstractscoreDirector.changeVariableFacade(AbstractscoreDirector.java:446)
at org.optaplanner.core.impl.heuristic.selector.move.generic.chained.ChainedChangeMove.doMoveOnGenuineVariables(ChainedChangeMove.java:74)
at org.optaplanner.core.impl.heuristic.move.AbstractMove.doMove(AbstractMove.java:36)
at org.optaplanner.core.impl.heuristic.move.AbstractMove.doMove(AbstractMove.java:31)
at org.optaplanner.core.impl.score.director.AbstractscoreDirector.doAndProcessMove(AbstractscoreDirector.java:178)
at org.optaplanner.core.impl.heuristic.thread.MoveThreadRunner.run(MoveThreadRunner.java:146)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
任何想法都缺少什么? 是否有关于如何使用链式计划变量进行PartitionedSearch的文档?
谢谢。
解决方法
FactHandle可能为null,因此至少应该改善错误消息:https://issues.redhat.com/browse/PLANNER-2222
对于实际的错误,您的Partitioned可能会创建一个分区,该分区在@ProblemFactCollectionProperty
或@PlanningEntityCollectionProperty
中没有该事实,但确实存在于链接实体的尾链中(= think变量)收听者的到达时间等“更新”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。