Java PDPTW在OptaPlanner中最便宜的插入?

Java PDPTW在OptaPlanner中最便宜的插入?,java,optaplanner,Java,Optaplanner,我已配置时间窗口(PDPTW)的收货和交货问题。我的配置使用了一个链式规划变量,与VRPTW示例非常类似。FIRST\u FIT\u discreating构造启发式算法和大多数局部搜索算法一样有效。但是,当我尝试最便宜的\u插入构造启发式时,我得到以下例外: 线程“main”java.lang.IllegalArgumentException中的异常:具有resolvedCacheType(阶段)和resolvedSelectionOrder(排序)的valueSelectorConfig(v

我已配置时间窗口(PDPTW)的收货和交货问题。我的配置使用了一个链式规划变量,与VRPTW示例非常类似。
FIRST\u FIT\u discreating
构造启发式算法和大多数局部搜索算法一样有效。但是,当我尝试
最便宜的\u插入
构造启发式时,我得到以下例外:

线程“main”java.lang.IllegalArgumentException中的异常:具有resolvedCacheType(阶段)和resolvedSelectionOrder(排序)的valueSelectorConfig(valueSelectorConfig(previousVisit))需要基于EntityIndependentValueSelector(已初始化(从SolutionPropertyValueSelector(previousVisit)))。检查@ValueRangeProvider注释

问题是我并不真正理解错误消息。我已经检查了我的
@ValueRangeProvider
注释,似乎一切都是正确的。似乎提出了一个类似的问题,这里建议使用一种变通方法来手动排序每个实体的值范围列表。对我来说,不清楚这个变通方法是否也适用于我的案例,或者如何应用它

我正在使用OptaPlanner 6.3.0.Final

要实例化planner,我将使用以下配置:

<?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>

可复制
MERSENNE_捻线机
com.github.rinde.logistics.pdptw.solver.optaplanner.pdp解决方案
com.github.rinde.logistics.pdptw.solver.optaplanner.ParcelVisit
com.github.rinde.logistics.pdptw.solver.optaplanner.Visit
硬的、软的、长的
com.github.rinde.logistics.pdptw.solver.optaplanner.ScoreCalculator
只剩下你了
180000
最便宜的插入
com.github.rinde.logistics.pdptw.solver.optaplanner.MoveItFactory
com.github.rinde.logistics.pdptw.solver.optaplanner.ChangeFilter
com.github.rinde.logistics.pdptw.solver.optaplanner.EntityFilter
此处定义了这些类:

我之所以有兴趣尝试
最便宜的插入
,是因为我发现我自己实现的最便宜的插入优于
第一次拟合
以及我觉得非常可疑的
模拟退火
。我想将我自己最便宜的插入与OptaPlanner的插入进行比较,以验证我对OptaPlanner的使用是否正确


更新:我刚刚用OptaPlanner 7.0.0-SNAPSHOT进行了尝试,问题似乎已经解决了(由于API更改,我不得不更改部分代码,并且不得不将我的项目更改为使用Java 8).

它固定在OptaPlanner 7.0.0.Beta1中。

它固定在OptaPlanner 7.0.Beta1中。

它固定在OptaPlanner 6.4.0.Final中(因此也固定在OptaPlanner 7.X中)


事实证明,我的配置中有一个bug,我使用的是6.3.0.Final,而不是6.4.0.Final。

它在OptaPlanner 6.4.0.Final中得到了修复(因此也在OptaPlanner 7.X中得到了修复)


原来我的配置中有一个bug,我使用的是6.3.0.Final,而不是6.4.0.Final。

看起来像个bug。请注意,最便宜的插入并没有被大量使用,因为它的伸缩性比First Fit变体差得多。我无法用最便宜的插入复制optaplanner示例VRPTW。检查您是否可以使用6.4.0.Final复制它,并将您的解算器配置添加到问题中。如果是有效配置,请重新打开PLANNER-597。谢谢!我会很快检查(可能是周一)我添加了配置文件。看起来像个bug。请注意,最便宜的插入并没有被大量使用,因为它的伸缩性比First Fit变体差得多。我无法用最便宜的插入复制optaplanner示例VRPTW。检查您是否可以使用6.4.0.Final复制它,并将您的解算器配置添加到问题中。如果是有效配置,请重新打开PLANNER-597。谢谢!我将很快(可能是星期一)检查它。我添加了配置文件。