限制ortools VRP中的每辆车接触的区域数量

时间:2019-02-26 21:41:09

标签: routing constraints or-tools

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

比方说,我必须在一个具有多个地区的城市上解决一个简单的VRP,并且我想限制每辆车/每条路线所接触的最大区域数。

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

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

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

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

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

有任何提示吗? 谢谢

1 个答案:

答案 0 :(得分: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)`