时间窗的Opaplanner约束

问题描述 投票:0回答:1

我正在尝试使用OptaPlanner解决VRP。我有多个具有不同时间窗口的客户。这是我的约束提供程序

protected Constraint arrivalAfterDueTime(ConstraintFactory factory) {
        return factory.from(TimeWindowedCustomer.class)
                .filter(customer -> customer.getArrivalTime() >= customer.getDueTime())
                .penalizeLong("arrivalAfterDueTime",
                        HardSoftLongScore.ONE_HARD,
                        customer -> customer.getArrivalTime() - customer.getDueTime());
    }

protected Constraint arrivalBeforeReadyTime(ConstraintFactory factory) {
        return factory.from(TimeWindowedCustomer.class)
                .filter(customer -> customer.getArrivalTime() > customer.getReadyTime()
                && customer.getArrivalTime() < customer.getDueTime() )
                .penalizeLong("arrivalBeforeReadyTime",
                        HardSoftLongScore.ONE_HARD,
                        customer -> customer.getReadyTime() - customer.getArrivalTime());
    }

但是在解决方案中,我的到达时间是

java optaplanner
1个回答
0
投票

过早到达通常有三种方法:

  • A)等到时间窗口打开,就失去了时间,但没有额外的损失。因此,当服务时间为0:10且准备时间为10:00到达9:30时,车辆将在10:10出发(而不是9:40!)。如果您有减少车辆总活动时间的一般约束(或每天最多任务的每辆车的最大活动时间的组合),将自动避免这种情况。
  • B)与A)相同,但有额外的软罚。如果您没有全局约束来减少车辆的总活动时间,则此功能很有用。
  • C)与A)相同,但要加重罚金。这很危险,因为给定2个任务,一个任务的时间窗口是从9:00到10:00,一个任务是从11:00到12:00,之间有10分钟的车程,并且没有其他任务,因此您不允许一辆车可以完成这两项任务。

无论如何,请使用ConstraintVerifier对约束进行单元测试!

© www.soinside.com 2019 - 2024. All rights reserved.