OptaPlanner 中最便宜的 PDPTW 插入?
Cheapest insertion in OptaPlanner for a PDPTW?
我已配置 OptaPlanner 时间 windows (PDPTW) 的取货和送货问题。我的配置使用与 VRPTW 示例非常相似的链式规划变量。 FIRST_FIT_DECREASING
构造启发式以及大多数本地搜索算法都有效。但是,当我尝试 CHEAPEST_INSERTION
构造启发式时,出现以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: The valueSelectorConfig (ValueSelectorConfig(previousVisit)) with resolvedCacheType (PHASE) and resolvedSelectionOrder (SORTED) needs to be based on a EntityIndependentValueSelector (Initialized(FromSolutionPropertyValueSelector(previousVisit))). Check your @ValueRangeProvider annotations.
问题是我不太理解错误信息。我检查了我的 @ValueRangeProvider
注释,一切似乎都是正确的。 This question 似乎提出了类似的问题,在这里,建议解决方法是手动对每个实体的值范围列表进行排序。我不清楚此解决方法是否也适用于我的情况或如何应用它。
我正在使用 OptaPlanner 6.3。0.Final。
为了实例化规划器,我使用了以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<environmentMode>REPRODUCIBLE</environmentMode>
<randomType>MERSENNE_TWISTER</randomType>
<solutionClass>com.github.rinde.logistics.pdptw.solver.optaplanner.PDPSolution</solutionClass>
<entityClass>com.github.rinde.logistics.pdptw.solver.optaplanner.ParcelVisit</entityClass>
<entityClass>com.github.rinde.logistics.pdptw.solver.optaplanner.Visit</entityClass>
<scoreDirectorFactory>
<scoreDefinitionType>HARD_SOFT_LONG</scoreDefinitionType>
<incrementalScoreCalculatorClass>com.github.rinde.logistics.pdptw.solver.optaplanner.ScoreCalculator</incrementalScoreCalculatorClass>
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
</scoreDirectorFactory>
<termination>
<unimprovedMillisecondsSpentLimit>180000</unimprovedMillisecondsSpentLimit>
</termination>
<constructionHeuristic>
<constructionHeuristicType>CHEAPEST_INSERTION</constructionHeuristicType>
</constructionHeuristic>
<localSearch>
<unionMoveSelector>
<moveIteratorFactory>
<moveIteratorFactoryClass>com.github.rinde.logistics.pdptw.solver.optaplanner.MoveItFactory</moveIteratorFactoryClass>
</moveIteratorFactory>
<changeMoveSelector>
<filterClass>com.github.rinde.logistics.pdptw.solver.optaplanner.ChangeFilter</filterClass>
</changeMoveSelector>
<changeMoveSelector>
<entitySelector>
<filterClass>com.github.rinde.logistics.pdptw.solver.optaplanner.EntityFilter</filterClass>
</entitySelector>
</changeMoveSelector>
</unionMoveSelector>
</localSearch>
</solver>
我有兴趣尝试 CHEAPEST_INSERTION
的原因是我发现我自己实现的 cheapest 插入优于 FIRST_FIT_DECREASING
以及我觉得非常可疑的 Simulated Annealing
。我想将我自己的最便宜插入与 OptaPlanner 的插入进行比较,以验证我对 OptaPlanner 的使用是否正确。
更新: 我刚刚用 OptaPlanner 7.0.0-SNAPSHOT 试了一下,问题似乎已经解决了(由于 [=40 我不得不更改部分代码=] 更改,并且不得不更改我的项目以使用 Java 8).
在 7.0.0.Beta1 的 OptaPlanner 中修复了。
它已在 OptaPlanner 6.4 中修复。0.Final(因此也在 OptaPlanner 7.X 中)。
原来是我的配置有bug,我用的是6.3.0.Final 与6.4.0.Final.
相反
我已配置 OptaPlanner 时间 windows (PDPTW) 的取货和送货问题。我的配置使用与 VRPTW 示例非常相似的链式规划变量。 FIRST_FIT_DECREASING
构造启发式以及大多数本地搜索算法都有效。但是,当我尝试 CHEAPEST_INSERTION
构造启发式时,出现以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: The valueSelectorConfig (ValueSelectorConfig(previousVisit)) with resolvedCacheType (PHASE) and resolvedSelectionOrder (SORTED) needs to be based on a EntityIndependentValueSelector (Initialized(FromSolutionPropertyValueSelector(previousVisit))). Check your @ValueRangeProvider annotations.
问题是我不太理解错误信息。我检查了我的 @ValueRangeProvider
注释,一切似乎都是正确的。 This question 似乎提出了类似的问题,在这里,建议解决方法是手动对每个实体的值范围列表进行排序。我不清楚此解决方法是否也适用于我的情况或如何应用它。
我正在使用 OptaPlanner 6.3。0.Final。
为了实例化规划器,我使用了以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<environmentMode>REPRODUCIBLE</environmentMode>
<randomType>MERSENNE_TWISTER</randomType>
<solutionClass>com.github.rinde.logistics.pdptw.solver.optaplanner.PDPSolution</solutionClass>
<entityClass>com.github.rinde.logistics.pdptw.solver.optaplanner.ParcelVisit</entityClass>
<entityClass>com.github.rinde.logistics.pdptw.solver.optaplanner.Visit</entityClass>
<scoreDirectorFactory>
<scoreDefinitionType>HARD_SOFT_LONG</scoreDefinitionType>
<incrementalScoreCalculatorClass>com.github.rinde.logistics.pdptw.solver.optaplanner.ScoreCalculator</incrementalScoreCalculatorClass>
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
</scoreDirectorFactory>
<termination>
<unimprovedMillisecondsSpentLimit>180000</unimprovedMillisecondsSpentLimit>
</termination>
<constructionHeuristic>
<constructionHeuristicType>CHEAPEST_INSERTION</constructionHeuristicType>
</constructionHeuristic>
<localSearch>
<unionMoveSelector>
<moveIteratorFactory>
<moveIteratorFactoryClass>com.github.rinde.logistics.pdptw.solver.optaplanner.MoveItFactory</moveIteratorFactoryClass>
</moveIteratorFactory>
<changeMoveSelector>
<filterClass>com.github.rinde.logistics.pdptw.solver.optaplanner.ChangeFilter</filterClass>
</changeMoveSelector>
<changeMoveSelector>
<entitySelector>
<filterClass>com.github.rinde.logistics.pdptw.solver.optaplanner.EntityFilter</filterClass>
</entitySelector>
</changeMoveSelector>
</unionMoveSelector>
</localSearch>
</solver>
我有兴趣尝试 CHEAPEST_INSERTION
的原因是我发现我自己实现的 cheapest 插入优于 FIRST_FIT_DECREASING
以及我觉得非常可疑的 Simulated Annealing
。我想将我自己的最便宜插入与 OptaPlanner 的插入进行比较,以验证我对 OptaPlanner 的使用是否正确。
更新: 我刚刚用 OptaPlanner 7.0.0-SNAPSHOT 试了一下,问题似乎已经解决了(由于 [=40 我不得不更改部分代码=] 更改,并且不得不更改我的项目以使用 Java 8).
在 7.0.0.Beta1 的 OptaPlanner 中修复了。
它已在 OptaPlanner 6.4 中修复。0.Final(因此也在 OptaPlanner 7.X 中)。
原来是我的配置有bug,我用的是6.3.0.Final 与6.4.0.Final.
相反