用COPT求解整数规划数学模型(Java)

前言:

看论文总是看到整数规划,0-1整数规划,混合整数规划,便研究了一下,包括问题定义,快速求解工具等。
在这里插入图片描述

杉数求解器

杉数求解器COPT(Cardinal Optimizer),是杉数自主研发的针对大规模优化问题的高效数学规划求解器套件,也是支撑杉数端到端供应链平台的核心组件,是目前中国唯一一个同时具备大规模线性规划(单纯形法和内点法)和混合整数规划问题求解能力的综合性数学规划求解器,为企业应对高性能求解的需求提供了更多选择[1]。

在这里插入图片描述

如何获取

从杉数求解器官网上,可以看到,该求解器目前开放许可申请与下载,尤其是对于学术用户,拥有一年的免费试用权限,针对非学术用户,提供60天的免费试用权限。需要填写如下申请表,即可申请获取。

在这里插入图片描述

本人第一天申请,第二天就收到了邮件,可以说相当快了。邮件里包含求解器的安装包下载地址,软件密钥以及必要的说明信息。

安装与介绍

安装就很简单了,主要就是配置软件密钥。

软件安装完毕后,安装的根路径下文件夹内容如图所示:

在这里插入图片描述

  • bin:各种动态库以及可执行文件
  • doc:用户操作文档
  • example:编程接口调用案例
  • lib:通过编程接口调用需要依赖的文件

通过JAVA调用

  1. 引入jar包

    在软件安装的lib文件夹下有copt.jar,复制一份到项目中,并加入到Library

    以集成环境IDEA举例:复制到项目的lib文件夹(自行创建)—>右键lib文件夹—>Add as Library 即可。

  2. 编程使用

    然后就可以通过java编程使用该求解器的功能。

举例

求解问题:
max ⁡ z = 5 x 1 + 8 x 2  s. t.  x 1 + x 2 ≤ 6 5 x 1 + 9 x 2 ≤ 45 x i ≥ 0 , x i ∈ Z i = 1 , 2 \begin{gathered} \max z=5 x_{1}+8 x_{2}\\ \text { s. t. } \quad x_{1}+x_{2} \leq 6 \\ 5 x_{1}+9 x_{2} \leq 45 \\ x_{i} \geq 0, x_{i} \in \mathbb{Z} \quad i=1,2 \end{gathered} maxz=5x1+8x2 s. t. x1+x265x1+9x245xi0,xiZi=1,2
代码:

  public static void main(String[] args) {
        try {
            Envr env = new Envr();
            Model model = env.createModel("myModel");

            // Add variables
            // obj: 5x + 8y
            // var:
            // 0 <= x, y
            Var x = model.addVar(0, copt.Consts.INFINITY, 5.0, Consts.INTEGER, "x");
            Var y = model.addVar(0, copt.Consts.INFINITY, 8.0, Consts.INTEGER, "y");

            // 1.添加线性约束
            // r0: x + y <= 6
            // r1: 5x + 9y <= 45
            Expr e0 = new Expr(x, 1.0);
            e0.addTerm(y, 1.0);
            model.addConstr(e0, copt.Consts.LESS_EQUAL, 6.0, "r0");

            Expr e1 = new Expr(x,5.0);
            e1.addTerm(y,9.0);
            model.addConstr(e1, Consts.LESS_EQUAL, 45.0, "r1");

            // 设置模型的参数和属性
            model.setDblParam(copt.DblParam.TimeLimit, 10);
            model.setObjSense(copt.Consts.MAXIMIZE);

            // Solve problem
            model.solve();

            // Output solution
            System.out.println("\nFound optimal solution:");
            VarArray vars = model.getVars();
            for (int i = 0; i < vars.size(); i++) {
                Var var = vars.getVar(i);
                System.out.println("  " + var.getName() + " = " + var.get(copt.DblInfo.Value));
            }
            System.out.println("Obj = " + model.getDblAttr(copt.DblAttr.BestObj));

            System.out.println("\nDone");

        } catch (CoptException e) {
            e.printStackTrace();
        }
        
    }

输出:

Cardinal Optimizer v3.0.1. Build date Oct 12 2021
Copyright Cardinal Operations 2021. All Rights Reserved

Setting parameter 'TimeLimit' to 10
Maximizing a MIP problem

The original problem has:
    2 rows, 2 columns and 4 non-zero elements
    2 integers

Presolving the problem

The presolved problem has:
    2 rows, 2 columns and 4 non-zero elements
    2 integers

Starting the MIP solver with 8 threads and 16 tasks

     Nodes    Active  LPit/n  IntInf     BestBound  BestSolution    Gap   Time
         0         1      --       0  1.000000e+30            --    Inf  0.12s
H        0         1      --       0  1.000000e+30  0.000000e+00    Inf  0.13s
H        0         1      --       0  1.000000e+30  1.300000e+01    Inf  0.13s
         0         1      --       2  4.125000e+01  1.300000e+01  68.5%  0.14s
H        0         1      --       2  4.125000e+01  3.400000e+01  17.6%  0.14s
H        0         1      --       2  4.125000e+01  3.900000e+01  5.45%  0.14s
         0         1      --       2  4.050000e+01  3.900000e+01  3.70%  0.14s
*        0         1      --       0  4.000000e+01  4.000000e+01  0.00%  0.14s
         0         1      --       0  4.000000e+01  4.000000e+01  0.00%  0.14s
         1         0      --       0  4.000000e+01  4.000000e+01  0.00%  0.14s

Best solution   : 40.000000000
Best bound      : 40.000000000
Best gap        : 0.0000%
Solve time      : 0.14
Solve node      : 1
MIP status      : solved
Solution status : integer optimal (relative gap limit 0.0001)

Violations      :     absolute     relative
  bounds        :            0            0
  rows          :            0            0
  integrality   :            0

Found optimal solution:
  x = 0.0
  y = 5.0
Obj = 40.0

Done

参考

[1]杉数求解器COPT

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值