gurobi约束条件使用大全(`model.addConstr()`添加单个约束和`model.addConstrs()`添加多个约束和强不等式约束)

本文主要是介绍gurobi约束条件使用大全(`model.addConstr()`添加单个约束和`model.addConstrs()`添加多个约束和强不等式约束),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • gurobi约束条件
        • `model.addConstr()`添加单个约束
        • `model.addConstrs()`添加多个约束
        • 强不等式约束

gurobi约束条件

model.addConstr()添加单个约束

约束可以是线性、不等式或等式。Gurobi支持添加单个约束和多重约束。

例子:

model.addConstr(x + y == 5, "eq_constr")  # 添加等式约束x + y = 5model.addConstr(x - 2 * y >= 3, "ineq_constr")  # 添加不等式约束x - 2y >= 3
model.addConstrs()添加多个约束

使用 model.addConstrs() 方法同时添加多个约束。该方法通常与字典或列表推导式结合使用,以方便地定义多个约束.

示例 1:基于索引的约束
假设你有多个变量 x[i]y[i],你希望添加以下约束:

  • x [ i ] + y [ i ] = 5 , i = 1 , 2 , . . . , n . x[i] + y[i] = 5,i=1,2,...,n. x[i]+y[i]=5,i=1,2,...,n.
  • x [ i ] − 2 × y [ i ] ≥ 3 = 1 , 2 , . . . , n . x[i] - 2 \times y[i] \geq 3=1,2,...,n. x[i]2×y[i]3=1,2,...,n.

以下是代码示例:

# 添加等式约束 x[i] + y[i] = 5
model.addConstrs((x[i] + y[i] == 5 for i in range(n)), "eq_constr")# 添加不等式约束 x[i] - 2 * y[i] >= 3
model.addConstrs((x[i] - 2 * y[i] >= 3 for i in range(n)), "ineq_constr")

示例 2:基于条件的约束
如果约束是基于某种条件(例如,索引对 (i, j) 满足特定条件),你也可以这样写:

# 假设 m 和 n 是索引的范围
model.addConstrs((x[i, j] + y[i, j] == 5 for i in range(m) for j in range(n) if some_condition(i, j)), "eq_constr")model.addConstrs((x[i, j] - 2 * y[i, j] >= 3 for i in range(m) for j in range(n) if some_condition(i, j)), "ineq_constr")

代码解释与对应的数学公式

model.addConstrs((x[i, j] + y[i, j] == 5 for i in range(m) for j in range(n) if some_condition(i, j)), "eq_constr"
)model.addConstrs((x[i, j] - 2 * y[i, j] >= 3 for i in range(m) for j in range(n) if some_condition(i, j)), "ineq_constr"
)

这段代码用于在 Gurobi 优化模型中添加一组约束条件。代码通过 model.addConstrs() 方法,基于某个条件 some_condition(i, j) 对变量 x[i, j]y[i, j] 添加约束。
【1】. model.addConstrs()

  • 含义:用于添加多个约束。model 是 Gurobi 模型对象,addConstrs 是其方法之一,用于同时添加多个约束。

【2】. (x[i, j] + y[i, j] == 5 for i in range(m) for j in range(n) if some_condition(i, j))

  • 含义:这个生成器表达式遍历所有可能的索引对 (i, j),为每一对 (i, j) 添加约束,前提是 some_condition(i, j) 条件为真。
  • 对应的数学公式

如果 some_condition ( i , j ) 为真: x i , j + y i , j = 5 , ∀ i ∈ { 0 , 1 , … , m − 1 } , ∀ j ∈ { 0 , 1 , … , n − 1 } \text{如果 } \text{some\_condition}(i, j) \text{ 为真:}x_{i,j} + y_{i,j} = 5, \forall i \in \{0, 1, \dots, m-1\}, \forall j \in \{0, 1, \dots, n-1\} 如果 some_condition(i,j) 为真:xi,j+yi,j=5,i{0,1,,m1},j{0,1,,n1}

