【问题标题】:Limit number of districts touched by each vehicle in ortools VRP在 ortools VRP 中限制每辆车接触的区域数
【发布时间】:2019-08-13 06:39:29
【问题描述】:

由于我的英语不好,我需要保持简短:)

假设我必须在一个有多个地区的城市上解决一个简单的 VRP,并且我想限制每条车辆/路线触及的最大地区数。

Orders=[(x1,y1),(x2,y1),(x3,y3)...(xN,yN)] # 每个订单都由其坐标标识

Districts=[1,2,3] # 为简单起见只有 3 个区

Order_district=[2,3,2,...1] # 订单属于三个区之一

我的第一个想法是为每个“触及区域”添加一个惩罚,但我很难定义一个正确的析取。

另一种选择是根据接触区域集的长度(即路线接触的不同区域的数量)定义一个维度,但同样如何定义这样一个维度?

有什么提示吗? 谢谢

编辑:

我意识到这一定是一个硬约束,并尝试了以下方法:

traversed_zones=[]
for v in all_vehicles:
    traversed_zones.append([[]]*len(all_zones))
for p in all_points:
    z=zones[p]
    traversed_zones[v][z].append(model.VehicleVar(manager.NodeToIndex(p))==v) #True if the vehicle v serves the point p
# sum 1 for all zones with at least one point served by the vehicle v
solver.AddConstraint( solver.Sum(1 for z in traversed_zones[v] if solver.Sum(z)>0) < 3)

但运行它我没有得到任何解决方案。 我尝试了很多这种方法的变体,但没有成功

使用这种派生约束的任何帮助或有用的例子? 谢谢大家!

【问题讨论】:

    标签: routing constraints or-tools


    【解决方案1】:

    我发现了我的错误。 这是我的收藏初始化方式中的一个愚蠢的错误! 我在这里报告它以防万一有人对问题的(一个)正确解决方案感兴趣:

        traversed_zones={}
        for v in all_vehicles:                           
            traversed_zones[v]={}
            for p in all_points:
                if p>=data['cluster_depots']: # depot's zone doesn't matter
                    z=data['cluster_zones'][p]
                    zone_list=traversed_zones[v].get(z,None)
                    if zone_list==None:
                        zone_list=[]
                        traversed_zones[v][z]=zone_list
                    # vehicle(p)==v -> v serves p in zone z
                    zone_list.append(model.VehicleVar(manager.NodeToIndex(p))==v)
    
            #sum(max([True for p in points of zone z if vehicle v serves p])) -> counts the served zones
            constraint=(solver.Sum(solver.Max(z) for z in traversed_zones[v].values())<=conf['zones_limit'])
            solver.AddConstraint(constraint)`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多