GUROBI添加约束——SOS (Special Ordered Sets)

Model.addSOS(type, vars, wts=None)

Arguments:

type: SOS type (can be GRB.SOS_TYPE1 or GRB.SOS_TYPE2).

type1:约束是一个变量集合,最多有一个变量的值不为零

type2:约束是一个有序的变量集合,最多有两个变量的值不为零,如果有两个变量的值不为零,那么这两个变量在有序集合中位置必须是连续的

vars: List of variables that participate in the SOS constraint.

weights (optional): Weights for the variables in the SOS constraint. Default weights are 1, 2, ...

其实weights就是这些变量在有序集合中的顺序, 也就是在 SOS 约束中,权重值为 1 的变量(对应的是 x)、权重值为 2 的变量(对应的是 y)、权重值为 4 的变量(对应的是 z)在有序集合中的顺序。

Return value: New SOS object.

Example usage:

  model.addSOS(GRB.SOS_TYPE1, [x, y, z], [1, 2, 4])

官网解释:

### 如何在 Gurobi添加约束条件 #### 添加单一约束 为了向优化模型中添加单个约束,在 PythonGurobi API 下可以使用 `addConstr` 方法。此方法接受两个主要参数:第一个是要施加的线性表达式,第二个是该约束的名字(可选)。下面是一个简单的例子来展示这一点: ```python from gurobipy import Model, LinExpr m = Model("example") # 创建一个新的模型实例 x = m.addVar(name="x") # 增加决策变量到模型中 y = m.addVar(name="y") expr = LinExpr([1.0], [x]) + y # 构造一个线性表达式 expr = x + y m.addConstr(expr >= 2, "c0") # 向模型增加不等式约束 c0: x + y ≥ 2 ``` 此处增加了名为 `"c0"` 的约束,它表示 \(x+y\) 应当大于等于 2。 #### 使用循环批量添加约束 虽然可以在同一个语句里设置多个约束,但通常建议通过显式的循环逐一构建这些约束,这有助于提高代码的可读性和维护性[^1]。考虑如下场景——为每一个索引 i 施加一系列相等约束: ```python for i in range(n): sum_mk1_i = ... # 计算或指定某个值给 sum_mk1[i] fi_squared = f(i)**2 # 或者其他形式计算得到的结果 # 将当前迭代中的约束加入模型 m.addConstr(sum_mk1[i] == fi_squared, f'eq_{i}_mk1') for i in range(n): # 进一步利用之前定义好的辅助变量创建更多约束 m.addConstr(sum_mk[i] == sum_mk1[i]*f(i), f'mul_eq_{i}') ``` 这里展示了如何分两步分别针对不同类型的约束进行处理;第一步是对每个元素应用平方操作并将其结果存储于新的数组内;第二部则是基于新生成的数据集形成乘法关系上的限制条件[^2]。 #### 条件逻辑下的约束设定 对于涉及条件判断的情况,比如想要模拟类似于编程语言里的 `if...else` 结构,则可以通过引入二元变量以及大M法等方式间接实现这样的功能[^3]。不过需要注意的是,这类高级特性往往会使求解过程变得更加复杂,因此应当谨慎评估其必要性后再做决定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值