【问题标题】:optaplanner: modifying vehicle routing to let customers be not servedoptaplanner:修改车辆路线以不为客户提供服务
【发布时间】:2014-07-08 16:28:29
【问题描述】:

在车辆路线问题中,我想消除必须为每个客户服务的约束,但为服务的人增加奖励。

我想为每个客户 c_i 添加一个虚拟车辆 v_i,这样 v_i 可以只为客户 c_i 服务,而当这种情况发生时,这意味着客户没有得到服务。因此,当有 N 个客户时,就有 M 个真实车辆加上 N 个虚拟车辆。

我的疑问是:如何设置 Customer 类的 valueRangeProviderRefs 以避免客户 c_j 由车辆 v_i 提供服务,也就是说,如果引用静态列表,我可以让“vehicleRange”依赖于特定客户而不是车辆?

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

    这称为过度约束的计划。从技术上讲,@PlanningVariable(nullable=true) 应该允许这样做,但是 OptaPlanner 6.0(目前也是 6.1)还不支持 nullable 用于 chained 变量...

    解决方法:创建 1 个虚拟 Vehicle,它在所有评分规则中都被忽略,并添加一个评分规则来奖励由非虚拟车辆服务的任何客户。

    【讨论】:

    • 感谢您的回答。我已经尝试过使用 nullable=true ,实际上这将是最好的解决方案......(让 previousStand==null 为未服务的客户)。我还想到了创建虚拟车辆 v_d 的解决方法,但我认为,即使我可以编写不考虑 v_d 服务的客户的规则,该算法无论如何都会尝试优化 v_d 下的客户链,这是浪费计算资源。我错了吗?
    • 在您的 pdf 指南(第 70 页)中,我找到了这个示例 @ValueRangeProvider(id = "possibleRoomRange") public List getPossibleRoomList() { return getCourse().getTeacher().getPossibleRoomList( );似乎planningVariable 可以根据它的planningEntity 限制在一个范围内,对吧?如果是这样,这将防止优化器通过优化未服务的客户来浪费时间。
    • 优化 v_d 下的链确实有点浪费计算资源,但我现在仍然推荐这种方法。为避免这种浪费,您始终可以在移动选择器上添加一个过滤器以忽略此类移动...随意创建一个链式和 nullable=true 也应该一起工作的 jira(尽管这有一些含义)。
    • 对于链变量的实体上的 ValueRangeProvider:这还不能很好地工作 :( 避免它。链校正是那里的问题:给定 A<-B<-C 链,移动 @987654326 @ 到其他地方意味着创建 A<-C 当前不检查 A 是否在 C 的值范围内...也可以在我们的问题跟踪器中提出 jira 问题(可能有一个已经)。
    • 另外,一般来说,“实体上的ValueRangeProvider”不应该被用来强制这样的事情。我什至相信,如果它适用于链式变量,它仍然无法解决您的问题。您似乎正在寻找“移动过滤”(请参阅​​文档)。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多