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

结语

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

相关文章
|
7月前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
125 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
7月前
|
供应链 Kubernetes 虚拟化
深入了解MindOpt优化求解器的License服务
在商业和研究领域,高效的数学优化求解器是解决复杂问题的关键工具。MindOpt求解器以其卓越的性能和广泛的应用场景成为众多专业人士的首选。但在享受其强大功能的同时,了解和选择合适的License服务是至关重要的。本篇博客将详细介绍MindOpt优化求解器的Licence服务。
|
7月前
|
机器学习/深度学习 达摩院
阿里达摩院MindOpt优化求解器-月刊(2024年4月)
【摘要】2024.04.30,阿里云发布了MindOpt优化求解器的新商品和功能。MindOpt现在已上架,提供超低价零售求解器,支持按需购买,可在阿里云平台上直接购买联网或不联网License。新版本V1.2发布,提升MILP性能,并增加PostScaling参数。此外,MindOpt Studio推出租户定制版,正处于邀测阶段。同时分享了使用MindOpt解决二分类SVM问题的案例。更多内容,可访问相关链接。
126 0
|
7月前
|
达摩院 IDE 开发工具
阿里达摩院MindOpt优化求解器-月刊(2024年5月)
阿里达摩院MindOpt优化求解器-月刊(2024年5月版),新增了两个案例,如何使用LLM和MindOpt更准确地回答数学问题、如何使用MindOpt优化云计算集群虚拟机资源配置提高机器利用率,和如何利用IIS冲突分析指导不可解的问题解决方案。MindOpt的求解器已经可以在阿里云线上购买不联网版本。租户版也正式上线,可体验更多功能。新增QQ交流群。
122 4
|
6月前
|
达摩院 Python
阿里达摩院MindOpt优化求解器-月刊(2024年6月)
**阿里达摩院MindOpt优化求解器2024年6月月刊概览:** - 发布新功能,MAPL建模语言V2.5上线,Python APIs全面升级,旧版本不兼容。 提供快速入门教程、示例代码展示如何用Python调用MAPL。MindOpt Studio租户版新增Gradio支持,便于开发WebAPP,提供了案例源码展示如何开发。引入新案例: 1. 巡检线路的排班-2017全国大学生数学建模竞赛D题。包含最短路模型、TSP模型、弧分割模型。2. 商品组合定价策略:探讨如何最赚钱的加购区商品定价。
132 0
|
7月前
|
达摩院 算法 Java
选择优化求解器的关键因素:以MindOpt为例
选择一款适合自己业务需求的求解器我们一般需要考量什么呢?可求解的问题类型?问题规模?本文将介绍一些需要考虑的重要因素,并且介绍阿里达摩院MindOpt优化求解器在这些因素下的表现。
|
7月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
7月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
2月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
28 1
|
5月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器