MindOpt对MILP问题的建模优化,MILP功能已经开放啦

简介

MindOpt是达摩院决策智能实验室研究的一款优化求解器,能够求解LP、QP、SDP、MILP问题。目前MILP功能已经开放,无需申请特殊license一起来使用吧!

如何获取MindOpt求解器

求解器安装包的发布渠道。请大家:

前往 https://www.aliyun.com/product/ai/opt 来下载求解器软件。
在阿里云上获取免费授权码:
• 请大家迁移到“云鉴权”自助申请licenseKey,配置fl_client.ini。新的“云鉴权”不需要绑定机器ID,只要阿里云账号并联网就好。
关于求解器的使用文档,请参考:https://help.aliyun.com/document_detail/298219.htm

数学公式下的混合整数线性规划问题:

-

  •   x ∈ R n 是决策变量   l c ∈ R n 和 u c ∈ R n 分别为 x 的下界和上界   c f ∈ R 是目标函数中的常量   c ∈ R n 是目标函数中的系数   A ∈ R m × n 是约束矩阵   l r ∈ R m 和 u r ∈ R m 分别为是约束的下界和上界 x ∈ Z n 是指变量为整数的约束 \ x \in \mathbb{R}^{n} 是决策变量\\ \ l^c \in \mathbb{R}^{n} 和 u^c \in \mathbb{R}^{n} 分别为 x 的下界和上界\\ \ c^f \in \mathbb{R} 是目标函数中的常量\\ \ c \in \mathbb{R}^{n} 是目标函数中的系数\\ \ A \in \mathbb{R}^{m \times n} 是约束矩阵\\ \ l^r \in \mathbb{R}^{m} 和 u^r \in \mathbb{R}^{m} 分别为是约束的下界和上界\\ x \in \mathbb{Z}^{n}是指变量为整数的约束  xRn是决策变量 lcRnucRn分别为x的下界和上界 cfR是目标函数中的常量 cRn是目标函数中的系数 ARm×n是约束矩阵 lrRmurRm分别为是约束的下界和上界xZn是指变量为整数的约束

数学算例

混合整数线性规划问题示例:

在这里插入图片描述

  • 0 ≤ x 0 ≤ 10 0 ≤ x 1 ≤ ∞ 0 ≤ x 2 ≤ ∞ 0 ≤ x 3 ≤ ∞ x 0 、 x 1 、 x 2 为整数 \begin{matrix} 0 & \leq & x_0 & \leq & 10 \\ 0 & \leq & x_1 & \leq & \infty \\ 0 & \leq & x_2 & \leq & \infty \\ 0 & \leq & x_3 & \leq & \infty \\ & & x_0、x_1、x_2 为整数 \end{matrix} 0000x0x1x2x3x0x1x2为整数10

MindOpt和C++下的建模优化

核心使用的几个APIs是:

MdoModel model;

model.setIntAttr(MDO_INT_ATTR::MIN_SENSE, MDO_YES);

model.addCons(1.0, MDO_INFINITY, 1.0 * x[0] + 1.0 * x[1] + 2.0 * x[2] + 3.0 * x[3], "c0");
model.addCons(1.0, 1.0,          1.0 * x[0]              - 1.0 * x[2] + 6.0 * x[3], "c1");

model.solveProb();
model.displayResults();

下面是完整的例子,可复制存为 MdoMiloEx1.cpp文件。

#include <iostream>
#include <vector>
/*引入头文件*/
#include "MindoptCpp.h"

using namespace mindopt;

