jsprit VRP Связанные вакансии Жесткий Contraint

Можно ли иметь два или несколько отправлений по одному и тому же маршруту с помощью жесткого ограничения.

Если нет, знаете ли вы другие библиотеки Java, которые могут обрабатывать такие ограничения?

Благодарю вас!


person mohamed elmaallem    schedule 04.09.2014    source источник
comment
Не могли бы вы быть немного более точным? Что вы хотите смоделировать? Вы хотите убедиться, что отправления A и B находятся на одном и том же маршруте?   -  person Stefan Schröder    schedule 05.09.2014
comment
Да, мой вопрос заключается в том, чтобы убедиться, что несколько отправлений A, B,... идут по одному и тому же маршруту. Благодарю вас!   -  person mohamed elmaallem    schedule 05.09.2014


Ответы (1)


Самый простой способ убедиться, что грузы находятся на одном и том же маршруте, — это пометить эти грузы с помощью навыка

shipmentBuilder.addRequiredSkill("tag")

но тогда вам нужно пометить и конкретное транспортное средство:

vehicleBuilder.addSkill("tag")

И убедитесь, что алгоритм учитывает навыки/эти теги (см. https://github.com/jsprit/jsprit/blob/master/WHATS_NEW.md — нужно использовать 1.3.2-SNAPSHOT).

Если вы не хотите назначать конкретному транспортному средству тег, вам необходимо реализовать core.problem.constraint.HardRouteStateLevelConstraint, который в основном представляет собой этот метод.

public boolean fulfilled(JobInsertionContext insertionContext)

Убедитесь, что insertionContext.getJob() [которое является вставляемым заданием] может быть вставлено в insertionContext.getRoute(). На этом этапе вам нужно знать две вещи:

  • связанные поставки insertionContext.getJob(), т. е. поставки, которые должны проходить по тому же маршруту, что и insertionContext.getJob()
  • было ли одно из этих связанных заданий уже назначено маршруту, и если да, то совпадает ли этот маршрут с insertionContext.getRoute()

Для последней информации вам необходимо определить состояния, которые предоставляют вам назначение рабочего маршрута. Я бы определил состояние проблемы и соответствующий ему модуль обновления следующим образом:

static class UpdateJobRouteAssignment implements StateUpdater,JobInsertedListener,InsertionStartsListener {

        StateManager stateManager;

        UpdateJobRouteAssignment(StateManager stateManager) {
            this.stateManager = stateManager;
        }

        @Override
        public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
            stateManager.putProblemState(stateManager.createStateId(job2insert.getId()), VehicleRoute.class, inRoute);
        }

        @Override
        public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
            for(VehicleRoute r : vehicleRoutes){
                for(Job j : r.getTourActivities().getJobs()){
                    informJobInserted(j,r,0.,0.);
                }
            }
        }
    }

Добавьте средство обновления состояния и ограничение в свой State/ConstraintManager, и все готово.

person Stefan Schröder    schedule 05.09.2014
comment
Оптимизация маршрута: Задача состоит в том, чтобы смоделировать несколько курьеров, каждый курьер состоит из нескольких задач задача 1, задача 2 .., которые должны быть на одном маршруте и с соблюдением порядка, 1 2 .., речь идет о работа коня. для каждого курьера первая задача имеет временное окно. для курьера всего с двумя задачами я могу смоделировать по Отгрузкам, забрать в качестве первой задачи и доставить во вторую, но для более чем двух ??? Есть идеи?? Спасибо. - person mohamed elmaallem; 06.09.2014
comment
Я уверен, что вы получите помощь здесь: groups.google.com/group/jsprit-mailing- список. Просто разместите его там снова, и вы можете найти пользователей, которые уже решили подобную проблему. - person Stefan Schröder; 08.09.2014