You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python在Gurobi中编写2-范数约束?

Gurobi 2-范数≥1约束正确实现代码

你之前的两种写法存在以下问题:

  • 第一种写法中,单元素变量相乘不需要使用矩阵乘法运算符@,额外调用__pow__(1/2)计算平方根没有必要,会额外增加求解器的非线性处理开销
  • 第二种写法中,np.linalg.norm只能处理数值类型的数组,无法识别Gurobi的MVar变量对象,不能生成求解器可识别的约束表达式,因此运行会报错

正确的实现方式如下,我们可以利用2范数非负的特性,将原约束等价转换为平方和≥1的形式,避免不必要的开方运算,同时开启Gurobi的非凸求解支持:

import gurobipy as gp

k = 2
n = 2
# 初始化模型
model = gp.Model()

# 定义变量
w = model.addMVar((k, n), lb=-1.0, ub=1.0, vtype=gp.GRB.CONTINUOUS, name="w")

# 开启非凸求解支持,2范数≥1属于非凸约束,必须开启该参数才能正常求解
model.params.NonConvex = 2

for i in range(k):
    # 计算第i行向量的平方和,等价于2范数的平方
    row_square_sum = w[i, :] @ w[i, :]
    # 平方和≥1 与 2范数≥1 完全等价
    model.addConstr(row_square_sum >= 1, name=f"norm2_constr_{i}")

# 此处添加你自己的目标函数定义
# model.setObjective(...)

# 求解
model.optimize()

# 输出结果
if model.status == gp.GRB.OPTIMAL:
    print("最优解w:")
    print(w.X)

如果你的约束是2范数≤1,属于凸二次约束,不需要开启NonConvex参数即可直接求解。

内容的提问来源于stack exchange,提问作者TIANMIN Wu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:15:01