在实时计划中将 ProblemFactChange 添加到 Ssolution 后链不一致

Inconsistent chain after adding ProblemFactChange to Ssolution on real-time planning

我用 optaplanner 工作了一段时间,但这是我第一次做实时规划,问题是一个非常基本的链式 VRP 与时间 windows,但我知道我有一个问题。

工作一段时间后,我用文档序列删除了一些 StandstillScoreDirector#beforeEntityRemoved,从列表中删除实体并刷新列表实例,ScoreDirector#afterEntityRemoved 然后ScoreDirector#triggerVariableListeners) 从链上看,链条变得不一致,之前的StandStill的下一个stand和当前的stand不一样,有时甚至是null

但这一切只有当我删除超过 2 或 3 个 Standstills 时才会发生,如果我只删除 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 的示例副本作为对我域中实体的引用。

提前致谢

从访问列表中删除访问 A 是不够的。 您还需要从链中删除 A。任何具有指向 A 的 previous 引用的访问 B,现在必须指向 A.previous。 C.next 指向 A 的任何访问 C (=A.previous) 现在必须指向 A.next (= B)。

是的,这是一个 PITA。 VRP 简化有一天会让这件事变得容易得多。