【发布时间】: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