MindOpt APL:一款适合优化问题数学建模的编程语言

news2024/11/26 8:18:41

什么是建模语言

建模语言是一种描述信息或模型的编程语言,在运筹优化领域,一般是指代数建模语言。
比如要写一个线性规划问题的建模和求解,可以采用C、Python、Java等通用编程语言来实现计算机编程(码代码),也可以换采用建模语言。
本文将以阿里达摩院研发的MindOpt建模语言(MindOpt Algebra Programming Language, MindOptAPL,简称为MAPL)来讲解。MAPL是一种高效且通用的代数建模语言,当前主要用于数学规划问题的建模,并支持调用多种求解器求解。

代数建模语言工作原理

在数学规划领域,遇到一个实际问题时候,我们需要数学建模成优化问题模型、然后编程、然后计算优化结果,得到这个实际问题的解决方案。
在这个编程过程中,可以根据选用的计算工具——优化求解器提供的通用编程语言的API来编写代码,也可以采用建模语言来编写代码。如下示例,就是一个利用MAPL建模语言来进行一个优化问题码的代码。
image.png

  • 左边是数学模型,三要素:两个变量xa和xb,目标函数是最大化一个公式,约束是最下面两行,限定取值关系。
  • 中间是用MAPL建模语言编的代码。可以看到前面4行就表达清楚了左边的数学公式。最后“option solver mindopt;”是设置计算这个问题的求解器为mindopt求解器,“solve;”是执行求解。
  • 右边就是求解器的计算结果,xa = 3,xb=5,此时目标函数最大,是1050。

为什么要用建模语言

语法更简单(代码对比)

从上面我们可以看到建模语言可以方便地进行数学建模和求解的代码。这里我们对比一下建模语言和通用的编程语言,来看看用建模语言优势。
以下面这个问题为示例:

| 线性规划模型:
max x0 + 2 * x1 + 3 * x2 + x3
s.t. (-1) * x0 + x1 + 3 * x2 + 10 * x3 <= 20
x0 - 3 * x1 + x2 = 30
x1 - 3.5 * x3 = 0
0 ≤ x0 ≤ 40
0 ≤ x1
0 ≤ x2
2 ≤ x3 ≤ 3

我们使用 MindOpt APL 建模语言 和 MindOpt 求解器的 Python APIs,分别对上面的线性规划模型建模,并求解模型。

MAPL代码:

clear model;  #清除model,多次run的时候使用
option modelname test; #运行完代码之后会自动生成.nl和.sol文件  model是存放的地址,test是文件名

#--------------------------
# twoTask.mapl
var x0 >= 0;   # 声明决策变量xa |
var x1 >= 0;
var x2 >= 0;
var x3 >= 2;
maximize Reward: x0 + 2 * x1 + 3 * x2 + x3;  # 声明目标函数
subto c1: (-1) * x0 + x1 + 3 * x2 + 10 * x3 <= 20;       # 声明约束
subto c2: x0 - 3 * x1 + x2 <= 30;
subto c3: x1 - 3.5 * x3 == 0;
subto c4: x0 <= 40;
subto c5: x3 <= 3;
#--------------------------


option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
solve;         # 求解

print "-----------------Display---------------";
display;        # 展示结果
print "目标函数值 = ",x0 + 2 * x1 + 3 * x2 + x3;

Python代码:

from mindoptpy import *

if __name__ == "__main__":

    # Step 1. Create model.
    model = Model("test")

    try:
        # Step 2. Input model.
        # Change to minimization problem.
        model.ModelSense = MDO.MAXIMIZE

        # Add variables.
        x = []
        x.append(model.addVar(0.0,         40.0, 1.0, 'C', "x0"))
        x.append(model.addVar(0.0, float('inf'), 2.0, 'C', "x1"))
        x.append(model.addVar(0.0, float('inf'), 3.0, 'C', "x2"))
        x.append(model.addVar(2.0,          3.0, 1.0, 'C', "x3"))

        # Add constraints.
        model.addConstr(- 1.0 * x[0] + 1.0 * x[1] + 3.0 * x[2] + 10.0 * x[3] <= 20, "c1")
        model.addConstr(1.0 * x[0]              - 3.0 * x[1] + x[2] <= 30, "c2")
        model.addConstr(1.0 * x[1]              - 3.5 * x[3] == 0, "c3")
      

        # Step 3. Solve the problem and populate optimization result.
        model.optimize()

        if model.status == MDO.OPTIMAL:
            print(f"Optimal objective value is: {model.objval}")
            print("Decision variables: ")
            for v in x:
                print(f"x[{v.VarName}] = {v.X}")
        else:
            print("No feasible solution.")
    except MindoptError as e:
        print("Received Mindopt exception.")
        print(" - Code          : {}".format(e.errno))
        print(" - Reason        : {}".format(e.message))
    except Exception as e:
        print("Received other exception.")
        print(" - Reason        : {}".format(e))
    finally:
        # Step 4. Free the model.
        model.dispose()

