MindOpt APL向量化建模语法的介绍与应用(1)

简介: 向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题

1. 简介

向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题

MindOpt APL (MindOpt Algebraic Programming Language, MAPL) 是一种高效且通用的代数建模语言,主要用于数学规划问题的建模,并支持调用多种求解器求解。它当前支持通用的线性、非线性、混合整数问题的建模。其语法贴近数学语言,与代数数学公式很接近,易学易写易读易维护。且MindOpt APL支持对接20+种优化求解器,可用一行命令就切换,大大提升了用户在优化问题求解环节的方案丰富度,降低风险和使用门槛。

那么MAPL是如何支持向量化建模的呢,让我们一起来看下文

2. MAPL中的向量化建模

MAPL通过对向量/矩阵常量参数与变量的声明以及运用张量常量表达式的计算、向量/矩阵变量表达式的计算对问题进行建模

本篇我们介绍述向量/矩阵常量参数的声明以及运用张量常量表达式的计算的语法

其中常量参数的声明有三种方式

  • 显式定义常量参数

声明一个m x n 的矩阵式常量:

param matrix_name = [A_11, ... , A_1n (n个实数) ;

              ... (m行)

                                A_n1, ... , A_mn (n个实数) ];

声明一个 1 x n 向量式常量:

param vector_name = [a_11, ... , a_1n (n个实数) ];

  • 使用MAPL的内置函数生成常量参数

param v = 内置函数名([param_list]);

  • 从表格式csv文件中读取矩阵形式的常量参数

param v = read_csv([file_name,] [param_list]);


张量常量表达式的数学运算符列表如下:

类型

操作符

说明

是否支持标量

用例

一元操作符

+

向量/矩阵加法

A+B

-

向量/矩阵减法,或者参数求反

A-B or -A

.*

逐元素乘法

A.*B

./

逐元素除法

A./B

*

向量/矩阵乘法

A*B

'

矩阵转置

A'

/

向量/矩阵逐元素除以某标量

A/2

二元操作符

.^

逐元素的p次幂

A.^2

^

逐元素的p次幂

A^2

索引操作符

[]

获取指定位置的值

A[3,5]

其中“支持标量”的操作符,不仅可以支持标量间或者张量间的常规计算,也能以某种方式实现标量与张量之间的混合计算,浏览文档查看

3. 语法示例

  1. 显式定义常量参数:通过列出所有元素的值来创建矩阵或向量。例如,声明一个 m×n 矩阵的语法是 param matrix_name = [A_11, ..., A_1n; ...; A_m1, ..., A_mn];,声明一个 1×m 向量的语法是 param vector_name = [a_1, ..., a_n];
  1. 获取参数属性:可以使用 .row.col 来获取矩阵/向量参数的行数和列数,例如获取矩阵X的大小。
param vec = [1,3,5,7,9,11];
print "Shape of vec: ({},{})." % vec.row, vec.col;
param A =[1,2,3;
4,5,6;
7,8,9];
print "Shape of A: ({},{})." % A.row, A.col;
Shape of vec: (1,6).
Shape of A: (3,3).
  1. 参数的索引:可通过行/列号对向量/矩阵中的元素进行索引,索引从0开始。例如,对于向量 vecvec[4]vec[0,4] 都指向向量的第五个元素;对于矩阵 AA[i-1,j-1] 指向矩阵的第i行第j列元素。
param A =[1,2,3;
4,5,6;
7,8,9];
#遍历输出所有大于等于5的项
for (i,j) in (1..A.row) * (1..A.col):
    if A[i-1,j-1] >= 5 then print "A[{},{}]={}"%i,j,A[i-1, j-1];
A[2,2]=5
A[2,3]=6
A[3,1]=7
A[3,2]=8
A[3,3]=9

  1. 使用内置函数生成常量参数:MAPL 提供了一些内置函数如 ones, zeros, identity, randomnormal 来快速生成特定类型的向量/矩阵常量。例如,ones(3,7) 创建一个3x7的全1矩阵,random(3,7) 创建一个满足[0,1]均匀分布的3x7随机矩阵。
