如何分配累积变量的最小值和最大值?

时间:2018-07-17 00:01:47

标签: or-tools

我创建了一个路由问题,并为其添加了一些尺寸。找到一个解决方案分配,我想知道每个索引的累计值。我注意到分配的CumulVar不仅具有Value方法,还具有MinMax方法。显然,累积变量的实现方式是它们可以代表间隔。我可以看到如何设置

  • slack_max>0
  • fix_start_cumul_to_zero=False

为累积变量引入了歧义,因为它们是如何开始以及每个停靠点增加多少余量的选择。但是

问题:如何计算每个索引处的MinMax

1 个答案:

答案 0 :(得分:0)

您可以从 solution.Min(dimension.Cumulvar(index))

获取给定节点索引的最小和最大范围

请注意,除非您知道我不知道的某些内容,否则 slack_max=0 时您会得到完全相同的 Min 和 Max ;) 假设您使用的是输出解决方案对象 solution 和时间维度 time_dimension,这会将 em 存储为具有 min-max 元组的 dict,您可能希望根据需要调整输出格式:

time_dict = {}
for vehicle_id in range(num_vehicles):
  vehicle_time_dict={}
  index = routing.Start(vehicle_id)
  start_time = solution.Min(time_dimension.CumulVar(index))
  vehicle_time_dict[index]=(index_min,index_max)
  while not routing.isEnd(index):
    previous_index = index
    index = solution.Value(routing.NextVar(index))
    index_min = solution.Min(time_dimension.CumulVar(index))
    index_max = solution.Max(time_dimension.CumulVar(index))
    vehicle_time_dict[index]=(index_min,index_max)
  time_dict[vehicle_id]=vehicle_time_dict

routing.IsEnd(index) 返回 True 如果它是该车辆路线的最后一个索引(或最后一个索引之后的任何位置,因此如果它有 10 个节点长:

  • routing.IsEnd(8) 将返回 False
  • routing.IsEnd(9) 将返回 True
  • routing.IsEnd(10) 也会返回 True 等)