从上面的例子可以看到,MAPL建模语言比较简洁,没有Python运行这么多复杂的创建、添加、异常捕捉和释放的过程,就聚焦在编个模型去求解计算,更易于理解和添加。上面的例子还只是线性规划,对于非线性规划的问题,Python的API会更复杂。而采用MAPL建模语言只需要表达清楚数学公式,对于调试模型修改更方便。

支持多种求解器,换求解器的时候不用重复编程

很多人选择建模语言,最大的原因是希望切换求解器方案。因为不同品牌的求解器的求解能力不一样,遇到一个问题数学模型调整了一行公式,可能之前选择的求解器就不支持了,需要更换求解器。
此时如果选择用各家求解器的API来编程,换一个求解器,就需要重新学习对应的API,重新码代码,维护起来困难。虽然业界也有通用的 .mps 和 .nl 的优化问题数据格式,但是熟悉不同求解器的调用数据计算的方法也很耗时,或者装对应的软件也很麻烦。这个时候,建模语言的优势就很大。

比如下面是MAPL代码中,只需要换一行,就能换求解器进行计算:

option solver highs;     # 更换求解器

更多MAPL支持的求解器,可以参考上一个博客MindOpt APL,可以支持调用几十种求解器的建模语言

建模语言也支持通用编程语言的API,如Python

有很多同学喜欢Python语言,更希望用Python编程。MAPL建模语言支持Python来调用,import maplpy后就用Python的方式来编代码,能继续享受一行代码换求解器的优良属性。可一看广告流量分配:曝光和转化均衡案例中的代码对比。

常见的建模语言

市面上的建模语言有很多个,需要看各家求解器支持的建模语言,比如MindOpt求解器支持如下4种建模语言:MAPL(MindOpt APL)、AMPL、Pyomo、PuLP。
image.png
其中MindOpt APL(MAPL)就是阿里达摩院自研的建模语言,是目前中国唯一一款代数建模语言。其他建模语言的描述大家可以点击上面的链接查看:https://opt.aliyun.com/platform/docs/htmldoc/solver

MAPL的优点

MAPL国内第一款拥有自主知识产权,完全自研的国产建模语言,提供了丰富文档学习以及案例参考。并且在电力SCUC等领域问题上建模性能优秀,对标或超越已有产品。对比AMPL等建模语言,部分语法上更灵活简单,后续也会支持向量化建模等特色能力,提升建模易用性等。

灵活性:

MAPL具有非常高的灵活性,可以用来建模和求解各种类型的优化问题,包括线性规划、整数规划、非线性规划等。它支持多种数学表达式和运算符,可以方便地表示复杂的数学关系和约束条件。如下是它支持数值计算。
在这里插入图片描述

易用性

MAPL建模语言采用了类似于自然语言的语法和结构,使得用户可以很容易地理解和编写优化模型。并且支持读写csv文件,使得数据的读取和写入变得容易,数据储存也很方便。
如下将结果print输出为csv表格:
image.png

更多选择

MAPL与MindOpt Studio平台集成,可以在线上环境使用,无需下载,并且支持调用多种求解器,可直接对比结果。还支持将输出mps文件,可以在不同的计算环境和操作系统之间进行导入和导出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1296533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript常用技巧专题一

文章目录 一、前言二、生成随机颜色的两种方式2.1、生成RandomHexColor2.2、生成随机RGBA 三、复制内容到剪贴板的两种方式3.1、方式13.2、方式2 四、获取URL中的查询参数五、打乱数组六、深拷贝一个对象七、确保元素在可见区域内八、获取当前选中的文本九、浏览器cookie9.1、获…

深入了解数据库锁:类型、应用和最佳实践

目录 1. 引言 2. 数据库锁的基本概念 2.1 悲观锁和乐观锁 2.2 排他锁和共享锁 3. 悲观锁的应用场景 3.1 长事务和大事务 3.2 并发修改 3.3 数据库死锁 4. 悲观锁的最佳实践 4.1 精细控制锁的粒度 4.2 避免死锁 4.3 考虑乐观锁 5. 案例分析 5.1 银行系统的转账操作…

搭乘“低代码”快车,引领食品行业数字化转型全新升级

数字化技术作为重塑传统行业重要的力量&#xff0c;正以不可逆转的趋势改变着企业经营与客户消费的方式。 在近些年的企业数字化服务与交流过程中&#xff0c;织信团队切实感受到大多数企业经营者们从怀疑到犹豫再到焦虑最终转为坚定的态度转变。 在这场数字化转型的竞赛中&a…

Could not resolve all dependencies for configuration ‘:app:androidApis‘.

