将ProbemFactChange添加到实时计划的解决方案后的链不一致



我在optaplanner上工作了一段时间,但这是我第一次进行实时规划,问题是一个带有时间窗口的非常基本的链式VRP,但我知道我有问题。

工作一段时间后,当我从链中删除一些带有文档序列的Standstill(ScoreDirector#beforeEntityRemoved,从列表中删除实体并刷新列表实例,ScoreDirector#afterEntityRemoved,然后是ScoreDirector#triggerVariableListeners(时,链变得不一致,前一个StandStell的下一个停顿与当前停顿不同,有时甚至是null

但只有当我删除了2或3个以上的Standstill时,所有这些才会发生,如果我只删除了1个,它就会继续工作

PD:关于删除实体:我尝试过从当前链中删除实体引用,也尝试过不删除实体引用。但当我手动从链中删除元素时,有时会显示一个错误,告诉我引用是错误的,但我不明白为什么当我检测到链不一致时,optaplanner没有检测到它。

for (int i = 0; i < visitsToRemove.size(); i++) {
OptimizingVisit visit = visitsToRemove.get( i );
OptimizingVisit solverReference = scoreDirector.lookUpWorkingObject( visit );
scoreDirector.beforeEntityRemoved( solverReference );
solution.getVisits().remove( solverReference ); //working equals method is implemented here
solution.setVisits( new ArrayList<>( solution.getVisits() ) );
scoreDirector.afterEntityRemoved( solverReference );
logger.info( String.format("Order #%s (%s) was removed from the solution",visit.getOrderNumber(),visit.getOrderId()) );
}

我知道你们可能需要更多信息,我会根据需要提供给你们,但我真的不知道你们需要什么,我的问题几乎是一个例子的副本,其中有一些ID作为我域实体的参考。

提前感谢

从visitList中删除访问a是不够的。您还需要从链中删除A。previous引用指向a的任何就诊B现在必须指向a.previor。C.next指向a的所有就诊C(=a.previour(现在必须指向a.next(=B(。

是的,这是一家医院。VRP的简化总有一天会让这件事变得容易得多。

最新更新