介绍
MindOpt APL(简称MAPL)是阿里巴巴达摩院决策智能实验室研发的国内第一款拥有自主知识产权,完全自研的国产建模语言,在电力SCUC等领域问题上建模性能优秀,对标或超越已有产品,对比AMPL等建模语言,部分语法上更灵活简单,并且与Mindopt Studio平台集成,可云上使用。
版本更新内容
目前mapl已经发布2.4版本,主要更新内容如下:
- 新增:支持向量化建模与法
- 新增:Linux用户可pip install安装到自己电脑,支持命令行和PythonAPI
- 变更:在 print /display 符号/结果时,索引数组的显示由X@调整为X[i,j]
- 重构内核、增强语法错误提示功能
- 写mps指令改善,直接mindopt求解mps的结果支持读入和展示
下文将介绍MAPL 2.4版本中的向量化建模功能和安装、使用MAPL的方法
向量化建模
向量化建模是一种高效的数学建模方法,在机器学习、信号处理、经济建模和物理科学等多个领域都有比较广泛的应用。其主要的特点是通过向量,矩阵等数据结构来形式化问题,而后借助线性代数的相关理论技术来实现对问题的转换,分析,计算,优化等任务。
一般来说,向量化建模方法有以下几个主要特点,使得其适合于解决很大一类实际问题。
- 表述优势:很多实际数学问题都具有良好的向量化形式或背景,对于这些问题,向量化建模方法一方面能够避免手动的形式化转换,简化建模成本,另一方面,很多复杂问题在通过矩阵和向量表示后,形式上会更简洁及紧凑,更易于理解和实现,也有利于揭示及利用问题的潜在结构。
- 操作优势:向量和矩阵运算为数据转换和操作提供了统一且灵活的框架,这种一致性为使用线性代数等基础数学理论及数学操作来转换,分析,优化模型成为可能。另一方面,很多强依赖向量/矩阵运算的实际任务,如数据预处理、特征提取和模式识别等任务也能变得更加直接。
- 计算性能:向量式建模通常具备显式问题结构,底层算法通过有效利用这些结构,可以实现建模及求解性能的显著提升。另一方面,很多基础的线性代数数值操作受益于现代计算库和GPU等硬件加速工具,也能够实现大量数据的快速并行处理。这些特性都可以显著的帮助大规模问题的计算及分析。
- 可扩展性:很多向量式建模易于扩展,可以无缝地从小规模数据集过渡到大规模数据集,模型和算法不需要进行根本性的修改。
MAPL从V2.4版本开始,支持向量化的问题建模及求解。
一个示例(可复制代码在云上平台中运行查看结果):
#################################################### # # Vectorization Modeling Example # Standard Simplex Projection # #################################################### # 1. 生成一个随机的50维向量常量 d = 50; param a = random(shape=(d,1),seed=1234); # 2. 建模标准单纯形投影问题 var x(d) >= 0; minimize sum((x - a)^2); s.t. sum(x) = 1; # 3. 调用开源求解器Ipopt求解 option solver ipopt; solve; # 4. 输出最优投影向量x,以及对应的投影距离 print x; param minDist = sum((x - a)^2); print "Min distance: {:.2f}" % minDist;
安装、使用MAPL
渠道1:在MindOpt云平台使用后Docker打包下载
在云上建模求解平台的notebook环境中选择mapl内核对自己的问题进行建模求解,然后通过docker打包编译的方式下载到本地,可在用于不联网环境部署。
渠道2:pip install
Step 1:安装maplpy
包
当前Linux用户可以通过如下方式来安装maplpy
包:
# x86 Linux用户,Python 3.6-3.10 pip install maplpy
Step 2:查询maplpy
包的能力
安装完成后,我们可以通过mapl
、python
指令来查看它的能力
mapl
查询命令行工具能力
- 检查MindOpt APL的版本
- MAPL的部分语法展示
- 命令行运行数据文件命令
图:命令行使用示例
python
查询maplpy的Python包的能力
- python版本查询
- python调用maplpy的部分语法展示
图:python包使用示例
Step 3:下载求解器,调用求解器求解
如果需要求解,则需要单独安装求解器,且MindOpt APL 可以支持调用多种求解器,如:
- MindOpt 求解器,可在链接下载和安装。正常安装后将根据MINDOPT_HOME环境变量自动去调用。
- 开源求解器,可以下载此安装包文件,或者根据文档的链接去下载最新版本。
- 下载后,每次运行求解时候,需要用
option solverpath xxfoldername;
指令来定义求解器的地址。
# 假设CBC求解器的可执行文件位于目录usr/bin/cbc下,你可以这样设置: option solverpath "/usr/bin/cbc";
Step 4:执行指令示例
安装后使用示例:
示例代码文件:📎maplpy_case.zip
# 同MindOpt Studio平台的IDE中的用法,包含建模和求解等指令 mapl -f diet.mapl # 直接运行建模脚本,自动调用求解器去求解,部分情况下会更高效快速 mapl -m diet.mpl # Python API 运行 python mapl_diet.py
diet.mapl
文件源码如下:
# 声明集合 # # ZIMPL diet.mod and diet.dat clear; set NUTR := { "A", "B1", "B2", "C" }; set FOOD := {"BEEF", "CHK", "FISH", "HAM", "MCH", "MTL", "SPG", "TUR"} ; set F:= {"cost", "f_min", "f_max"}; set N:= {"n_min", "n_max"}; # 声明参数 param data1[FOOD * F] := | "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 data2[NUTR * N] := | "n_min", "n_max"| |"A" | 700, 10000 | |"C" | 700, 10000 | |"B1" | 700, 10000 | |"B2" | 700, 10000 |; param amt[FOOD * NUTR] := | "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 |; # 声明变量 var x[j in FOOD] >= data1[j, "f_min"] <= data1[j, "f_max"]; # 声明目标 minimize Total_Cost: sum {j in FOOD} : data1[j, "cost"] * x[j]; # 声明约束 subto Diet: forall {i in NUTR} do data2[i, "n_min"] <= sum {j in FOOD}: amt[j, i] * x[j] <= data2[i, "n_max"]; option modelname diet; option solverpath <MINDOPT_BINARY_DIR>; option solver mindopt; option mindopt_options 'num_threads=2'; solve; display;