由于我的英语不好,我需要保持简短:)
比方说,我必须在一个具有多个地区的城市上解决一个简单的VRP,并且我想限制每辆车/每条路线所接触的最大区域数。
Orders = [(x1,y1),(x2,y1),(x3,y3)...(xN,yN)]#每个订单均由其坐标标识
Districts = [1,2,3]#为简单起见,仅3个地区
Order_district = [2,3,2,... 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)`