【问题标题】:Optaplanner constraints for time windows时间窗的 Optaplanner 约束
【发布时间】:2020-05-04 15:10:16
【问题描述】:

我正在尝试使用 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】:

    过早到达一般有三种方法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多