python - 使用 Gurobi for python 的 VRP 模型中的可选节点出现问题
问题描述
我目前正在研究车辆是电动的 VRP 问题。这意味着我有范围限制和充电站作为可选访问的节点。
在我的模型中,我有以下内容:
O = [0] # depot
N = [1,2,3,4,5,6,7] # deliveries
V = [0,1,2,3,4,5,6,7] # all nodes which must be visited
F = [8,9] # charging stations.
G = [0,1,2,3,4,5,6,7,8,9] # all the nodes
此外,我有一个距离矩阵,其中包含所有节点之间的距离。我在每个交货点也有重量要求。我当前的模型如下所示:
m = Model('E-VRP')
x = m.addVars(G, G, vtype=GRB.BINARY)
lw = m.addVars(G, vtype=GRB.CONTINUOUS) # for calculating load weight
d = m.addVars(G, vtype=GRB.CONTINUOUS) # for calculating distance driven
m.setObjective(quicksum(distance[i,j]*x[i,j] for i in G for j in G if i!=j), GRB.MINIMIZE)
# Restrictions
m.addConstrs(quicksum(x[i,j] for j in V if j!=i)== 1 for i in N) #1
m.addConstrs(quicksum(x[i,j] for i in V if i!=j)== 1 for j in N) #2
m.addConstrs ((x[i,j]==1) >> (lw[i] + Dw[i] == lw[j]) #3
for i in G for j in G if i!=0 if j!=0)
m.addConstrs (lw[i] >= Dw[i] for i in G); #4 (Dw being demand in weight at delivery)
m.addConstrs (lw[i] <= Qw for i in G); #5 (Qw being weight capacity of vehicle)
m.addConstrs ((x[i,j]==1) >> (d[i] + distance[i,j] == d[j])
for i in G for j in G if j>0); #6
m.addConstrs (d[i] <= Qr for i in G); #7 (Qr being range restriction of vehicle)
前三个限制的组合使该模型成为工作容量的车辆路线问题。它在 depot (0) 开始和结束,如果 Qw 小于 lw,则模型将进行多条路线。
当我施加范围限制时,问题就来了。我有两个问题:
首先,该模型不会使充电站成为路线的一部分。我知道限制 #1 和 #2 规定必须有从列表 V 到 N 的连接,反之亦然,这意味着对于节点 j,列表 V 中必须有一个 i(不包括充电站)。但是,每当我尝试“放开”前两个限制时,该模型都会建议不会在站点开始或结束的子游览。有人对我如何解决这个问题有任何建议吗?
其次,我的变量 d 用于跟踪行驶距离,它只会在返回站点之前将到最后一个节点的距离相加。我意识到我的代码 j>0 表明该站点不能成为我的旅行变量中的目的地,但是,这是我让它适用于所有其他节点的唯一方法。
对这些问题的任何帮助将不胜感激。
兄弟,
维克多
解决方案
推荐阅读
- google-drive-api - 您可以通过 REST API 将多个同时分块的文件上传到 Google Drive 吗?
- win32gui - 如何解决未定义的引用,是库没有导入,还是其他问题
- react-native - 我怎样才能毫无问题地将博览会变成原生反应?
- image - 如何在 Flutter 中创建图片区域?
- ios - 错误 | [iOS] 未知:验证期间遇到未知错误(格式错误的版本号字符串“4.0”)
- python - Github API 从 python 请求返回 401,但从 curl 返回 200
- python - 字符串格式:没有整数部分的浮点数
- javascript - JS - 即使有那个对象,也无法读取未定义的属性“包含”
- html - 在多页上打印表格
- windows - 复制指定位置的文件列表