使用 SetGlobalSpanCostCoefficient 会导致 OR-tools VRP 中的路由更差

问题描述

我正在使用 OR-tools VRP 来创建送货路线。我有距离作为一个维度,一个限制每条路线交付点数量的维度,我的代码https://developers.google.com/optimization/routing/vrp

中共享的指南非常相似

我遇到的问题是,当使用如下 SetGlobalSpanCostCoefficient 时,生成的路线从仓库到第一个交付点以及从最后一个交付点到仓库的距离很短,但相反,交付点之间的距离很长.相反,当不使用此 SetGlobalSpanCostCoefficient 时,路线在交付点之间的距离非常短,但往返于仓库的距离会更高。

distance_dimension = routing.GetDimensionorDie(dimension_name)
distance_dimension.SetGlobalSpanCostCoefficient(100)

此外,当不使用跨度成本时,所有路由的距离总和较低。根据指标以及路线在地图中的外观,我认为不使用跨度成本会更好。请参阅下图中的路线,首先不使用跨度成本,然后使用它。

Not using span cost

Using span cost

我担心的是,如果我不使用跨度成本,我不知道求解器是在优化路线还是只是创建了一个贪婪的解决方案(我使用 PATH_CHEApest_ARC 作为第一个解决方案策略)。有人可以解释为什么我在这两种情况下都得到这些路线,并告诉我在不使用跨度时我得到的路线是否是最佳的?

解决方法

在这两种情况下,您总是将弧成本添加到目标中,全局跨度成本系数添加额外成本coeff * (max_end - min_start)
注意:当使用 100 的系数时,它只会使这个成本成为主导因素......

首先,求解器尝试使用第一个策略启发式方法创建初始解决方案。

那么如果启用本地搜索,解决方案可能会大大改进 -> 你启用本地搜索吗?

    search_parameters.local_search_metaheuristic = (
        routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH)
    search_parameters.log_search = True
    search_parameters.time_limit.FromSeconds(20)