【3】. (x[i, j] - 2 \times y[i, j] \geq 3 for i in range(m) for j in range(n) if some_condition(i, j))

  • 含义:这个生成器表达式与上面的类似,只是约束条件不同,这里是 x[i, j] - 2 \times y[i, j] >= 3,且同样受 some_condition(i, j) 的限制。
  • 对应的数学公式

如果 some_condition ( i , j ) 为真: x i , j − 2 × y i , j ≥ 3 , ∀ i ∈ { 0 , 1 , … , m − 1 } , ∀ j ∈ { 0 , 1 , … , n − 1 } \text{如果 } \text{some\_condition}(i, j) \text{ 为真:} x_{i,j} - 2 \times y_{i,j} \geq 3, \forall i \in \{0, 1, \dots, m-1\}, \forall j \in \{0, 1, \dots, n-1\} 如果 some_condition(i,j) 为真:xi,j2×yi,j3,i{0,1,,m1},j{0,1,,n1}

代码的每一部分解释

  1. for i in range(m) for j in range(n)

    • 含义:嵌套的 for 循环,用于遍历索引对 (i, j),其中 i 从 0 到 m-1j 从 0 到 n-1
    • 对应的数学符号:( i \in {0, 1, \dots, m-1} ), ( j \in {0, 1, \dots, n-1} )。
  2. if some_condition(i, j)

    • 含义:在 for 循环后跟随一个 if 语句,用于过滤出满足特定条件 some_condition(i, j) 的索引对 (i, j)
    • 对应的数学符号:这里对应的条件表示形式不唯一,但可以理解为附加的条件,只有当 some_condition(i, j) 为真时,才会添加对应的约束。
  3. x[i, j] + y[i, j] == 5x[i, j] - 2 * y[i, j] >= 3

    • 含义:分别表示添加的等式约束和不等式约束。
    • 对应的数学公式
      • 对应 x[i, j] + y[i, j] == 5 的数学公式:
        x i , j + y i , j = 5 x_{i,j} + y_{i,j} = 5 xi,j+yi,j=5
      • 对应 x[i, j] - 2 * y[i, j] >= 3 的数学公式:
        x i , j − 2 × y i , j ≥ 3 x_{i,j} - 2 \times y_{i,j} \geq 3 xi,j2×yi,j3
  4. "eq_constr""ineq_constr"

    • 含义:这是对约束的命名标识符。"eq_constr" 表示等式约束,"ineq_constr" 表示不等式约束。命名主要用于调试或后续引用约束。
    • 无直接的数学符号对应,但在模型中作为标识符有助于理解和追踪不同约束。

总结
这段代码主要用于根据条件 some_condition(i, j),对一组变量 x[i, j]y[i, j] 添加多个约束,包含了等式和不等式两种约束形式。通过 model.addConstrs() 方法和生成器表达式,可以非常简洁地表达复杂的约束逻辑。


示例 3:字典推导式
如果你使用 gurobipy.Model.addVars 创建了变量的字典,通过键来添加多个约束:

# 假设 x 和 y 是带有索引对 (i, j) 的变量字典
model.addConstrs((x[i, j] + y[i, j] == 5 for i, j in x.keys()), "eq_constr")model.addConstrs((x[i, j] - 2 * y[i, j] >= 3 for i, j in y.keys()), "ineq_constr")

【1.】 什么是“键”(Keys)?

在 Gurobi 中,变量通常是通过索引来定义的。这些索引的组合就构成了变量的“键”(keys)。一个“键”可以理解为变量的唯一标识符,通常是一个元组 (i, j),它表示变量 x[i, j]y[i, j] 中的特定索引对 (i, j)

【2.】 举例说明

假设你有一个二维变量 x[i, j]y[i, j]ij 是索引。例如:

  • i 的取值范围是 {0, 1}
  • j 的取值范围是 {0, 1, 2}

那么 x[i, j]y[i, j] 的变量集可以写作:

  • 对于 x[i, j]:你有变量 x[0, 0], x[0, 1], x[0, 2], x[1, 0], x[1, 1], x[1, 2]
  • 对于 y[i, j]:你有变量 y[0, 0], y[0, 1], y[0, 2], y[1, 0], y[1, 1], y[1, 2]

