Java 时间窗口的Optaplanner约束

Java 时间窗口的Optaplanner约束,java,optaplanner,Java,Optaplanner,我正试图用OptaPlanner解决VRP问题。我有多个客户有不同的时间窗口。这是我的约束提供者 protected Constraint arrivalAfterDueTime(ConstraintFactory factory) { return factory.from(TimeWindowedCustomer.class) .filter(customer -> customer.getArrivalTime() >= cust

我正试图用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());
    }
受保护的约束到达时间(ConstraintFactory工厂){
返回factory.from(TimeWindowedCustomer.class)
.filter(customer->customer.getArrivalTime()>=customer.getDueTime())
.惩罚长时间(“到达时间之后”,
硬软核,
customer->customer.getArrivalTime()-customer.getDueTime();
}
受保护的约束到达时间(ConstraintFactory工厂){
返回factory.from(TimeWindowedCustomer.class)
.filter(customer->customer.getArrivalTime()>customer.getReadyTime()
&&customer.getArrivalTime()customer.getReadyTime()-customer.getArrivalTime();
}

但在解决方案中,我得到的到达时间小于准备时间。我怎样才能解决这个问题?提前谢谢。

如果到达时间太早,通常有三种方法:

  • A) 等待时间窗口打开,损失时间,但没有额外的处罚。因此,当车辆在9:30到达时,服务时间为0:10,准备时间为10:00,车辆将在10:10(而不是9:40!)发车。如果您有减少车辆总活动时间的一般限制(或每辆车的最大活动时间与每天任务过多的组合),则会自动避免这种情况
  • B) 与A)相同,但有额外的软处罚。如果您没有减少车辆总活动时间的全局约束,这可能非常有用
  • C) 与A)相同,有额外的重罚。这是危险的,因为给定两个任务,一个时间窗口为9:00到10:00,另一个时间窗口为11:00到12:00,中间有10分钟的车程,并且没有其他任务,您不允许一辆车同时执行这两个任务
在任何情况下,使用
ConstraintVerifier
对约束进行单元测试