当前位置: 首页 > news >正文

Gurobi基础语法之 LinExpr 类

        优化问题中普遍出现的一种类型的约束就是线性约束,线性约束形如\sum ai * xi \leq b,Gurobi 中设计了一个 LinExpr 类来创建线性表达式。

        当 i 的取值范围较小的时候,可以直接将这个线性表达式写出来,作为 addConstr 的参数,以此方便的建立起一个线性约束,但是当 i 的取值范围达到上百个时,使用 LinExpr 类来创建线性约束就是非常有必要的

创建线性表达式的方法

方法一:调用 LinExpr 的构造函数

        这是创建线性表达式最高效,而且是最推荐的方式,对于一个线性约束来说,如果其中的变量以及变量的常数已经确定,那么使用就可以调用 LinExpr 的构造函数进行创建,LinExpr 中重载了多个构造函数,下面将一一通过代码进行展示

e1 = LinExpr(2.0)
e2 = LinExpr(x)
e3 = LinExpr(2 * x)
e4 = LinExpr([1.0, 2.0], [x, y])
e5 = LinExpr([(1.0, x), (2.0, y), (1.0, z)])
m.update()
for i, expr in enumerate([e1, e2, e3, e4, e5], 1) :print(f'e{i} : {expr}')

运行结果

e1 : 2.0
e2 : x
e3 : 2.0 x
e4 : x + 2.0 y
e5 : x + 2.0 y + z

方法二:调用重载过的运算符添加表达式 

        LinExpr 类中重载的运算符包括 +, +=, -, -=, *, *=, /, 和** (指数部分必须是 2).

m = gp.Model()
x = m.addVar(name="x")
y = m.addVar(name="y")expr = gp.LinExpr([1, 1], [x, y])  # 表达式 x + y
expr1 = expr + y
expr1 += x  # 相当于调用 expr.__iadd__(x)
m.update()
print(expr1)

运行结果:x + y + y + x 

方法三:调用 LinExpr 类中的 addTerms 方法

m = gp.Model()
x = m.addVar(name="x")
y = m.addVar(name="y")expr = gp.LinExpr([1, 1], [x, y])  # 表达式 x + yexpr.addTerms(1.0, x)
expr.addTerms([2.0, 3.0], [x, y])
m.update()
print(expr)

运行结果:x + y + x + 2.0 x + 3.0 y

方法四:调用quicksum

        quicksum 作为 gurobipy 中设计的一个方法,这个方法的参数是一个 lis t类型的列表,这个方法的效率比 gurobi 中所实现的 sum 方法快的多,可以把传入的可迭代对象中的元素一一相加,并且返回一个 线性表达式,其类型是 LinExpr

m = gp.Model("IAddExample")x = m.addVar(name="x")
y = m.addVar(name="y")
# 下面这句也可以写成 expr = gp.quicksum([np.dot(np.array(m.getVars()), np.array([1, 2]))])
expr = gp.quicksum([1 * x, 2 * y])m.update()
print(expr)

 运行结果:x + 2.0 y

http://www.lryc.cn/news/528369.html

相关文章:

  • 《Java核心技术 卷II》日期和时间API的时间线
  • 文献阅读 250128-Tropical forests are approaching critical temperature thresholds
  • Deepseek的RL算法GRPO解读
  • Linux 如何使用fdisk进行磁盘相关的操作
  • 智能客服系统:结合 AI 模型与数据库实现对话与知识检索
  • 网易Android开发面试题200道及参考答案 (下)
  • 《哈佛家训》
  • 为AI聊天工具添加一个知识系统 之76 详细设计之17 正则表达式 之4 正则表达式模板
  • 面试被问的一些问题汇总(持续更新)
  • WS2812 梳理和颜色表示方法的对比:RGB和HSV
  • JAVA实战开源项目:蜗牛兼职平台(Vue+SpringBoot) 附源码
  • C++:多继承习题3
  • 【云安全】云原生-K8S-搭建/安装/部署
  • 06-AD向导自动创建P封装(以STM32-LQFP48格式为例)
  • linux监控脚本+自动触发邮件发送
  • 【漫话机器学习系列】066.贪心算法(Greedy Algorithms)
  • 代码随想录算法训练营第三十八天-动态规划-完全背包-279.完全平方数
  • ts 基础核心
  • 在RHEL 8.10上安装开源工业物联网解决方案Thingsboard 3.9
  • linux通过deb包安装(命令模式)
  • 「Unity3D」在Unity中使用C#控制显示Android的状态栏
  • LLM评估优化与新技术创新综述
  • 【Git】使用笔记总结
  • ZZNUOJ(C/C++)基础练习1000——1010(详解版)
  • 搜狐Android开发(安卓)面试题及参考答案
  • WPS数据分析000007
  • SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门
  • 把markdown转换为pdf的方法
  • Controller 层优化四步曲
  • Python数据分析-Python语法基础,IPython和Jupyter-Notebooks(二)