具有多个时间窗口的 Jsprit VRP

Posted

技术标签:

【中文标题】具有多个时间窗口的 Jsprit VRP【英文标题】:Jsprit VRP with multiple Time Windows 【发布时间】:2014-08-28 11:20:00 【问题描述】:

我尝试使用 jsprit 解决具有多个 TimeWindows 的 VRP。因此,我创建了一个新的约束类,其中包含一个将“TimeWindowsNotAvailable”类与服务相关联的映射。

“TimeWindowsNotAvailable”类包含无法完成服务的TimeWindows 列表(例如,客户不在家等)。 主要问题是,newAct.getArrTime() 始终为 0.0,尽管您可以在 VRP 的解决方案中看到arrTime 不是 0.0。

有没有人知道我该如何解决这个问题,或者多个TimeWindows 更难实现?

public class TimeConstraint implements HardActivityStateLevelConstraint 

    private Map<Service, TimeWindowsNotAvailable> notAvailableMap;

    private RouteAndActivityStateGetter states;

    private VehicleRoutingTransportCosts routingCosts;

    public TimeConstraint() 
        super();
    

    public boolean checkDepTime(Service service, Double depTime)
        TimeWindowsNotAvailable timeWindowsNotAvailable = notAvailableMap.get(service);
        if(timeWindowsNotAvailable == null) return true;
        System.out.println(depTime);
        return timeWindowsNotAvailable.isAvailable(depTime);
    

    public void setNotAvailableMap(Map<Service, TimeWindowsNotAvailable> notAvailableMap)
        this.notAvailableMap = notAvailableMap;
    

    @Override
    public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) 
        Service currentService = (Service)iFacts.getJob();
        if(checkDepTime(currentService, **newAct.getArrTime()**)) return ConstraintsStatus.FULFILLED;
        return ConstraintsStatus.NOT_FULFILLED;
    

【问题讨论】:

【参考方案1】:

您还不能开箱即用地模拟多个时间窗口,但它将被实施。目前,您可以实现自己的。例如,假设您有以下两个服务时间窗口:(e1,l1), (e2,l2) 其中 e 表示最早的操作开始,l 表示最晚。如果 l1 TimeWindowConstraint 和which is the practical time window state updater 是哪个。您可能只需要对这些类进行少量修改,因此只需复制它们并添加多个时间窗口,然后将这两个新类添加到您的 State- 和 ConstraintManager(不要忘记停用默认时间窗口约束/stateUpdater)。

newAct 没有任何 arrTime,因为它还没有插入到路由中,最佳插入位置仍有待确定(通过检查约束和计算边际插入成本)。但是你可以很容易地计算如下:

double newActArrTime = prevActDepTime + routingCosts.getTransportTime(prevAct.getLocationId(), newAct.getLocationId(), prevActDepTime,iFacts.getNewDriver(),iFacts.getNewVehicle);

【讨论】:

非常感谢!考试后我会试试的;)

以上是关于具有多个时间窗口的 Jsprit VRP的主要内容,如果未能解决你的问题,请参考以下文章

jsprit如何将取件添加到车辆

JSprit算法软硬时间窗口

如何在时间窗口中使用 jsprit?

jsprit TSP 和 VRP 求解器是不是允许提供点之间的时间和距离约束?

如何在 JSprit 中使用具有自身成本矩阵的车辆类型

使用位置之间的时间而不是距离来优化 VRP