Pyomo 简单示例学习
pyomo是Python中的一个建模求解语言 Pyomo(Python Optimization Modeling Objects):优化建模对象,支持复杂优化应用的数学模型的建立和分析,是一种功能齐全的高级编程语言,包含一组丰富的支持库;建模的过程是科学研究、工程和商业许多方面的基本过程,建模涉及系统或现实世界对象的简化表示的制定。可以调用cplex这样的求解器来进行计算。
Cplex12.10–Linux–(Py3~Py38安装过程(附安装包))
因此像Pyomo的建模工具可以用于:
- 解释系统中出现的现象
- 预测系统的未来状态
- 识别系统中可能的最坏情况或者最低成本的极值点
- 分析权衡来给予决策者支持
常见的求解器:
- CBC,开源求解器(COIN-OR)开发的线性规划求解器,性能不足
- GLPK(GNU Linear Programmed Kit)是GNU维护一个线形规划工具包,对于求解大规模的额线性规划问题速度缓慢
- CPLEX,是IBM开发的商业线性规划求解器,可以求解LP,QP,QCQP,SOCP等四类基本问题和对应的MIP,社区版仅支持低于1000变量的使用,教育版无限制,建模时间长,但是求解速度非常快
- Gurobi,是CPLEX团队创始人重新创建的商业求解器,和cplex速度差别不大,相对来说比Cplex好一点
Pyomo的学习网站
Installation - Pyomo 6.4.0 documentation
0x01 Pyomo overview
1.1 Mathematical modeling 数学建模
数学模型是用形式化的语言表示系统只是,以下数学概念是现代建模活动的核心
- 变量variable,变量代表模型的未知或变化部分,(例如是否做出决定,或系统结果的特征),变量所取的值通常称为解,通常是优化过程的输出
- 参数parameters,参数表示为执行优化必须提供的数据,实际上在某些设置中data用来代替parameters
- 关系relations,这里是在定义模型的不同部分如何相互链接的方程、不等式或者其他的数学关系
- 目标goal,反应被建模系统的目标和功能
在计算机求解的过程中可以分为建模和求解两个方面,计算性能的替僧是的数学模型的数值分析称为一项司空见惯的活动,但是如果没有建模语言,设置输入文件、执行求解器以及从求解器中输出中提取结果的过程即繁琐又容易出错,在发生错误时难以调试,在大规模的实际应用程序中这种困难更加复杂,此外优化软件包使用的格式很多,而许多优化器实际识别的格式很少,因此应用多个优化器求解来分析模型会带来额外的复杂性
在这个过程中pyomo希望拓展用于python的数学建模,并调用对应的优化求解器来辅助求解,在这个过程中其具有的特征有
- 开源
- 可定制
- 求解器集成
- 具有非常robust的语言、广泛的文档、丰富的标准库集,对现代编程中类和函数的支持
1.2 Overview of modeling components and processes建模组建和过程描述
简单建模过程的基本步骤
- 创建模型并声明组建
- 实例化模型
- 应用求解器
- 询问求解器结果
在整个过程中pyomo的建模组件定义来模型的不同方面,包括现代AML通常支持的建模组件,
sets, symbolic parameters, decision variables, objectives,constraints
在pyomo中定义相关的python类
- Set,用于定义模型实例的数据
- Param,用于定义模型实例的参数数据
- Var。模型中的决策变量
- Objective,模型中最小化或最大化的目标函数
- Constraint,对模型中的Var施加约束限制的表达式
0x02 Abstract versus concrete models抽象模型和具体模型
使用类AbstractModel()可以使用表示数据值的符号来定义数学模型,,例如下列表示一个线性程序,用于找到向量的最优值x,包括参数n和b,和参数向量a和c
添加图片注释,不超过 140 字(可选)
使用类ConcreteModel()来建立具体模型
添加图片注释,不超过 140 字(可选)
python程序可能更喜欢 编写具体模型,而其他的一些代数建模语言的用户可能更喜欢编写抽象模型
2.1 Simple models简单模型
1 |
|
虽然规则函数也可以用于指定Constraint和Objective,但是在此示例中使用expr来仅在具体模型中可用的选项,来直接指定表达式
2.2 Abstract Models抽象模型
1 |
|
为了使用这个模型,必须给出参数值的数据,可以提供数据的文件,格式为dat
0x03 Pyomo model setting
- Any = 所有可能的值
- Reals = 浮点值
- PositiveReals = 严格的正浮点值
- NonPositiveReals = 非正浮点值
- NegativeReals = 严格的负浮点值
- NonNegativeReals = 非负浮点值
- PercentFraction = 区间 [0,1] 中的浮点值
- UnitInterval = PercentFraction 的别名
- Integers = 整数值
- PositiveIntegers = 正整数值
- NonPositiveIntegers = 非正整数值
- NegativeIntegers = 负整数值
- NonNegativeIntegers = 非负整数值
- Boolean 布尔值,可以表示为 False/True、0/1、’False’/‘True’ 和 ‘F’/‘T’
- Binary = 整数 {0, 1}
3.1 Sets
1 |
|
3.2 Parameters
使用该词表示必须提供的数据,以便为决策变量找到最佳的分配
1 |
|
3.3 Varibles
1 |
|
3.4 Objectives
返回试图最大化或最小化值的变量函数,可以构建一个默认参数位model的函数来作为输入
1 |
|
可以使用sense参数来最大化
3.5 Constraints
大多数约束是使用规则创建的等式或不等式指定表达的
约束可以通过列表或集合来索引,当声明中包含列表或集合作为参数,元素会迭代传递给规则函数
1 |
|
求解实例
1 |
|