这些变量的“键”就是这些变量的索引对 (i, j)

  • x 的“键”包括 {(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)}
  • y 的“键”也包括 {(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)}

这些键就是变量的索引组合,用来唯一标识每个变量。

【 3.】具体代码解释

model.addConstrs((x[i, j] + y[i, j] == 5 for i, j in x.keys()), "eq_constr"
)model.addConstrs((x[i, j] - 2 * y[i, j] >= 3 for i, j in y.keys()), "ineq_constr"
)

x.keys()y.keys() 的含义

  • x.keys() 返回的是变量 x 的所有键 (i, j),即变量 x[i, j] 的所有索引对。
  • y.keys() 返回的是变量 y 的所有键 (i, j),即变量 y[i, j] 的所有索引对。

约束生成

  • 第一个约束model.addConstrs((x[i, j] + y[i, j] == 5 for i, j in x.keys()), "eq_constr")

    • 这个约束遍历 x 中的所有键 (i, j),为每个 (i, j) 添加一个约束 x[i, j] + y[i, j] == 5
    • 例如,如果 x 的键是 {(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)},那么这个生成器会为每个 (i, j) 添加如下的约束:
      • x[0, 0] + y[0, 0] == 5
      • x[0, 1] + y[0, 1] == 5
      • x[0, 2] + y[0, 2] == 5
      • x[1, 0] + y[1, 0] == 5
      • x[1, 1] + y[1, 1] == 5
      • x[1, 2] + y[1, 2] == 5
  • 第二个约束model.addConstrs((x[i, j] - 2 * y[i, j] >= 3 for i, j in y.keys()), "ineq_constr")

    • 这个约束遍历 y 中的所有键 (i, j),为每个 (i, j) 添加一个约束 x[i, j] - 2 * y[i, j] >= 3
    • 例如,如果 y 的键是 {(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)},那么这个生成器会为每个 (i, j) 添加如下的约束:
      • x[0, 0] - 2 * y[0, 0] >= 3
      • x[0, 1] - 2 * y[0, 1] >= 3
      • x[0, 2] - 2 * y[0, 2] >= 3
      • x[1, 0] - 2 * y[1, 0] >= 3
      • x[1, 1] - 2 * y[1, 1] >= 3
      • x[1, 2] - 2 * y[1, 2] >= 3

代码解释与对应的数学公式

model.addConstrs((x[i, j] + y[i, j] == 5 for i, j in x.keys()), "eq_constr"
)model.addConstrs((x[i, j] - 2 * y[i, j] >= 3 for i, j in y.keys()), "ineq_constr"
)
  1. model.addConstrs()
  • 含义model.addConstrs() 用于同时添加多个约束。model 是 Gurobi 模型对象,addConstrs 是其中的方法之一,专门用于批量添加约束。
  1. (x[i, j] + y[i, j] == 5 for i, j in x.keys())
  • 含义:这个生成器表达式用于遍历 x 变量的所有索引对 (i, j),并为这些索引对添加约束 x[i, j] + y[i, j] == 5
  • 对应的数学公式

x i , j + y i , j = 5 , ∀ ( i , j ) ∈ Keys ( x ) x_{i,j} + y_{i,j} = 5, \quad \forall (i,j) \in \text{Keys}(x) xi,j+yi,j=5,(i,j)Keys(x)

其中,Keys(x) 表示变量 x 中的所有键 (i, j) 的集合。

  1. (x[i, j] - 2 \times y[i, j] \geq 3 for i, j in y.keys())
  • 含义:这个生成器表达式与上面的类似,但它遍历的是 y 变量的所有索引对 (i, j),并为这些索引对添加约束 x[i, j] - 2 * y[i, j] >= 3
  • 对应的数学公式
    x i , j − 2 × y i , j ≥ 3 , ∀ ( i , j ) ∈ Keys ( y ) x_{i,j} - 2 \times y_{i,j} \geq 3, \quad \forall (i,j) \in \text{Keys}(y) xi,j2×yi,j3,(i,j)Keys(y)
    其中,Keys(y) 表示变量 y 中的所有键 (i, j) 的集合。

