了解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

结语

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

相关文章
|
6天前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
73 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
6天前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
147 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
6天前
|
供应链 Kubernetes 虚拟化
深入了解MindOpt优化求解器的License服务
在商业和研究领域,高效的数学优化求解器是解决复杂问题的关键工具。MindOpt求解器以其卓越的性能和广泛的应用场景成为众多专业人士的首选。但在享受其强大功能的同时,了解和选择合适的License服务是至关重要的。本篇博客将详细介绍MindOpt优化求解器的Licence服务。
|
6天前
|
机器学习/深度学习 达摩院
阿里达摩院MindOpt优化求解器-月刊(2024年4月)
【摘要】2024.04.30,阿里云发布了MindOpt优化求解器的新商品和功能。MindOpt现在已上架,提供超低价零售求解器,支持按需购买,可在阿里云平台上直接购买联网或不联网License。新版本V1.2发布,提升MILP性能,并增加PostScaling参数。此外,MindOpt Studio推出租户定制版,正处于邀测阶段。同时分享了使用MindOpt解决二分类SVM问题的案例。更多内容,可访问相关链接。
50 0
|
6天前
|
达摩院 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年2月)
新增2个整数规划的应用案例《人员排班:小美的春节相亲大计划》和《组合优化问题:装箱问题》。B站的视频专题已有9篇讲解如何用数学规划去解决生活和工作中的问题,包含如何建立数学模型、编代码、运行代码和结果理解。使用了达摩院 MindOpt 的建模语言和云平台,可复制项目跟随视频练习。还可参与活动领奖品!
98 1
|
6天前
|
达摩院 API C#
阿里达摩院MindOpt优化求解器-月刊(2024年1月)
MindOpt优化求解器 V1.1.0 发布,LP和MILP性能提升,新增C# API等多功能,详解如何使用这些新功能。新增旅行商TSP问题案例,假期如何旅游省路费, 主交通费¥900 内,就可跨5省游10城!TSP问题中MTZ消除子环的方法详解。公众号博文《四年求一解,一群达摩院数学家的极限挑战》讲解MindOpt团队成员的成长故事。
93 0
阿里达摩院MindOpt优化求解器-月刊(2024年1月)
|
6天前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
6天前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
6天前
|
存储 达摩院 调度
「达摩院MindOpt」优化FlowShop流水线作业排班问题
在企业在面临大量多样化的生产任务时,如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。
「达摩院MindOpt」优化FlowShop流水线作业排班问题
|
10月前
|
达摩院 调度
使用达摩院MindOpt优化交通调度_最大化通行量—线性规划问题
在数学规划中,网络流问题是指一类基于网络模型的流量分配问题。网络流问题的目标是在网络中分配资源,使得网络的流量满足一定的限制条件,并且使得某些目标函数最小或最大化。网络流问题通常涉及一个有向图,图中每个节点表示一个资源,每条边表示资源之间的关系。边上有一个容量值,表示该边上最多可以流动的资源数量。流量从源节点开始流出,经过一系列中间节点,最终到达汇节点。在这个过程中,需要遵守一定的流量守恒和容量限制条件。