最小化车辆之间的最大距离

时间:2018-07-06 09:58:08

标签: python or-tools vehicle-routing

建议使用跨度成本系数来最小化车辆之间的最大距离

# Try to minimize the max distance among vehicles.
# /!\ It doesn't mean the standard deviation is minimized
distance_dimension.SetGlobalSpanCostCoefficient(100)

取自https://developers.google.com/optimization/routing/vrp#example

当成本函数不是基于距离(即燃料使用量)而是基于行驶时间,并且目标是使最后一辆车尽快返回仓库时,这特别有用。

问题1:我可以将目标函数定义为车辆中的最高成本(而不是总成本和全球跨度的总和)吗?

如果这不可能,我想知道是什么原因。我可以想象这是A)难以实施这样的约束,或者B)我缺少一些隐式的缺点,这些缺点导致解决方案不好(与使用span约束相比)。

我注意到,即使我将全局范围约束设置为1000(但这意味着什么),也不能保证所有车辆都在使用。当然可以通过使用更多车辆来改善该解决方案,对吗?

编辑: 这是一个最小的工作示例。 5辆车可提供20站服务。我将站点之间的统一行进时间定义为1h,因此最佳解决方案是每条路线包含4个站点,并且所有车辆在4h之后都返回仓库。 没有全局跨度约束,一辆车完成所有工作的总时间为20小时。在全局跨度约束下(系数= 1000),两辆车分别服务10站。

import ortools.constraint_solver.pywrapcp
import ortools.constraint_solver.routing_enums_pb2

stops = 20
vehicles = 5
depot = 0

routing = ortools.constraint_solver.pywrapcp.RoutingModel(stops, vehicles, depot)

def cost_function(x,y):
    return 1

routing.SetArcCostEvaluatorOfAllVehicles(cost_function)

evaluator = cost_function
slack_max = 24
capacity = 24
fix_start_cumul_to_zero = True
name = "time"
routing.AddDimension(evaluator, slack_max, capacity, fix_start_cumul_to_zero, name)

time_dimension = routing.GetDimensionOrDie("time")
time_dimension.SetGlobalSpanCostCoefficient(1000)

search_params = ortools.constraint_solver.pywrapcp.RoutingModel.DefaultSearchParameters()
assignment = routing.SolveWithParameters(search_params)

解决方案绘图仪的输出:

  

车辆路线0:0-> 11-> 12-> 13-> 14-> 15-> 16-> 17-> 18   -> 19-> 0   路线0的持续时间:10小时

     

车辆1:0-> 10-> 0的路线   路线1的持续时间:2小时

     

车辆2的路线:0-> 0   路线2的持续时间:1小时

     

车辆3:0-> 0的路线   路线3的持续时间:1小时

     

车辆4的路线:0-> 9-> 8-> 7-> 6-> 5-> 4-> 3-> 2-> 1->   0   路线4的持续时间:10小时

     

所有路线的总时长:24小时

0 个答案:

没有答案