我正在解决车辆路径问题的变化。该模型一直有效,直到我实施了一项更改,其中某些车辆和/或停靠点可能仍然未分配,因为施工过滤器由于时间窗口考虑而不允许移动(不允许延迟到达)。
问题的大小是2卡车/ 3站。 truck_1分配了2个停靠点(Stop_1和Stop_2),因此1辆卡车和1个停靠点仍未分配,因为truck_2将迟到Stop_3。
我有以下错误:
INFO o.o.c.i.c.DefaultConstructionHeuristicPhase - Construction Heuristic phase (0) ended: step total (2), time spent (141), best score (-164hard/19387soft).
java.lang.IllegalStateException: Local Search phase started with an uninitialized Solution. First initialize the Solution. For example, run a Construction Heuristic phase first.
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.phaseStarted(DefaultLocalSearchPhase.java:119)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(DefaultLocalSearchPhase.java:60)
at org.optaplanner.core.impl.solver.DefaultSolver.runPhases(DefaultSolver.java:213)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:176)
我尝试将计划变量设置为null(nullable = true)但似乎在链式变量的情况下不允许。 我正在使用Optaplanner 6.2。
请帮忙, 谢谢, PIYUSH
答案 0 :(得分:1)
您的构造过滤器可能过于严格,可能会阻止构造启发式创建初始化解决方案。您应该从构造过滤器中删除时间窗口约束,并将其作为硬分数约束添加到您的分数计算器中。
来自Optaplanner docs:
而不是实现硬约束,它有时可以内置。例如:如果永远不会将
Lecture A
分配给Room X
,但它在解决方案上使用ValueRangeProvider
,那么Solver
通常会尝试将其分配给Room X
(只是为了发现它打破了一个严格的约束)。在计划实体或筛选选项上使用ValueRangeProvider,以定义只应为课程A分配与Room
不同的X
。这可以在某些用例中获得良好的性能提升,这不仅仅是因为分数计算更快,而且主要是因为大多数优化算法将花费更少的时间来评估不可行的解决方案。然而,通常这不是一个好主意,因为存在长期损害交易短期利益的真实风险:
- 许多优化算法依赖于在更改计划实体时破坏硬约束的自由,以及摆脱局部最优。
- 两种实现方法都有局限性(功能兼容性,禁用自动性能优化,......),如文档中所述。