了解MindOpt优化求解器的各种调用方式、方法

简介: Mindopt是一款高性能优化求解器,专为求解大规模数学规划问题,当前支持线性规划 (LP) 、混合整数线性规划 (MILP) 、非线性规划(QP、SDP)。其强大的算法旨在有效地找到符合规规则约束、目标值最优的最佳解决方案,使其成为运筹学必学工具,广泛用在电商互联网、金融、电力能源、工业制造、交通物流等领域。

优化求解器介绍

Mindopt是一款高性能优化求解器,专为求解大规模数学规划问题,当前支持线性规划 (LP) 、混合整数线性规划 (MILP) 、非线性规划(QP、SDP)。其强大的算法旨在有效地找到符合规规则约束、目标值最优的最佳解决方案,使其成为运筹学必学工具,广泛用在电商互联网、金融、电力能源、工业制造、交通物流等领域。

MindOpt的调用方式

优化求解器通常可以通过多种方式调用,具体取决于求解器的接口。以下是调用MindOpt的方法:

  1. 编程语言接口:MindOpt提供了编程语言接口,可以直接在编程语言中调用求解器。接口支持的语言包括: Python、Java、C/C++、C#
  2. 建模语言:像AMPL, Pyomo,PuLP,JuMP, MindOpt APL(MAPL)等这样的建模语言支持直接构建优化模型,并且可以在后台调用不同的求解器,MAPL可以一行代码直接切换不同求解器。
  3. 命令行工具:可以通过命令行工具调用,这意味着可以在终端或脚本中直接运行求解器命令。
  4. Web服务:支持通过网页访问,免下载(云上建模求解平台
  5. 直接将模型文件传递给求解器:能够读取特定格式的文件,比如MPS, LP,NL格式等。可以构建一个模型文件,然后直接传递给求解器。

在这些调用方式中,通常建模语言与编程语言是最最常见的。编程语言通常需要编写更多的代码来定义问题的数学模型,编写复杂的逻辑、数据处理、循环的方式更灵活,并且对优化工程的控制更精细,如设置参数、启发式、分支定界策略等等。

建模语言专门为构建和求解优化模型设计,它们提供了高层次的语法,以直观的方式定义模型,代码编写相对比较简洁,并且能够与多个后端求解器兼容,模型也更易于阅读和维护。

下面将展示编程与建模语言的调用方法。

调用方法

当前MindOpt优化求解器的最新版本为V1.1.1,可以支持将上述编程语言的数据文件在终端中用命令行的模式直接求解不需要打开各种编译器。下面将展示C#的调用方法,以及达摩院研发的代数建模语言MAPL的使用。

编程语言

使用C#的编程语言调用我们需要下载一个.NET SDK,版本为6.0~8.0,命令行模式调用求解方法如下:

cd <MDOHOME>\<VERSION>\examples\csharp
copy ReadMps.cs csproject
cd csproject
dotnet build
dotnet run ..\..\data\afiro.mps --framework netcoreapp7.0

调用 MindOpt C# API 读取优化问题模型文件并进行求解的示例如下:

using Mindopt;
namespace Example
{
    public class ReadMps
    {
        public static void Main(string[] args)
        {
            if (args.Length != 1)
                return;
            /*------------------------------------------------------------------*/
            /* Step 1. Create a model and change the parameters.                */
            /*------------------------------------------------------------------*/
            /* Create an empty model. */
            MDOEnv env = new MDOEnv();
            MDOModel? model = null;
            try
            {
                /*--------------------------------------------------------------*/
                /* Step 2. Input model.                                         */
                /*--------------------------------------------------------------*/
                /* Read model from file. */
                model = new MDOModel(env, args[0]);
                /*--------------------------------------------------------------*/
                /* Step 3. Solve the problem and print the result.              */
                /*--------------------------------------------------------------*/
                /* Solve the problem. */
                model.Optimize();
                /* Print the result. */
                Console.WriteLine($"Obj value: {model.Get(MDO.DoubleAttr.ObjVal)}");
            }
            catch (MDOException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                /* Dispose of model and environment */
                if (model != null) model.Dispose();
                env.Dispose();
            }
        }
    }
}

其他编程语言调用方法示例:PythonC语言C++Java

建模语言

MindOpt APL(MAPL)建模求解示例:

clear model;#清除model,多次run的时候使用
option modelname model/diet; #方便与方法2的中间文件生成在同一个目录
print "-----------------建模---------------";
#--------------------------
# diet.mapl
# 该例子由《AMPL: A Modeling Language for Mathematical 
# Programming》第二章的diet例子改编而来
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"  |  0,    40,   35,    10 |
|"MCH"  |  15,   35,   0,     15 |
|"MTL"  |  70,   30,   15,    0  |
|"SPG"  |  0,    50,   25,    15 |
|"TUR"  |  60,   0,    15,    0  |; 
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} 
   data2[i, "n_min"] <= sum {j in FOOD}: amt[j, i] * x[j] <= data2[i, "n_max"];
