优化求解器之Pyomo建模工具简介

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 在使用优化求解器解决实际问题的过程中,通过程序接口输入优化模型往往会耗费大量时间和精力,且容易出错。为了简化这一步骤,建模语言应运而生。建模语言最初的概念是在1976年提出的,后经过不断的发展,形成了如今蓬勃的技术、产品和应用市场。建模语言往往并不对实际问题进行求解,而专注在模型建立本身,其目的是将复杂的优化问题简化为抽象的代数表达形式;让用户在开发上只需要专注于代数模型的建立,模型完成后再将数据分别引入。如此不但加快开发流程,更有效减少模型输入错误的可能性。接下来我们将发布一系列文章,对常见的AMPL, Pyomo, PuLP等建模语言进行简要的介绍。

这篇文章是系列的第二篇,主要介绍 Pyomo 的基本使用方法。目前,MindOpt 支持在 Windows/Linux/OSX 系统中,通过 Pyomo 建立线性规划模型并调用 MindOpt 来求解。


一、概述

Pyomo 是基于 Python 开发的第三方开源建模语言,Pyomo 的建模对象嵌入在 Python 中,它支持对线性规划、混合整数规划、非线性规划等问题的建模和分析,创建具体的问题实例,并调用求解器进行求解。


二、支持问题类型

Pyomo 支持多种求解器(如 MindOpt)接入。Pyomo 具有通用接口,支持调用任何可以读取 AMPL ".nl" 和写入 ".sol" 文件的求解器,以及生成 GAMS 格式模型和检索结果的能力。您可以在安装 Pyomo 后使用 Pyomo 命令 pyomo help --solvers 来获取当前支持的求解器列表。


Pyomo 支持多种问题类型,包括:

  • 线性规划
  • 二次规划
  • 非线性规划
  • 整数线性规划
  • 混合整数非线性规划
  • 混合整数二次规划
  • 微分代数方程
  • 整数随机规划
  • 广义析取规划
  • 带平衡约束的数学规划


Pyomo支持在功能齐全的编程语言中进行分析和编写脚本。

此外,Pyomo 还是用于开发高级优化和分析工具的有效框架。例如,PySP 包为随机编程提供了通用求解器。由于 Pyomo 的建模对象是嵌入在 Python 中的,所以其允许使用 Python 并行通信库对子问题进行透明并行化。


三、Pyomo 建模方法

可通过两种方式使用 Pyomo 创建优化模型:抽象(Abstract)和具体(Concrete)。这两种方式的关键区别在于是否将模型与数据分开引入:

  • 在抽象模型中,模型与数据是分开的,支持在模型建立后再引入数据赋值。
  • 在具体模型中,数据在模型本身中被定义。例如,在使用具体模型的 Pyomo 脚本中,所有内容都是在单个脚本文件中定义的。对于简单的问题,这可能是一种很高效的方法。但另一方面,对于规模比较大的问题(更大的数据集),这使得将数据和处理该数据所需的代码嵌入同一个Python脚本中变得不易实现且难以维护。


总体上讲,Pyomo 模型由变量(Variables)、参数(Parameters)、约束(Constraints)和目标(Objectives)组成。

(1)变量(Variables):

变量代表模型中待优化的决策变量,它是在优化求解中待计算的对象。求解优化模型后得到的变量的值通常称为解,它是优化求解过程的输出。

(2)参数(Parameters):

参数通常指优化问题中提供的数据(系数),以便为决策变量找到最佳(或良好)的值分配。参数值也可以通过定义验证函数进行检查。

(3)约束(Constraints):

约束是定义等式、不等式或其他数学表达式来指定变量的限制的一种方式。大多数约束是使用表达式规则创建的,这些规则往往是一个 Python 函数。

(4)优化目标(Objective):

优化目标是指被建模系统的目标的函数,一般有最大化或最小化两种定义。


优化模型示例

