【发布时间】:2016-12-12 19:27:23
【问题描述】:
我有一个 VRP 路由问题的变体,我想在其中使用 Optaplanners(v6.4) ValueRangeProvider 功能。但是,我对它在某些情况下的工作方式有点困惑。我的理解是,如果我选择一组项目作为客户对象的值范围,则该客户实例的 previousStandStill 可能只是该范围内的 StandStill。
就我而言,我有一些可能已经被分配的客户。我想限制搜索空间,以便分配的旅行不会浪费时间与其他车辆匹配。我期待大量的客户,所以我希望尽可能提高性能。
我将previousStandStill Range定义为Follows
@PlanningVariable(
valueRangeProviderRefs = {"possibleVehicles", "possibleCustomersInSameVehicle"},
graphType = PlanningVariableGraphType.CHAINED)
public Standstill getPreviousStandstill() {
return previousStandstill;
}
- 分配的客户 “可能的车辆”只会归还车辆 他们被分配给可能的客户将是所有的列表 分配给同一车辆的客户 + 所有未分配的客户
- 未分配的客户将拥有其范围内的每一辆车和每一位客户。
这似乎工作得很好,但是发生了几个可疑的案例,这给了我一些问题。
我修改了一个指定客户的数据集,当车辆容量仅为 7 时,它的负载非常大 (100)。我的最终解决方案产生了一个解决方案,其中指定客户被分配到车辆不在其 ValueRange 中,它是 Vehicles NextCustomer。这显然打破了我为该指定客户设置的价值范围,所以我不确定这是如何发生的。我唯一的猜测是,未分配的客户被分配为车辆中的 FirstCustomer,然后是分配的客户(未分配在值范围内)。未分配的客户后来被转移到另一辆车上,因此被分配的客户直接离开了车辆。我的问题是 ValueRange 会允许这种情况发生吗 valueRange 曾经被忽略过吗?
我通过使用 VRP 问题的默认值范围运行了相同的问题,但添加了一条规则以在分配的客户使用错误车辆时进行处罚。两种解决方案都得到了相同的答案,但是即使搜索空间应该更大,这个解决方案似乎也能更快地工作。不确定我的代码中是否存在错误,或者是否能够更快地修剪小测试用例。
最后,从技术上讲,当前值范围允许在未分配行程后分配已分配的客户,即使未分配的客户在另一辆车上。是否有任何方法可以对问题进行建模,以使 ValueRange 在车辆上。所以我们说这辆车可能只包含来自 The Assigned List 的 NextCustomers 列表 + UnassignedList 中的任何人?
是否在每次移动之前检查值范围?解决的时候可以更新吗?
【问题讨论】:
标签: java optaplanner