GUROBI之用稀疏矩阵表示约束条件

文章介绍了如何在Gurobipy中使用稀疏矩阵表示MIP模型的约束条件,展示了CSR和CSC格式的转换,并指出稀疏矩阵在存储上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为节省存储空间,采用稀疏矩阵来表示约束条件的系数矩阵

例如,求解下列MIP模型,采用稀疏矩阵来表示约束条件

# This example formulates and solves the following simple MIP model
# using the matrix API:
#  maximize
#        x +   y + 2 z
#  subject to
#        x + 2 y + 3 z <= 4
#        x +   y       >= 1
#        x, y, z binary
import gurobipy as gb
from gurobipy import GRB
import numpy as np
import scipy.sparse as sp  # scipy库中存储稀疏矩阵的函数

try:
    # creat a new model
    m=gb.Model("matrix_model")
    # creat variables
    x=m.addMVar(shape=3, vtype=GRB.BINARY, name ="x")
    # set objective
    obj = np.array([1.0, 1.0, 2.0])
    m.setObjective(obj@x, GRB.MAXIMIZE)
    # build sparse constraint matrix
    val = np.array([1.0, 2.0, 3.0, -1.0, -1.0]) # 按行罗列约束中的变量系数
    row = np.array([0, 0, 0, 1, 1])  # 非0系数的行索引
    col = np.array([0, 1, 2, 0, 1])  # 非0系数的列索引
    A=sp.csr_matrix((val, (row, col)), shape =(2,3))
    # build rhs vector
    rhs = np.array([4.0, -1.0])
    # add constraints
    m.addConstr(A@x<=rhs, name="c")

    m.optimize()

    for v in m.getVars():
        print(f"{v.VarName} {v.X:g}")
    print(f"Objective: {m.ObjVal:g}")

except gb.GurobiError as e:
    print(f"Error code {e.errno}: {e}")

except AttributeError:
    print("Encountered an attribute error")

稀疏矩阵是如何创建的

csr_matrix  (compress sparse row): 按行压缩的稀疏矩阵

csc_matrix(compress sparse column):按列压缩的稀疏矩阵

可以看到,在将 CSR(Compressed Sparse Row)格式的稀疏矩阵转换为 CSC(Compressed Sparse Column)格式后,矩阵的结构本身并没有改变,仅是数据的存储方式不同。

另,稀疏矩阵的常见用法可以参考这个连接:SciPy 稀疏矩阵 | 菜鸟教程 (runoob.com)

### 使用 MATLAB 和 Gurobi 求解 MILP 问题 为了在 MATLAB 中使用 Gurobi 解决混合整数线性规划 (MILP) 问题,需先安装并配置好 Gurobi 软件包以及其与 MATLAB 的接口。一旦完成设置,可以通过调用 `gurobi` 函数来定义和解决优化问题。 #### 定义模型参数 创建一个结构体用于存储所有的输入数据,包括目标函数系数向量、约束矩阵、右侧常数值向量等: ```matlab model.A = ... % 约束条件稀疏矩阵表示形式 model.obj = ... % 目标函数的成本向量 model.rhs = ... % 右端项(即不等式的右边) model.sense = ... % 不等号的方向 ('<' 或 '>') 组成字符串数组 model.vtype = 'C'; % 设置变量类型,默认为连续型;对于整数变量应设为'I' model.lb = ... % 下界向量 model.ub = ... % 上界向量 ``` 针对特定于 MILP 的情况,当某些决策变量被指定为整数时,则应在 `vtype` 字段中相应位置标记 `'I'` 来指示这些变量是整数类型的[^3]。 #### 添加额外选项 还可以设定其他控制求解过程的行为属性,比如时间限制或者相对差距容忍度: ```matlab params.TimeLimit = 60; % 设定最大运行时间为60秒 params.MIPGap = 1e-4; % 当找到解决方案的质量达到此比例以内即可停止搜索 ``` #### 执行求解命令 准备好上述信息之后就可以执行实际的求解操作了: ```matlab result = gurobi(model, params); disp(result.x); % 显示最优解对应的变量取值 fprintf('Objective Value: %.4f\n', result.objval); % 输出目标函数值得到的结果 ``` 以上流程展示了如何利用 MATLAB 结合 Gurobi 工具箱有效地处理复杂的 MILP 任务,并获得满意的解答方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值