Jsprit VRP с несколькими временными окнами

Я пытаюсь использовать jsprit для решения VRP с несколькими TimeWindows. Поэтому я создал новый класс ограничения, который содержит карту, связывающую класс 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;
    }
}

person Eric Dörheit    schedule 28.08.2014    source источник


Ответы (1)


Вы еще не можете моделировать несколько временных окон «из коробки», но это будет реализовано. На данный момент вы можете реализовать свои собственные. Предположим, у вас есть, например, следующие два временных окна для службы: (e1,l1), (e2,l2), где e означает самое раннее начало операции, а l самое позднее. Если l1 ‹ e2, это сравнительно «легко» реализовать. Просто посмотрите, как я реализовал одиночные жесткие временные окна. Посмотрите, что является TimeWindowConstraint и который является практическим средством обновления состояния окна времени. Вероятно, вам нужны лишь незначительные модификации этих классов, поэтому просто скопируйте их и добавьте несколько временных окон, а также добавьте эти два новых класса в свой State- и ConstraintManager (не забудьте деактивировать ограничения временного окна по умолчанию/stateUpdater).

У newAct нет arrTime, так как он еще не вставлен в маршрут, а наилучшая позиция вставки еще должна быть определена (путем проверки ограничений и расчета предельных затрат на вставку). Но вы можете легко рассчитать его следующим образом:

double newActArrTime = prevActDepTime + routingCosts.getTransportTime(prevAct.getLocationId(), newAct.getLocationId(), prevActDepTime,iFacts.getNewDriver(),iFacts.getNewVehicle);
person Stefan Schröder    schedule 05.09.2014
comment
Большое спасибо! Попробую после экзаменов ;) - person Eric Dörheit; 23.09.2014