使用 python+gurobi求解交通问题
问题属性:网络流量规划问题
运筹学属性:混合整数规划问题
网络属于双向网络,建模过程双向网络的信息都通过ixj对称矩阵输入,
相关变量说明:
X[i][j][k][l],表示OD对(k,l)在路径(i,j)上的流量需求,
Y[i][j]表示路径(i,j)上的总流量
U[i][j]表示路径(i,j)上的容量
在求解过程中,模型无解,利用gurobi中的iis找到冲突约束以下,是哪里有错呢?
for i in irange:
for j in jrange:
for k in O:
for l in K:
MCFproblem.addConstr(Y[j][i] - grb.quicksum([X[j][i][k][l]]) == 0, name='constriant2')
# 约束条件(4)双向链路容量限制
for i in irange:
for j in jrange:
if i<j:
MCFproblem.addConstr(Y[i][j] + Y[j][i] - U[i][j] <= 0, name='constriant4')
参考 https://blog.csdn.net/python_n/article/details/118737007
带时间窗约束的车辆路径规划问题(VRPTW)详解 + Python 调用 Gurobi 建模求解
可以参考下,非常详细
双向链路上的流量缺少约束,可能导致流量不平衡
约束大致正确,一些可能的改进和问题。
对于你的第二个约束条件(称为“约束条件2”),你是想说路径(i,j)上的总流量Y[i][j]应该等于所有OD对在该路径上的总需求。但是,你的当前代码只对某些路径(j,i)(而不是(i,j))加了这个约束。而且,你在求和时只加了一个X[j][i][k][l],而应该对所有的k和l求和。这个约束应该改为:
for i in irange:
for j in jrange:
MCFproblem.addConstr(Y[i][j] - grb.quicksum(X[i][j][k][l] for k in K for l in L) == 0, name='constriant2')
另外你的约束条件4对于所有的i和j都加了约束,即使i和j之间没有直接的连接。你应该只对存在的路径(i,j)加这个约束。而且,根据你的定义,Y[i][j]和Y[j][i]都表示在路径(i,j)上的总流量,那么它们应该是相等的。你的约束条件4应该改为:
for (i, j) in edges:
MCFproblem.addConstr(Y[i][j] - U[i][j] <= 0, name='constriant4')
在这里,假设你有一个变量edges,它包含了所有存在的路径(i,j)。
在应用双向链路容量限制时没有考虑到循环路径的情况只添加了从节点i到节点j的流量约束,但没有添加从节点j到节点i的流量约束。这可能导致模型无解或出现冲突约束。可以通过添加从节点j到节点i的流量约束,确保双向链路上的流量是平衡的,并且满足容量限制。
试试添加从节点j到节点i的流量约束
采用chatgpt:
根据您提供的代码,可能存在以下问题:
1、约束名称重复:在添加约束时,您为所有的约束使用了相同的名称"constraint2"和"constraint4"。Gurobi要求约束的名称必须是唯一的,因此您需要为每个约束使用不同的名称。
2、冲突约束的添加:根据您提供的代码,只有"constraint2"和"constraint4"两个约束被添加到模型中。如果您使用Gurobi的IIS(Irreducible Inconsistent Subsystem)功能来找到冲突约束,您需要将所有的约束添加到模型中,而不仅仅是这两个约束。请确保其他约束也被正确地添加到模型中。
3、索引范围:在您的代码中,没有提供"irange"、"jrange"、"O"和"K"的定义。请确保这些索引的范围是正确定义的,并且包含了您的数据。
以下是修改后的代码示例:
# 添加约束2
for i in irange:
for j in jrange:
for k in O:
for l in K:
MCFproblem.addConstr(Y[j][i] - grb.quicksum([X[j][i][k][l]]) == 0, name='constraint2_{}_{}_{}_{}'.format(i, j, k, l))
# 添加约束4
for i in irange:
for j in jrange:
MCFproblem.addConstr(Y[i][j] + Y[j][i] - U[i][j] <= 0, name='constraint4_{}_{}'.format(i, j))