OptaPlanner中最便宜的PDPTW插入?

时间:2016-06-09 13:35:27

标签: java optaplanner

我已为OptaPlanner配置时间窗口(PDPTW)的接送问题。我的配置使用链式计划变量,与VRPTW示例非常相似。 FIRST_FIT_DECREASING构造启发式工作,以及大多数本地搜索算法。但是,当我尝试CHEAPEST_INSERTION构造启发式时,我得到以下异常:

  

线程“main”中的异常java.lang.IllegalArgumentException:具有resolvedCacheType(PHASE)和resolvedSelectionOrder(SORTED)的valueSelectorConfig(ValueSelectorConfig(previousVisit))需要基于EntityIndependentValueSelector(Initialized(FromSolutionPropertyValueSelector(previousVisit)))。检查@ValueRangeProvider注释。

问题是我真的不明白错误信息。我检查了我的@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>

这里定义了类:https://github.com/rinde/RinLog/tree/develop/src/main/java/com/github/rinde/logistics/pdptw/solver/optaplanner

我有兴趣尝试CHEAPEST_INSERTION的原因是我发现我自己实施的最便宜的广告优先于FIRST_FIT_DECREASING以及Simulated Annealing,我觉得非常可疑。我想将自己最便宜的插入与OptaPlanner的插入进行比较,以验证我对OptaPlanner的使用是否正确。

更新:我刚用OptaPlanner 7.0.0-SNAPSHOT尝试过,问题似乎已修复(由于API更改,我不得不更改代码的某些部分,并且不得不更改我的项目使用Java 8)。

2 个答案:

答案 0 :(得分:0)

它已在7.0.0.Beta1中的OptaPlanner中修复。

答案 1 :(得分:0)

它已在OptaPlanner 6.4.0.Final中修复(因此也在OptaPlanner 7.X中)。

事实证明我的配置中存在一个错误,我使用的是6.3.0.Final与6.4.0.Final相反。