int main(void)
{
    /*------------------------------------------------------------------*/
    /* Step 1. 创建模型并更改参数。               */
    /*------------------------------------------------------------------*/
    /* 创建一个空模型 */
    MdoModel model;

    try 
        {
            /*------------------------------------------------------------------*/
            /* Step 2. 输入模型。.                                             */
            /*------------------------------------------------------------------*/
            /* 改为最小化问题 */
            /*通过 mindopt::MdoModel::setIntAttr() 将目标函数设置为 最小化*/ 
            model.setIntAttr(MDO_INT_ATTR::MIN_SENSE, MDO_YES);

            /* 添加变量 */
            /*调用 mindopt::MdoModel::addVar() 来添加四个优化变量,定义其下界、上界、名称和类型*/
            std::vector<MdoVar> x;
            x.push_back(model.addVar(0.0, 10.0,         1.0, "x0", MDO_YES));
            x.push_back(model.addVar(0.0, MDO_INFINITY, 1.0, "x1", MDO_YES));
            x.push_back(model.addVar(0.0, MDO_INFINITY, 1.0, "x2", MDO_YES));
            x.push_back(model.addVar(0.0, MDO_INFINITY, 1.0, "x3", MDO_NO));

            /* 添加约束 */
            /*通过 mindopt::MdoModel::addCons()来添加约束*/
            model.addCons(1.0, MDO_INFINITY, 1.0 * x[0] + 1.0 * x[1] + 2.0 * x[2] + 3.0 * x[3], "c0");
            model.addCons(1.0, 1.0,          1.0 * x[0]              - 1.0 * x[2] + 6.0 * x[3], "c1");

            /*------------------------------------------------------------------*/
            /* Step 3. 解决问题并填充结果。              */
            /*------------------------------------------------------------------*/
            /* 调用 mindopt::MdoModel::solveProb() 求解优化问题,
               并通过 mindopt::MdoModel::displayResults() 查看优化结果 */
            model.solveProb();
            model.displayResults();
        }
    catch (MdoException & e)
        {
            std::cerr << "===================================" << std::endl;
            std::cerr << "Error   : code <" << e.getResult() << ">" << std::endl;
            std::cerr << "Reason  : " << model.explainResult(e.getResult()) << std::endl;
            std::cerr << "===================================" << std::endl;

            return static_cast<int>(e.getResult());
        }

    return static_cast<int>(MDO_OKAY);
}

MindOpt求解的结果

运行MdoMiloEx1.cpp文件的步骤

cd <MDOHOME>/<VERSION>/examples/CPP
make -f Makefile all
./MdoMiloEx1

windows系统本例是在Visual Studio上运行,版本为2019
可以参考《配置C++案例》:https://blog.csdn.net/MindOpt_003/article/details/128902071?spm=1001.2014.3001.5502
如上文所述,运行MdoMiloEx1.cpp文件,得到求解的结果如下所示。

Model summary.
 - Num. variables     : 4
 - Num. constraints   : 2
 - Num. nonzeros      : 7
 - Num. integer vars. : 3
 - Bound range        : [1.0e+00,1.0e+01]
 - Objective range    : [1.0e+00,1.0e+00]

Branch-and-cut method started.
Model summary.
 - Num. variables     : 4
 - Num. constraints   : 2
 - Num. nonzeros      : 7
 - Bound range        : [1.0e+00,1.0e+01]
 - Objective range    : [1.0e+00,1.0e+00]
 - Matrix range       : [1.0e+00,6.0e+00]

Presolver started.
Presolver terminated. Time : 0.005s

Simplex method started.

    Iteration       Objective       Dual Inf.     Primal Inf.     Time
            0     0.00000e+00      0.0000e+00      1.3102e+00     0.04s
            2     5.55556e-01      0.0000e+00      0.0000e+00     0.06s
Postsolver started.
Simplex method terminated. Time : 0.051s

            2     5.55556e-01      0.0000e+00      0.0000e+00     0.08s
            2     5.55556e-01      0.0000e+00      0.0000e+00     0.09s
            2     5.55556e-01      0.0000e+00      0.0000e+00     0.10s
            2     5.55556e-01      0.0000e+00      0.0000e+00     0.11s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.12s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.14s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.14s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.15s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.17s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.18s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.18s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.19s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.20s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.21s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.22s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.22s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.23s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.25s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.25s
            0     5.55556e-01      0.0000e+00      0.0000e+00     0.26s
Branch-and-cut method terminated. Time : 0.567s

Optimizer summary.
 - Optimizer used     : Branch-and-cut method
 - Optimizer status   : OPTIMAL
 - Total time         : 0.624s

Solution summary.       Primal solution
 - Objective          : 1.0000000000e+00

解释输出:

  • 第一行到第七行总结了模型的规模,包括变量、约束的数量,限制范围、目标范围
  • 9-19行:使用分支切割方法,还有总结的模型规模,矩阵范围,进行前求解,然后前求解结束。
  • 21-27行:使用单纯形法求解产生的一些迭代信息
    • Iteration(迭代次数) Objective(目标值) Dual Inf.(对偶不可行) Primal Inf. (原始不可行)
  • 29-49行:分支切割方法产生的迭代信息。
  • 51-54行:优化器的总结,包括最终使用的求解方法、求解状态、求解时间。
  • 56-57行:展示了目标函数最优解

联系我们

钉钉群号:32451444
邮箱地址:solver.damo@list.alibaba-inc.com
更多更新通知:https://solver.damo.alibaba.com

MindOpt-2023年度有奖问卷调研

MindOpt邀请您参与有奖问卷!

问卷填写地址: https://yida.alibaba-inc.com/o/MindOpt_2023

八个问题,预计耗时十分钟

在这里插入图片描述
联系小编个人钉账号领取奖品:hw2-wwffqg05p
电子邮箱联系:solver.damo@list.alibaba-inc.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值