clear model;
print "ones matrix: ones(3,7)";
param one = ones(3,7);
print one;
print "--------------";
print "zeros matrix: zeros(3,7)"; 
param zero = zeros(3,7);
print zero;
print "--------------";
print "identity matrix: identity(4,4)";
param E = identity(4,4);
print E;
print "--------------";
print "random matrix: random(shape=(3,7), seed=12345)";
param X = random(shape=(3,7), seed=123456);
print X;
print "--------------";
print "normal matrix, (mu,sigma)=(-10,10): normal(shape=(3,7), mu=-10, sigma=10, seed=12345);";
param Y = normal(shape=(3,7), mu=-10, sigma=10, seed=123456);
print Y;
ones matrix: ones(3,7)
[[1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1]]
--------------
zeros matrix: zeros(3,7)
[[0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]]
--------------
identity matrix: identity(4,4)
[[1, 0, 0, 0],
 [0, 1, 0, 0],
 [0, 0, 1, 0],
 [0, 0, 0, 1]]
--------------
random matrix: random(shape=(3,7), seed=12345)
[[0.51491, 0.89813, 0.70582, 0.77883, 0.93162, 0.62877, 0.33987],
 [0.21579, 0.11833, 0.08322, 0.38544, 0.96056, 0.94246, 0.35274],
 [0.17555, 0.15881, 0.95409, 0.14046, 0.03238, 0.84024, 0.81065]]
--------------
normal matrix, (mu,sigma)=(-10,10): normal(shape=(3,7), mu=-10, sigma=10, seed=12345);
[[ -0.47484,  -9.64320,  -0.25816,  -2.80899,  -8.15235,  -3.80674, -21.38680],
 [-16.41576,  -5.56788, -11.10240, -11.66778,  -4.98887, -13.55322, -13.37890],
 [ -4.19033,  -0.16199,  -9.42198,  -2.38052, -17.12964, -14.43160, -19.74602]]

  1. 从CSV文件中读取矩阵形式的常量参数:使用 read_csv 函数可以从CSV文件中读取数据并自动将其视为一个常量矩阵或向量。例如,param X := read_csv("iris.data", use_col="0,1,2,3", skip =1);会从iris.data文件中读取前四列数据作为矩阵X。然后可以查询矩阵的形状信息,并通过索引访问其中的元素。
X,X,X,X,Y
5.1,3.5,1.4,0.2,1
4.9,3.0,1.4,0.2,1
4.7,3.2,1.3,0.2,1
4.6,3.1,1.5,0.2,1
5.0,3.6,1.4,0.2,1
5.7,3.0,4.2,1.2,-1
5.7,2.9,4.2,1.3,-1
6.2,2.9,4.3,1.3,-1
5.1,2.5,3.0,1.1,-1
5.7,2.8,4.1,1.3,-1
param X:= read_csv("iris.data", use_col="0,1,2,3", skip =1);
param y:= read_csv("iris.data", use_col=4,skip =1);
print "Shape of X is: ({},{})." % X.row, X.col;
print "Shape of y is: ({},{})." % y.row, y.col;
print "X[0,0] is {:.1f}" % X[0, 0];
print "X[9,2]*y[5] is {:.1f}" % X[9, 2] * y[5];
Shape of X is: (10,4).
Shape of y is: (10,1).
X[0,0] is 5.1
X[9,2]*y[5] is -4.1

表达式的计算示例(向量及矩阵乘法)更多示例

param a = [1,2,3,4,5,6,7,8,9,10];
param b = [10,9,8,7,6,5,4,3,2,1];
print "a * b' is: ", a * b';
print "b'*a is:";
print b'*a;
a * b' is: 220
b'*a is:
[[ 10,  20,  30,  40,  50,  60,  70,  80,  90, 100],
 [  9,  18,  27,  36,  45,  54,  63,  72,  81,  90],
 [  8,  16,  24,  32,  40,  48,  56,  64,  72,  80],
 [  7,  14,  21,  28,  35,  42,  49,  56,  63,  70],
 [  6,  12,  18,  24,  30,  36,  42,  48,  54,  60],
 [  5,  10,  15,  20,  25,  30,  35,  40,  45,  50],
 [  4,   8,  12,  16,  20,  24,  28,  32,  36,  40],
 [  3,   6,   9,  12,  15,  18,  21,  24,  27,  30],
 [  2,   4,   6,   8,  10,  12,  14,  16,  18,  20],
 [  1,   2,   3,   4,   5,   6,   7,   8,   9,  10]]