以 MindOpt (https://solver.damo.alibaba-inc.com/doc/html/index.html) 中的 线性规划问题示例 为例,我们使用 Pyomo API 来建立优化模型。

# Define variables and constraints.variable_names= ['x0', 'x1', 'x2', 'x3']    #变量名称var_lb= {'x0':0, 'x1':0, 'x2':0, 'x3':0}
var_ub= {'x0':10, 'x1':None, 'x2':None, 'x3':None}
objective_coeff= {'x0': 1, 'x1': 1, 'x2': 1, 'x3': 1}
constraint_names= ['c0', 'c1']
constraint_bound= {'c0': 1, 'c1': 1}
constraint_coeff= {('x0', 'c0'): 1, ('x1', 'c0'): 1, ('x2', 'c0'): 2, ('x3', 'c0'): 3,
                               ('x0', 'c1'): 1, ('x1', 'c1'): -1, ('x2', 'c1'): 0, ('x3', 'c1'): 6}
# Create model.model=ConcreteModel(name="ex1")
# Build decision variables.model.Set=Set(initialize=variable_names)
model.Variable=Var(model.Set, within=NonNegativeReals, bounds=fb)
# Objective. #目标model.obj=Objective(expr=sum(objective_coeff[var_name] *model.Variable[var_name] forvar_nameinvariable_names), sense=minimize)
# Constraints.  #约束model.dual=Suffix(direction=Suffix.IMPORT)
model.cons1=Constraint(expr=ConstraintsRule(model, 'c0') >=constraint_bound['c0'])
model.cons2=Constraint(expr=ConstraintsRule(model, 'c1') ==constraint_bound['c1'])

并指定使用 MindOpt 求解器,以及对求解的相关参数进行设置(注意:为了使用 MindOpt,请参考 MindOpt-Pyomo 的建模与优化 中描述的方法先将接口文件引入):

# Solve problem by MindOpt solver.opt=SolverFactory("mindo_direct")
# Set options.opt.options['Method'] =-1opt.options['IPM/PrimalTolerance'] =1e-10

最后,调用 Pyomo 的求解函数 solve() 进行求解,并获取相关的结果:

# Solve.results=opt.solve(model)
# Summary of result.results.write()
if (results.solver.status==SolverStatus.ok) and (results.solver.termination_condition==TerminationCondition.optimal):
print("The solution is optimal and feasible.")
model.Variable.display()
model.dual.display()
model.obj.display()
elif (results.solver.termination_condition==TerminationCondition.infeasible):
print("The model is infeasible.")
print("Solver Status: ",  results.solver.status)
else:
print("Something else is wrong.")
print("Solver Status: ",  results.solver.status)

更多的关于 Pyomo 的介绍请见:https://pyomo.readthedocs.io/


相关文章
|
7月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
MindOpt APL 达摩院自己的建模语言!
MindOpt建模语言(MindOpt Algebraic Programming Language, MindOpt APL, 简称为MAPL)是MindOpt团队研发的一种代数建模语言。相比与其他的语言,MAPL语法相对较少且自然,很贴近数学语言。用MAPL描述数学规划模型与用数学公式进行描述非常类似。
|
7月前
|
机器学习/深度学习 算法 测试技术
MindOpt APL向量化建模语法的介绍与应用(1)
向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题
|
7月前
|
测试技术 索引
MindOpt APL向量化建模语法的介绍与应用(2)
在数据科学、工程优化和其他科学计算领域中,向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言,为这些领域的专业人员提供了强大的工具,通过向量式和矩阵式变量声明以及丰富的内置数学运算支持,大大简化了数学建模和优化问题的处理。在本文中,我们将探索MAPL的这些特性,并且通过示例来展示如何有效使用这些工具。
|
7月前
|
开发框架 自然语言处理 达摩院
MindOpt APL,可以支持调用几十种求解器的建模语言
建模语言可以提供更高级、更灵活的问题描述方式,从而提高问题的理解和求解效率。它可以加速问题的开发和部署过程,促进不同领域之间的合作和交流,从而推动问题求解的进展和创新。
MindOpt APL建模语言自定小义函数的重要性和示例
在编程和建模语言中,函数是一段独立的、可重复使用的代码块,用于执行特定任务。在MindOpt APL中,自定义函数的使用非常重要,因为它们提高了建模过程的效率、可读性和灵活性。
|
达摩院 数据格式 索引
「达摩院MindOpt APL 建模语言」语法说明 print 将结果写表格文件
不同的编程语言写入表格文件的方式均不相同,下面将展示MindOpt APL建模语言的方式。
|
7月前
|
人工智能 算法 决策智能
MindOpt云上建模求解平台功能的简单介绍
MindOpt云上建模求解平台是阿里巴巴达摩院研发的一款“优化领域”的云平台。它结合了最新的算法研究和云技术,为用户提供了一个易于使用的界面和强大的后台计算能力。该平台支持广泛的优化问题,包括线性规划、整数规划、非线性规划和混合整数规划等。
MindOpt V1.0优化种植计划问题,新的建模方法
种植计划是指农业生产中针对不同农作物的种植时间、面积和种植方式等方面的规划安排。根据具体情况进行合理的规划和安排,以实现农作物的高产、优质和可持续发展。
MindOpt V1.0优化种植计划问题,新的建模方法
|
7月前
|
达摩院 自然语言处理 Java
MindOpt APL:一款适合优化问题数学建模的编程语言
本文将以阿里达摩院研发的MindOpt建模语言(MindOpt Algebra Programming Language, MindOptAPL,简称为MAPL)来讲解。MAPL是一种高效且通用的代数建模语言,当前主要用于数学规划问题的建模,并支持调用多种求解器求解。