首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OptaPlanner在CartesianProductMoveSelector创建的CompositeMove上抛出IllegalStateException

OptaPlanner在CartesianProductMoveSelector创建的CompositeMove上抛出IllegalStateException
EN

Stack Overflow用户
提问于 2019-03-25 22:59:03
回答 2查看 344关注 0票数 3

所以基本上我的问题是,OptaPlanner抛出了这个:

代码语言:javascript
复制
java.lang.IllegalStateException: The entity (...) has a variable (previousEntry) with value (...) which has a sourceVariableName variable (nextEntry) with a value (...) which is not null.
Verify the consistency of your input problem for that sourceVariableName variable.
    at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.insert(SingletonInverseVariableListener.java:72)
    at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.afterVariableChanged(SingletonInverseVariableListener.java:51)
    at org.optaplanner.core.impl.domain.variable.listener.support.VariableListenerSupport.triggerVariableListenersInNotificationQueues(VariableListenerSupport.java:209)
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.triggerVariableListeners(AbstractScoreDirector.java:259)
    at org.optaplanner.core.impl.heuristic.move.AbstractMove.doMove(AbstractMove.java:36)
    at org.optaplanner.core.impl.heuristic.move.AbstractMove.doMove(AbstractMove.java:30)
    at org.optaplanner.core.impl.heuristic.move.CompositeMove.doMove(CompositeMove.java:108)
    at org.optaplanner.core.impl.heuristic.move.CompositeMove.doMove(CompositeMove.java:37)
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.doAndProcessMove(AbstractScoreDirector.java:187)
    at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.doMove(LocalSearchDecider.java:132)
    at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.decideNextStep(LocalSearchDecider.java:116)
    at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:70)
    at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:88)
    at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:191)

我正在使用下面的代码创建移动:

代码语言:javascript
复制
<cartesianProductMoveSelector>
    <ignoreEmptyChildIterators>true</ignoreEmptyChildIterators>
    <changeMoveSelector/>
    <swapMoveSelector/>
</cartesianProductMoveSelector>

我正在尝试优化一个链,所以我为我的计划变量previousEntry设置了一个影子变量(nextEntry)。如果我使用unionMoveSelector,一切都会正常工作,但现在我想尝试组合我的步骤,这样OptaPlanner就可以从局部最优中走出来。我只有一个计划变量。

编辑:刚刚更新为7.19.0.Final问题仍然存在...

EDIT2:刚刚用FULL_ASSERT测试了,得到了同样的结果,没有cartesianProductMoveSelector我得到了一个结果:

Solving ended: time spent (371190), best score (0hard/-31648770soft), score calculation speed (81/sec), phase total (3), environment mode (FULL_ASSERT).

如果我添加cartesianProductMoveSelector,我会得到完全相同的异常

EDIT3:我刚刚用vrp-example of optaplanner (7.17.0.Final)进行了测试,得到了完全相同的异常:

代码语言:javascript
复制
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Solving failed.
at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$SolveWorker.done(SolverAndPersistenceFrame.java:382)
at javax.swing.SwingWorker$5.run(SwingWorker.java:737)
at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:832)
at sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:842)
at javax.swing.Timer.fireActionPerformed(Timer.java:313)
at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Caused by: java.lang.IllegalStateException: The entity (Customer-7) has a variable (previousStandstill) with value (Customer-33) which has a sourceVariableName variable (nextCustomer) with a value (Customer-5) which is not null.
Verify the consistency of your input problem for that sourceVariableName variable.
at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.insert(SingletonInverseVariableListener.java:72)
at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.afterVariableChanged(SingletonInverseVariableListener.java:51)
at org.optaplanner.core.impl.domain.variable.listener.support.VariableListenerSupport.triggerVariableListenersInNotificationQueues(VariableListenerSupport.java:209)
at org.optaplanner.core.impl.score.director.AbstractScoreDirector.triggerVariableListeners(AbstractScoreDirector.java:261)
at org.optaplanner.core.impl.heuristic.move.AbstractMove.doMove(AbstractMove.java:36)
at org.optaplanner.core.impl.heuristic.move.AbstractMove.doMove(AbstractMove.java:30)
at org.optaplanner.core.impl.heuristic.move.CompositeMove.doMove(CompositeMove.java:108)
at org.optaplanner.core.impl.heuristic.move.CompositeMove.doMove(CompositeMove.java:37)
at org.optaplanner.core.impl.score.director.AbstractScoreDirector.doAndProcessMove(AbstractScoreDirector.java:189)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.doMove(LocalSearchDecider.java:132)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.decideNextStep(LocalSearchDecider.java:116)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:70)
at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:88)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:191)
at org.optaplanner.examples.common.business.SolutionBusiness.solve(SolutionBusiness.java:329)
at org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame$SolveWorker.doInBackground(SolverAndPersistenceFrame.java:370)
at javax.swing.SwingWorker$1.call(SwingWorker.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at javax.swing.SwingWorker.run(SwingWorker.java:334)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

我会提交一期

EDIT4:提交的问题可以在here中找到

EN

回答 2

Stack Overflow用户

发布于 2019-06-07 03:27:10

创建具有多个ChainedChange和ChainedSwapMoves的CompositeMove时的体验相同。这样做的原因是,您的第一个移动可能会更改在第一个移动之后的移动中操作的PlanningEntity的PlanningValue。虽然移动的创建已经捕获了所有变量和值的状态,但第二个移动预期了不再存在的计划状态。

示例:移动前的链条:

(I) A -> B -> C -> D

你的复合移动: 1)将B移动到A前面的ChainedChangeMove 2)将D移动到C前面的ChainedChangeMove

在移动创建中,这些值将存储在移动中,如(I)所示。Move 1将正确执行。

移动后的解决方案1):(II) B -> A -> C -> D

第二次移动将尝试将D移到B后面,但是B已经在A的previousStandstill变量中被引用

您可以使用其他版本的组合动作创建类似的场景。只要链式移动在创建移动时保存链的状态,联合移动和复合站点移动就有可能失败。

票数 2
EN

Stack Overflow用户

发布于 2020-04-22 23:16:37

我也有同样的问题,并设法避免了MoveFilter的问题,它阻止了Frank在他的回答中解释的情况(compositMove中的一个移动会影响另一个移动)。以下是我对解决方法的错误编码的概念证明:

代码语言:javascript
复制
public class ParallelTaskMoveFilter
            implements SelectionFilter<EngineerRoutingSolution, CompositeMove<EngineerRoutingSolution>> {

        @Override
        public boolean accept(ScoreDirector<EngineerRoutingSolution> scoreDirector,
                CompositeMove<EngineerRoutingSolution> selection) {
            Move<EngineerRoutingSolution>[] childMoves = selection.getMoves();
            ChangeMove<EngineerRoutingSolution> firstMove = (ChangeMove<EngineerRoutingSolution>) childMoves[0];
            ChangeMove<EngineerRoutingSolution> secondMove = (ChangeMove<EngineerRoutingSolution>) childMoves[1];

            DailyRoute srcRoute1 = ((RouteItem) firstMove.getEntity()).getDailyRoute();
            DailyRoute destRoute1 = ((RouteItem) firstMove.getToPlanningValue()).getDailyRoute();
            DailyRoute srcRoute2 = ((RouteItem) secondMove.getEntity()).getDailyRoute();
            DailyRoute destRoute2 = ((RouteItem) secondMove.getToPlanningValue()).getDailyRoute();

            return !srcRoute1.equals(srcRoute2) && !srcRoute1.equals(destRoute2) && !destRoute2.equals(destRoute1)
                    && !srcRoute2.equals(destRoute1);
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55340681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档