【问题标题】:OptaPlanner 6.2 - Immovable planning entities for chained entities (VRP)OptaPlanner 6.2 - 链式实体 (VRP) 的不可移动规划实体
【发布时间】:2015-05-08 09:38:35
【问题描述】:

对于时间窗 VRP 的解决方案,我编辑了已解决的 XML 文件并为所有客户设置了<locked>true</locked>

我添加了一个 SelctionFiler 类并按照建议对其进行了配置。 在解决的 xml 数据文件的末尾,我添加了一些新的未分配客户。

我预计只有新的未分配客户会被优化并插入到现有链的末尾 - 但事实并非如此 - 链被破坏了。

问题:在 6.2 中,处理不可移动的客户预约到底需要什么?

我认为 jira 问题 https://issues.jboss.org/browse/PLANNER-239 只需要在 6.0.1 中解决。

Geoffrey 写道:在 6.2 中,已经对此 IIRC 进行了许多改进,但并非在所有情况下都得到了解决。 时间窗 VRP 有哪些改进?

这个问题属于我的问题:Can optaplanner solve partly pre-assigned planning entities using Drools rules?

最好的问候, 米连科

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

    这是我们在 optaplanner 6.2.0 中使用的配置。为了将客户锁定在适当的位置,除了 CustomerEntitySelectionFilter 之外,还必须为 changeMoveSelector、swapMoveSelector 和 tailChainSwapMoveSelector 实施过滤器。

    <localSearch>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector id="entitySelector1"/>
                <filterClass>...THIS....CustomerFilterChangeMove</filterClass>
                <valueSelector>
                    <nearbySelection>
                        <originEntitySelector mimicSelectorRef="entitySelector1"/>
                        <nearbyDistanceMeterClass>....CustomerNearbyDistanceMeter</nearbyDistanceMeterClass>
                        <parabolicDistributionSizeMaximum>80</parabolicDistributionSizeMaximum>
                    </nearbySelection>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <filterClass>...THIS....CustomerFilterSwapMove</filterClass>
            </swapMoveSelector>
            <tailChainSwapMoveSelector>
                <entitySelector id="entitySelector3"/>
                <filterClass>...THIS...CustomerFilterTailChainSwapMove</filterClass>
                <valueSelector>
                    <nearbySelection>
                        <originEntitySelector mimicSelectorRef="entitySelector3"/>
                        <nearbyDistanceMeterClass>....CustomerNearbyDistanceMeter</nearbyDistanceMeterClass>
                        <parabolicDistributionSizeMaximum>80</parabolicDistributionSizeMaximum>
                    </nearbySelection>
                </valueSelector>
                <!--Disabled, doesn't work with tailChain -->
                <!--<selectReversingMoveToo>false</selectReversingMoveToo>-->
            </tailChainSwapMoveSelector>
    
        </unionMoveSelector>
        <acceptor>
            <lateAcceptanceSize>200</lateAcceptanceSize>
        </acceptor>
        <forager>
            <acceptedCountLimit>1</acceptedCountLimit>
        </forager>
    </localSearch>
    

    在 EntitySelectionFilter 和 CustomerFilterTailChainSwapMove(两个链)上检查客户链是否锁定客户。

    类是:

    namespace ...THIS...;
    
    public class CustomerFilterChangeMove implements SelectionFilter<ChangeMove> {
    
        @Override
        public boolean accept(ScoreDirector scoreDirector, ChangeMove changeMove) {
            Customer customer = (Customer) changeMove.getEntity();
            if(customer!=null && customer.isLocked())
                return false;
            //everything is fine
            return true;
        }
    }
    
    public class CustomerFilterSwapMove implements SelectionFilter<SwapMove>
    {
        @Override
        public boolean accept(ScoreDirector scoreDirector, SwapMove move)
        {
            Customer leftCustomer = (Customer) move.getLeftEntity();
            Customer rightCustomer = (Customer) move.getRightEntity();
            if(leftCustomer!=null && leftCustomer.isLocked())
                return false;
            if(rightCustomer!=null && rightCustomer.isLocked())
                return false;
            return true;
        }
    }
    
    public class CustomerFilterTailChainSwapMove implements SelectionFilter<TailChainSwapMove>
    {
        /**
         * Chain starting at left entity will be moved to the right. If there's an entity on the right side, it's chain will be moved to the left
         */
        @Override
        public boolean accept(ScoreDirector scoreDirector, TailChainSwapMove move)
        {
            Customer shadow=null;
            Customer leftCustomer = (Customer) move.getLeftEntity();
            Customer rightCustomer = null;
            Vehicle leftVehicle = leftCustomer.getVehicle();
            Vehicle rightVehicle=null;
            if(move.getRightValue() instanceof Customer)
            {
                rightCustomer = (Customer) move.getRightValue();
                rightVehicle = rightCustomer.getVehicle();
            }
            else if(move.getRightValue() instanceof Vehicle)
            {
                rightVehicle = (Vehicle) move.getRightValue();
                rightCustomer = rightVehicle.getNextCustomer();
            }
    
            shadow=rightCustomer;
            while(shadow!=null)
            {
                if(shadow.isLocked())
                    return false;
                shadow=shadow.getNextCustomer();
            }
    
            shadow=leftCustomer;
            while(shadow!=null)
            {
                if(shadow.isLocked())
                    return false;
                shadow=shadow.getNextCustomer();
            }
            return true;
        }
    }
    
    public class CustomerEntitySelectionFilter implements SelectionFilter<Customer> {
        @Override
        public boolean accept(ScoreDirector scoreDirector, Customer customer) {
            Customer shadow = customer;
            while(shadow!=null)
            {
                if (shadow.isLocked())
                    return false;
                shadow=shadow.getNextCustomer();
            }
            return true;
        }
    }
    

    【讨论】:

    • PLANNER-239 的好解决方法 :) 遇到这个问题的人太多,我会尝试将其包含在 6.3 中。
    • 亲爱的 grundolf,这是什么意思:...这个....CustomerFilterChangeMove ....CustomerNearbyDistanceMeter ...这个....CustomerFilterSwapMove ...这个...CustomerFilterTailChainSwapMove 怎么做类是什么样子的?
    • 我已经添加了过滤器类。
    • 亲爱的 grundolf,这对我很有帮助 - 我只想问一件事:“CustomerNearbyDistanceMeter.java”类的外观如何?
    • 客户锁定对其没有影响,它可以与手册中使用的相同(docs.jboss.org/optaplanner/release/6.2.0.Final/optaplanner-docs/…)或 VRP 示例中使用的相同 - 检查\examples\sources\src\main\java\org\optaplanner\examples\vehiclerouting\domain\solver\nearby\CustomerNearbyDistanceMeter.java
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多