#------------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
solve;         # 求解
print "-----------------Display---------------";
display;        # 展示结果
print "最低价格是:";
print  sum {<j> in FOOD} data1[j, "cost"] * x[j];

其他建模语言调用方法:AMPLPyomoPuLPJuMP

结语

在实践中,选择哪一种方式取决于具体任务、开发者的专业背景以及项目需要。如果需要开发具有复杂业务逻辑或数据处理要求的应用程序,比较推荐编程语言调用。如果焦点是在快速开发和测试优化模型,或者需要在多个求解器之间轻松切换,推荐使用建模语言。

相关文章
|
2月前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
70 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
3月前
|
达摩院 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年2月)
新增2个整数规划的应用案例《人员排班:小美的春节相亲大计划》和《组合优化问题:装箱问题》。B站的视频专题已有9篇讲解如何用数学规划去解决生活和工作中的问题,包含如何建立数学模型、编代码、运行代码和结果理解。使用了达摩院 MindOpt 的建模语言和云平台,可复制项目跟随视频练习。还可参与活动领奖品!
94 1
|
4月前
|
达摩院 API C#
阿里达摩院MindOpt优化求解器-月刊(2024年1月)
MindOpt优化求解器 V1.1.0 发布,LP和MILP性能提升,新增C# API等多功能,详解如何使用这些新功能。新增旅行商TSP问题案例,假期如何旅游省路费, 主交通费¥900 内,就可跨5省游10城!TSP问题中MTZ消除子环的方法详解。公众号博文《四年求一解,一群达摩院数学家的极限挑战》讲解MindOpt团队成员的成长故事。
88 0
阿里达摩院MindOpt优化求解器-月刊(2024年1月)
|
5月前
|
人工智能 达摩院 调度
阿里达摩院MindOpt优化求解器-月刊(2023年12月)
MindOpt上新工业相关新案例:FlowShop流水线作业怎么排生产最快?一维长度或容量如何切割省原料?并且首次公开达摩院”绿色能源AI“专题信息,MindOpt求解器获得工信部国产求解器第一、MindOpt Studio的AI+优化双决策引擎助力选手赢得南网电力调度AI大赛,更多细节方案信息已公开。四年的坚持,mindOpt的成长和成功的故事值得您关注。
78 5
|
5月前
|
达摩院 算法 API
阿里达摩院MindOpt优化求解器-月刊(2023年11月)
MindOpt上线新功能:求解器V1.0.1升级,MILP性能进一步提升;商业化期的License免费额度已上线一版;建模语言MAPL专题页上线,V2.3版本新增写mps文件。算法小白同学可看博文《什么是优化技术》快速入门。
123 2
|
6月前
|
API Python
MindOpt V1.0优化种植计划问题,新的建模方法
种植计划是指农业生产中针对不同农作物的种植时间、面积和种植方式等方面的规划安排。根据具体情况进行合理的规划和安排,以实现农作物的高产、优质和可持续发展。
MindOpt V1.0优化种植计划问题,新的建模方法
|
7月前
|
人工智能 达摩院 自然语言处理
阿里达摩院MindOpt优化求解器-月刊(2023年10月)
MindOpt上线新功能:AI工程师 MindOpt Copilot,结合了大模型技术和运筹学技术,用户可通过自然语言和表格数据聊天,机器人会自动数学建模、码MAPL代码、计算。MindOpt 求解器V1.0开放下载,自研底层数值代数库,全新API,各方面性能大幅提升!
86 2
|
8月前
|
机器学习/深度学习 人工智能 达摩院
阿里达摩院MindOpt优化求解器-月刊(2023年9月)
阿里达摩院MindOpt上线国际站,MindOpt Tuner调参器升级V1.0发布。新增基于AI大模型生成的案例,目标中含有绝对值的建模转换技巧。MindOpt Studio平台支持南方电网的第五届电力调度AI应用大赛。
242 1
|
9月前
|
达摩院 算法 API
阿里达摩院MindOpt优化求解器-月刊(2023年8月)
阿里达摩院MindOpt新功能上线,求解器V0.25.1和建模语言V2.1。新增多目标规划问题的处理,如何转单目标。英文版本的案例看国际站。
138 1
阿里达摩院MindOpt优化求解器-月刊(2023年8月)
|
10月前
|
达摩院 算法 API
阿里达摩院MindOpt优化求解器-月刊(2023年7月)
阿里达摩院MindOpt优化求解器-7月刊,新增人员排班、仓库选址优化的案例,包含源代码,新版本MindOpt求解器V1.0的API重大升级,邀请内测。
211 0
阿里达摩院MindOpt优化求解器-月刊(2023年7月)