Gurobi:踩坑记录/窍门分享

将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

  1. 换一台RAM更大的电脑
  2. 将矩阵用稀疏形式表达,例如:
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条约束。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值