android studio出现Could not resolve all dependencies for configuration ‘:app:androidApis’. 试过很多种方法&#xff0c;但是都不好使&#xff0c;不管怎么样都是提示如下报错&#xff1a; Using insecure protocols with repositories, without explicit opt-in, is un…

Unity中Batching优化的GPU实例化整理总结

文章目录 前言一、GPU Instancing的支持1、硬件支持2、Shader支持3、脚本支持 二、我们来顺着理一下GPU实例化的使用步骤1、GPU实例化前的C#代码准备2、在 appdata 和 v2f 中定义GPU实例化ID3、在顶点着色 和 片元着色器 设置GPU Instance ID&#xff0c;使实例化对象顶点位置正…

RK3588平台开发系列讲解(hardware)reference-ril源码分析

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、reference-ril目录介绍二、支持的功能三、Android RIL 框架沉淀、分享、成长,让自己和他人都能有所收获!😄 一、reference-ril目录介绍 目录:3588-android12/hardware/ril/reference-ril

做数据分析为何要学统计学(5)——什么问题适合使用t检验?

t检验&#xff08;Students t test&#xff09;&#xff0c;主要依靠总体正态分布的小样本&#xff08;例如n < 30&#xff09;对总体均值水平进行差异性判断。 t检验要求样本不能超过两组&#xff0c;且每组样本总体服从正态分布&#xff08;对于三组以上样本的&#xff0…

降维技术——PCA、LCA 和 SVD

一、说明 降维在数据分析和机器学习中发挥着关键作用&#xff0c;为高维数据集带来的挑战提供了战略解决方案。随着数据集规模和复杂性的增长&#xff0c;特征或维度的数量通常变得难以处理&#xff0c;导致计算需求增加、潜在的过度拟合和模型可解释性降低。降维技术通过捕获数…

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util当中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加载这个log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

麒麟系统系统添加路由

系统添加路由 一、路由的解释&#xff1a; 路由工作在OSI参考模型第三层——网络层的数据包转发设备&#xff08;TCP/IP&#xff09;路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址&#xff0c;并且重写链路层数据包头实现转发数据…

response应用及重定向和request转发

请求和转发&#xff1a; response说明一、response文件下载二、response验证码实现1.前置知识&#xff1a;2.具体实现&#xff1a;3.知识总结 三、response重定向四、request转发五、重定向和转发的区别 response说明 response是指HttpServletResponse,该响应有很多的应用&…

探索人工智能领域——每日20个名词详解【day12】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

如何将腾讯混元大模型AI接入自己的项目里(中国版本ChatGPT)

如何将腾讯混元大模型AI接入自己的项目里 一、腾讯混元大模型API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、腾讯混元大模型API 基于腾讯混元大模型AI的智能文本对话AI机器人…

MBD Introduction

介绍 MATLAB是MathWorks公司的商业数学软件&#xff0c;应用于科学计算、可视化以及交互式程序设计等高科技计算环境。Simulink是MATLAB中的一种可视化仿真工具。 Simulink是一个模块图环境&#xff0c;用于多域仿真以及基于模型的设计。它支持系统设计、仿真、自动代码生成以…

nodejs微信小程序+python+PHP的游戏测评网站设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

【开发问题】vue的前端和java的后台,用sm4,实现前台加密,后台解密

sm4加密 vue引入的包代码加密解密 javamaven代码运行结果 vue 引入的包 npm install sm-crypto代码加密解密 加密&#xff1a; key &#xff1a;代表着密钥&#xff0c;必须是16 字节的十六进制密钥 password &#xff1a;加密前的密码 sm4Password &#xff1a;代表sm4加密…

认知觉醒(六)

认知觉醒(六) 第二节 感性&#xff1a;顶级的成长竟然是“凭感觉” 人类生存于世&#xff0c;比拼的是脑力思维&#xff0c;但极少有人知道&#xff0c;我们的身体里还有一个更高级的系统&#xff0c;若能善用&#xff0c;成就非凡。 1941年&#xff0c;德军对英国本土进行…

C语言WFC实现绘制贝塞尔曲线的函数

前言&#xff1a; 贝塞尔曲线于 1962 年&#xff0c;由法国工程师皮埃尔贝济埃&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计,贝塞尔曲线最初由保尔德卡斯特里奥于1959年运用德卡斯特里奥算法开发&#xff0c;以稳定数值…

【力扣热题100】287. 寻找重复数(弗洛伊德的乌龟和兔子方法)

【力扣热题100】287. 寻找重复数 写在最前面理解解决 "寻找重复数" 问题的算法问题描述弗洛伊德的乌龟和兔子方法为什么这个方法有效&#xff1f; 代码复杂度 总结回顾 写在最前面 刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/find-the-duplicate-…