将OutputFlag设置为0不生效
model.setParam(GRB.Param.OutputFlag, 0)必须要作为model.setParam系列的第一个!
两种不同的添加约束的写法
注:merge_od_work_list是list of list
- 第一种:正确
for i in merge_od_work_list:
m.addConstr(
quicksum(y[i[0], i[1], j, t]
for j in range(1, n+1)
for t in range(1, 3)
)
== i[2]
)
- 第二种:报错TypeError: unhashable type: ‘list’
m.addConstrs(
quicksum(y[i[0], i[1], j, t]
for j in range(1, n+1)
for t in range(1, 3)
)
== i[2]
for i in merge_od_work_list
)
暂时还没搞清楚原因。
Gurobi默认变量lb为0
如果变量是free的,要设置lb=-GRB.INFINITY
关于对偶变量的符号
模型写入.mps文件约束名字由自定义变为默认
因为自定义的约束名字中有重复
MemoryError
- 换一台RAM更大的电脑
- 将矩阵用稀疏形式表达,例如:
import scipy.sparse as sp
A = sp.csr_matrix((d1, d2), dtype=float)
同时要注意,当用稀疏矩阵和稠密向量做内积时,要用dot
而不是@
:
results = A.dot(x)
上面使用 A.dot(x) 计算出的 result 将是一个稠密的 NumPy 数组,而不是稀疏矩阵。
如果你希望保持结果的稀疏性,你可以将结果转换为稀疏矩阵,但请注意,这可能会导致内存占用的增加,特别是如果结果本来非常稠密。
result_sparse = sp.csr_matrix(result)
然而,如果你需要进行后续的稀疏矩阵操作,最好保持结果为稀疏矩阵,以避免不必要的内存开销。
矩阵形式的约束-1
设系数矩阵
A
=
[
a
1
a
2
a
3
a
4
]
A=\begin{bmatrix}a_1&a_2\\a_3&a_4\end{bmatrix}
A=[a1a3a2a4],决策变量
x
=
[
x
1
x
2
x
3
x
4
]
x=\begin{bmatrix}x_1&x_2\\x_3&x_4\end{bmatrix}
x=[x1x3x2x4]。现想添加如下约束:
a
1
x
1
+
a
2
x
2
+
a
3
x
3
+
a
4
x
4
+
10
=
0
a_1x_1+a_2x_2+a_3x_3+a_4x_4+10=0
a1x1+a2x2+a3x3+a4x4+10=0
正确方法:
model.addConstr(
(A * x).sum()
+ 10 == 0,
name='correct'
)
错误方法:
model.addConstr(
quicksum(A * x)
+ 10 == 0,
name='wrong'
)
错误方法会使得模型添加多条约束,而非一条。
矩阵形式的约束-2
设矩阵
A
A
A维度为
m
×
n
m\times n
m×n。
写法一:
model.addConstr(A @ x == np.zeros((m, )))
写法二:
model.addConstr(A @ x == np.zeros((m, 1)))
前者添加 m m m条约束,后者添加 m × m m\times m m×m条约束。