代码的每一部分解释

  1. for i, j in x.keys()for i, j in y.keys()
    • 含义x.keys()y.keys() 返回变量 xy 的所有键(即索引对 (i, j) 的集合)。for i, j in x.keys()for i, j in y.keys() 表示遍历这些键 (i, j)
    • 对应的数学符号:表示对集合中的每一个索引对 (i,j) 进行遍历:
      ∀ ( i , j ) ∈ Keys ( x ) 和 ∀ ( i , j ) ∈ Keys ( y ) \forall (i,j) \in \text{Keys}(x) \quad \text{和} \quad \forall (i,j) \in \text{Keys}(y) (i,j)Keys(x)(i,j)Keys(y)
  2. x[i, j] + y[i, j] == 5x[i, j] - 2 \times y[i, j] \geq 3
    • 含义:分别表示要添加的等式约束和不等式约束。对于 x 中的每一对 (i, j),约束 x[i, j] + y[i, j] == 5 被添加。对于 y 中的每一对 (i, j),约束 x[i, j] - 2 \times y[i, j] >= 3 被添加。
    • 对应的数学公式
      • 对应 x[i, j] + y[i, j] == 5 的数学公式:
        x i , j + y i , j = 5 x_{i,j} + y_{i,j} = 5 xi,j+yi,j=5
      • 对应 x[i, j] - 2 \times y[i, j] \geq 3 的数学公式:
        x i , j − 2 × y i , j ≥ 3 x_{i,j} - 2 \times y_{i,j} \geq 3 xi,j2×yi,j3
  3. "eq_constr""ineq_constr"
    • 含义:这些是对约束的命名标识符,"eq_constr" 用于等式约束,"ineq_constr" 用于不等式约束。命名主要是为了调试或后续引用约束。
    • 无直接的数学符号对应,但在模型中作为标识符有助于理解和追踪不同约束。

总结

(1) 这段代码通过遍历变量 xy 的所有键(索引对 (i, j)),为每个键 (i, j) 添加相应的约束。通过 model.addConstrs() 和生成器表达式,可以简洁地表达并添加多个约束。这对于处理大规模优化问题或约束较多的情况非常有用。

  • 第一部分代码 用于添加等式约束 x[i, j] + y[i, j] == 5,遍历的是 x 的所有键 (i, j)
  • 第二部分代码 用于添加不等式约束 x[i, j] - 2 * y[i, j] >= 3,遍历的是 y 的所有键 (i, j)

(2) “键”就是变量的索引,它表示了变量在多维数组中的位置。 例如 x[0, 1] 的键就是 (0, 1)y[1, 2] 的键就是 (1, 2)。在代码中,x.keys()y.keys() 是返回这些索引对的集合,然后通过 for i, j in x.keys() 来遍历所有的这些索引对,并为每一个组合添加约束。

强不等式约束
  • 对于遇到强不等式约束解决方法见== python中使用gurobi遇到强不等式约束(只有大于或者小于而不是大于等于或者小于等于的形式)的解决办法

这篇关于gurobi约束条件使用大全(`model.addConstr()`添加单个约束和`model.addConstrs()`添加多个约束和强不等式约束)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093772

相关文章

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

C# 预处理指令(# 指令)的具体使用

《C#预处理指令(#指令)的具体使用》本文主要介绍了C#预处理指令(#指令)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1、预处理指令的本质2、条件编译指令2.1 #define 和 #undef2.2 #if, #el

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro

C#中Trace.Assert的使用小结

《C#中Trace.Assert的使用小结》Trace.Assert是.NET中的运行时断言检查工具,用于验证代码中的关键条件,下面就来详细的介绍一下Trace.Assert的使用,具有一定的参考价值... 目录1、 什么是 Trace.Assert?1.1 最简单的比喻1.2 基本语法2、⚡ 工作原理3

C# IPAddress 和 IPEndPoint 类的使用小结

《C#IPAddress和IPEndPoint类的使用小结》本文主要介绍了C#IPAddress和IPEndPoint类的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录一、核心作用网络编程基础类二、IPAddress 类详解三种初始化方式1. byte 数组初始化2. l