4. 一个案例代码示例

线性支持向量机(Linear Support Vector Machine, SVM)是一种广泛应用于模式识别、分类以及回归问题的监督学习算法。SVM的核心思想是寻找一个最优的超平面,用以划分不同类别的数据点,同时最大化各类数据点到该超平面的最小间隔(margin)。

代码如下:

# 1.读取iris数据
param X:= read_csv("$data_path/iris.data", use_col="0,1,2,3");
param y:= read_csv("$data_path/iris.data", use_col=4);
param m = X.row;
param n = X.col;
# 2.LinearSVM问题建模
param rho = 0.2;
var w(n) >= -1 <= 1; # Bounded Model Parameter
var eps(m) >= 0;
minimize
w' * w + rho * sum(eps);
s.t.
eps >= 1 - X*w.*y;
# 3.调用开源求解器Ipopt求解
option solver ipopt;
solve;
# 4.验证并分析结果
param total_loss = rho * ones(1, m) * eps + w'*w;
param prec = 1/m * sum{i in 0..m-1} 
if (sum{j in 0..n-1} (w[j]*X[i, j])) * y[i] > 0 then 1 else 0 end;
print "(Objective, Precision): ({:.2f}, {:.1f})" % total_loss, prec;

结果查看可浏览文档,介绍更全面!

