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

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

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


一、AMPL基本信息

AMPL全称为A Mathematical Programming Language,是一种描述并求解大规模复杂数学问题的代数建模语言软件。


AMPL解决数学规划问题的流程如下:

  1. 准备模型文件(.mod)与数据文件(.dat)。
  2. 使用 AMPL 读取模型与数据进行建模。
  3. 选择链接上的求解器(如 MindOpt)进行求解。
  4. 获取求解结果。

image.png


二、AMPL基本语法

下面将介绍 AMPL 的一些基本使用方法,并以一个简单的例子进行说明。


AMLP的一些基本语法规则

  • 区分大小写
  • 以#开始的一行表示注释
  • 忽略空格
  • 每个语句以分号 ";" 结尾
  • :=表示赋值,=表示表达式中的等号 ,==表示判断


AMPL模型建立

AMPL用接近数学描述的语言把数学规划问题写成模型文件,以".mod"为扩展名,如 “example.mod”,然后将其中的参数写成数据文件,以“.dat”为扩展名,如 “example.dat”。


AMPL中建立一个完整的优化模型主要包含以下项:

(1)集合(set):

集合是描述变量和约束的基础,一般来说,优化表达式中的下标出自集合表示。集合可以在数据文件中进行赋值,对于比较简单的集合的定义也可以直接在模型文件中进行赋值。

声明集合的语法为:set [set name][set expression]


(2)参数(parameter):

参数是模型中需要被赋值的系数,其赋值一般在数据文件中给出,对于比较简单的参数,也可以在模型文件中直接给出。标量、向量或矩阵都可以成为参数的表达式。

参数的语法为:param [name]{index1, index2,...}{attributes}

其中 [name]是必有的,{index1}...是可选的,用来说明参数数据的大小或范围(可以使用集合来定义),{attributes}说明参数的属性,如可能的取值等等。


(3)变量(variable):

变量是优化模型求解需要求出的量,即决策变量。变量的声明与参数的声明类似。

变量的语法为:var [name]{index1, index2,...}{attributes}


(4)目标函数(objective):

线性规划的目标函数定义如下:

maximize [objective name]:sum{[index] in [index set]}[parameter]*[variable]+...

如果是最小化目标函数,将第maximize换成 minimize 即可。


(5)约束(constraint):

约束是优化问题需要满足的约束条件。

一般的线性约束的语法为:

subject to [constraints name] {index in index set}:sum{[index] in [index set]}

[parameter]*[variable]+...+{<=,>=,=}[parameter]


优化模型示例

以 MindOpt (https://solver.damo.alibaba-inc.com/doc/html/index.html) 中的 Diet问题 为例,Diet问题的目标是以最低的价格来配置一满足营养需求的食物组合,其 AMPL 模型(diet.mod)写为:

set NUTR; #set 声明集合

set FOOD;  


param cost {FOOD} > 0;  #param 声明参数

param f_min {FOOD} >= 0;

param f_max {j in FOOD} >= f_min[j];


param n_min {NUTR} >= 0;

param n_max {i in NUTR} >= n_min[i];


param amt {NUTR,FOOD} >= 0;


var Buy {j in FOOD} >= f_min[j], <= f_max[j];  #var 表明变量


minimize Total_Cost:  sum {j in FOOD} cost[j] * Buy[j]; #minimize表明最小目标函数


subject to Diet {i in NUTR}:   # subject to 表明约束

    n_min[i] <= sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i];


其对应的数据文件(diet.dat)如下:

set NUTR := A B1 B2 C ;

set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ;


param:   cost  f_min  f_max :=

 BEEF   3.19    0     100

 CHK    2.59    0     100

 FISH   2.29    0     100

 HAM    2.89    0     100

 MCH    1.89    0     100

 MTL    1.99    0     100

 SPG    1.99    0     100

 TUR    2.49    0     100 ;


param:   n_min  n_max :=

  A      700   10000

  C      700   10000

  B1     700   10000

  B2     700   10000 ;


param amt (tr):

          A    C   B1   B2 :=

  BEEF   60   20   10   15

  CHK     8    0   20   20

  FISH    8   10   15   10

  HAM    40   40   35   10

  MCH    15   35   15   15

  MTL    70   30   15   15

  SPG    25   50   25   15

  TUR    60   20   15   10 ;

三、运行AMPL

AMPL本身并不直接求解优化问题,它将模型转换成专门的 .nl 文件,其作用只是类似语言编译器。在读入模型文件和数据文件后调用其他能够求解各类数学规划问题的求解器(optimization solver)进行求解。AMPL支持大部分的求解器,包括MindOpt。


运行AMPL之前需要准备两个文件:

  • 模型文件:用 AMPL 语言编写问题的模型(model)文件,模型文件以".mod"为扩展名,例如我们在上一节中给出的示例。
  • 数据文件:优化模型中的集合和参数的具体取值可以放在模型文件中,也可以放在单独的数据文件,这样同一个抽象的优化模型可以适用不同的数据,数据文件以".dat"为扩展名。

此外,也可以编写一个包含按顺序执行求解的 AMPL 命令的批处理文件,以".run"为扩展名。

eample.run

如果没有批处理文件,也可以按照以下步骤在 AMPL 中以单个命令的方式输入:

model example.mod; #调用模型文件

data example.dat; #调用数据文件

option solver mindopt; #选择求解器

solve; #求解

四、支持的其他脚本语句

reset:清除已有的数据和模型

reset data:清除已有的数据

if...then...else:条件语句

and,or:逻辑与,逻辑或

let:赋值给参数或变量

for,repeat,while,until,break:用于循环语句


更多的关于 AMPL 建模工具的介绍请见:https://ampl.com/resources/the-ampl-book/

相关文章
|
7月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
算法 安全 机器人
Python语言如何使用MindOpt建模并求解二次规划问题
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。
Python语言如何使用MindOpt建模并求解二次规划问题
|
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是一种高效且通用的代数建模语言,当前主要用于数学规划问题的建模,并支持调用多种求解器求解。