如何使用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
相关产品推荐
相关产品推荐

