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

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的