相关文章
|
3月前
|
达摩院 供应链 安全
光储荷经济性调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍使用MindOpt工具优化光储荷经济性调度的数学规划问题。光储荷经济性调度技术旨在最大化能源利用率和经济效益,应用场景包括分布式光伏微网、家庭能源管理系统、商业及工业用电、电力市场参与者等。文章详细阐述了如何通过数学规划方法解决虚拟电厂中的不确定性与多目标优化难题,并借助MindOpt云建模平台、MindOpt APL建模语言及MindOpt优化求解器实现问题建模与求解。最终案例展示了如何通过合理充放电策略减少37%的电费支出,实现经济与环保双重效益。读者可通过提供的链接获取完整源代码。
|
3月前
|
达摩院 BI 索引
切割问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文主要讲述了使用MindOpt工具对切割问题进行优化的过程与实践。切割问题是指从一维原材料(如木材、钢材等)中切割出特定长度的零件以满足不同需求,同时尽可能减少浪费的成本。文章通过实例详细介绍了如何使用MindOpt云上建模求解平台及其配套的MindOpt APL建模语言来解决此类问题,包括数学建模、代码实现、求解过程及结果分析等内容。此外,还讨论了一维切割问题的应用场景,并对其进行了扩展,探讨了更复杂的二维和三维切割问题。通过本文的学习,读者能够掌握利用MindOpt工具解决实际切割问题的方法和技术。
|
3月前
|
达摩院 算法 安全
智慧楼宇多目标调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了使用MindOpt工具优化智慧楼宇的多目标调度问题,特别是在虚拟电厂场景下的应用。智慧楼宇通过智能化技术综合考虑能耗、舒适度等多目标,实现楼宇设备的有效管理和调度。虚拟电厂作为多能源聚合体,能够参与电力市场,提供调峰、调频等辅助服务。文章介绍了如何使用MindOpt云上建模求解平台及MindOpt APL建模语言对楼宇多目标调度问题进行数学建模和求解,旨在通过优化储能设备的充放电操作来最小化用电成本、碳排放成本和功率变化成本,从而实现经济、环保和电网稳定的综合目标。最终结果显示,在使用储能设备的情况下,相比不使用储能设备的情形,成本节约达到了约48%。
|
3月前
|
达摩院 供应链 JavaScript
网络流问题--仓储物流调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文通过使用MindOpt工具优化仓储物流调度问题,旨在提高物流效率并降低成本。首先,通过考虑供需匹配、运输时间与距离、车辆容量、仓库储存能力等因素构建案例场景。接着,利用数学规划方法,包括线性规划和网络流问题,来建立模型。在网络流问题中,通过定义节点(资源)和边(资源间的关系),确保流量守恒和容量限制条件下找到最优解。文中还详细介绍了MindOpt Studio云建模平台和MindOpt APL建模语言的应用,并通过实例展示了如何声明集合、参数、变量、目标函数及约束条件,并最终解析了求解结果。通过这些步骤,实现了在满足各仓库需求的同时最小化运输成本的目标。
|
4月前
|
达摩院 安全 调度
网络流问题--交通调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了如何利用数学规划工具MindOpt解决交通调度问题。交通调度涉及网络流分析,考虑道路容量、车辆限制、路径选择等因素,以实现高效运行。通过建立数学模型,利用MindOpt云平台和建模语言MAPL,设定流量最大化目标并确保流量守恒,解决实际的调度问题。案例展示了如何分配车辆从起点到终点,同时满足道路容量约束。MindOpt Studio提供在线开发环境,支持模型构建和求解,帮助优化大规模交通调度。
|
4月前
|
达摩院
人员排班【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍了使用阿里巴巴达摩院的MindOpt工具解决人员排班的数学规划问题。人员排班在多个行业中至关重要,如制造业、医疗、餐饮和零售等。问题涉及多种约束,包括工作需求、员工能力、工作时间限制、连续工作天数及公平性。通过MindOpt云建模平台和建模语言MindOpt APL,建立数学模型并编写代码来解决最小化总上班班次的问题。案例中展示了如何声明集合、参数、变量和约束,并给出了部分代码示例。最后,通过MindOpt求解器得到最优解,并将结果输出到CSV文件中。
|
4月前
|
存储 达摩院 供应链
排产排程问题【数学规划的应用(含代码)】阿里达摩院MindOpt
**文章摘要:** 本文探讨了使用阿里巴巴达摩院的MindOpt优化求解器解决制造业中的排产排程问题。排产排程涉及物料流动、工序安排、设备调度等多个方面,通常通过数学规划方法建模。MindOpt支持线性规划、整数规划等,能有效处理大规模数据。案例以香皂制造工厂为例,考虑了多种油脂的购买、存储和生产计划,以及价格变化和存储成本。问题通过数学建模转化为MindOpt APL代码,求解器自动寻找最优解,以最大化利润。文章还提供了代码解析,展示了解决方案的细节,包括目标函数(利润最大化)、约束条件(如生产效率、库存管理)以及结果分析。
|
5月前
|
供应链 定位技术 数据库
仓库选址问题【数学规划的应用(含代码)】阿里达院MindOpt
使用阿里云MindOpt工具,文章展示了如何解决仓库选址的数学规划问题。该问题涉及构建工厂以供应多个商店,考虑因素包括建设成本、库存成本、运输成本和需求量。MindOpt是一个优化求解器,能处理大规模数据的数学规划问题。通过声明集合、参数、变量、目标函数和约束条件,构建模型并求解,以最小化总成本。文中还提到了不同行业的应用场景,如农业、制造业、零售业和电商,并提供了视频讲解和代码示例。
|
5月前
|
达摩院 供应链 调度
【FlowShop流水线作业排班问题【数学规划的应用(含代码)】阿里达摩院MindOpt】
本文探讨了使用阿里巴巴达摩院的MindOpt工具解决FlowShop流水线作业排班的数学规划问题。FlowShop涉及到多台机器、多个工序和多个作业,目标是通过优化排班最小化总生产耗时。MindOpt通过数学规划方法,如线性或混合整数线性规划,将问题建模并转化为代码,利用云建模平台MindOpt Studio和MindOpt APL建模语言进行求解。案例中详细介绍了参数定义、变量解析、约束设置和目标函数,展示了如何通过MindOpt进行建模和求解,以达到最优化的生产调度。此外,文章还提供了代码示例和结果解析,帮助读者理解如何实际应用MindOpt解决这类问题。
|
6月前
|
达摩院 Linux Docker
MindOpt APL 最新版本功能介绍,并且开放下载使用了!
MindOpt APL (MAPL) 是由阿里巴巴达摩院研发的国产建模语言,专长于电力SCUC等问题,提供向量化建模支持,可与Mindopt Studio平台集成。最新版2.4增加了向量化建模、Linux环境下通过pip安装支持以及改进了打印显示和错误提示。MAPL的向量化建模提高了效率,适合大规模问题。用户可通过云平台Docker打包或pip安装使用,支持多种求解器,包括MindOpt和开源求解器。