Gurobi C++ API中实现max{x₁-x₂,0}≥1约束的问题咨询
C++ Gurobi 实现
max{x_1-x_2, 0} >= 1约束的方法 通用实现方案(适用于所有最大值约束加阈值的场景)
addGenConstrMax接口的作用是定义「某个变量等于指定多个表达式的最大值」,你只需要额外引入1个辅助变量承接最大值,再给辅助变量添加阈值约束即可:
- 首先新增一个连续类型的辅助变量,用于存储
max{x_1-x_2, 0}的计算结果 - 调用
addGenConstrMax完成辅助变量和最大值的绑定 - 给辅助变量添加
>=1的普通线性约束即可
对应代码示例:
// 假设你已经定义好了变量x1、x2,模型对象为model // 1. 定义辅助变量,连续型,上下界设为无穷即可 GRBVar max_aux = model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_CONTINUOUS); // 2. 构造待取最大值的两个表达式:x1-x2 和 0 GRBLinExpr diff_expr = x1 - x2; GRBLinExpr max_candidates[2] = {diff_expr, 0}; // 3. 绑定辅助变量为两个候选值的最大值 model.addGenConstrMax(max_aux, 2, max_candidates, 0.0, "max_bind_constr"); // 4. 添加最大值>=1的约束 model.addConstr(max_aux >= 1, "max_threshold_constr");
本场景简化方案
对于max{表达式, 0} >= 1这个特定约束,0显然无法满足>=1的要求,因此该约束可以直接等价为x_1 - x_2 >= 1,无需引入辅助变量和广义约束,求解效率更高:
model.addConstr(x1 - x2 >= 1, "simplified_constr");
内容的提问来源于stack exchange,提问作者Farah Mind
相关产品推荐
相关产品推荐

