建议使用跨度成本系数来最小化车辆之间的最大距离
# 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小时