Ограничить количество районов, затронутых каждым транспортным средством в ortools VRP
Мне нужно быть коротким из-за моего плохого английского:)
Допустим, мне нужно решить простую VRP для города с несколькими районами, и я хочу ограничить максимальное количество районов, которые затрагивает каждое транспортное средство / маршрут.
Orders = [(x1, y1), (x2, y1), (x3, y3)... (xN, yN)] # каждый ордер идентифицируется своими координатами
Районы =[1,2,3] # только 3 района для простоты
Order_district=[2,3,2,...1] # заказы принадлежат одному из трех округов
Моей первой мыслью было добавить штраф за каждый "затронутый район", но мне сложно определить правильный дизъюнкт.
Другим вариантом может быть определение измерения на основе длины набора затронутых районов (т. Е. Количества отдельных районов, которых касается маршрут), но опять же, как определить такое измерение?
Любой намек? Спасибо
0 ответов
Нашел свою ошибку. Это была глупая ошибка инициализации моей коллекции! Сообщаю об этом здесь на всякий случай, если кого-то заинтересовало (одно) правильное решение проблемы:
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)`