当前位置:   article > 正文

基于Cplex的线性规划问题求解(JavaAPI)_cplex求解器

cplex求解器

Cplex是求解线性/整数规划问题的常用求解器之一(商用),而Java是应用非常广泛的程序开发语言。本文力争通过两个优化实例,描述清楚在Java语言下,如何调用Cplex高效求解线性/整数规划问题。

算例1:线性规划问题(Cplex解题器手册中一个简单例题LPex1.java)

max ⁡ x 1 + 2 x 2 + 3 x 3 subject to − x 1 + x 2 + x 3 ≤ 20 x 1 − 3 x 2 + x 3 ≤ 30 0 ≤ x 1 ≤ 40 , x 2 , x 3 ≥ 0

maxx1+2x2+3x3subject tox1+x2+x320x13x2+x3300x140,x2,x30
maxsubject tox1+2x2+3x3x1+x2+x320x13x2+x3300x140,x2,x30

完整代码如下:

public static void main(String[] args) {
        // cplex求解,一般都使用try...catch...
        try {
            // 声明cplex优化模型
            IloCplex cplex = new IloCplex();

            // 设定变量上下限
            double[] lb = {0.0, 0.0, 0.0};  // 下限
            double[] ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE};  // 上限
            IloNumVar[] x = cplex.numVarArray(3, lb, ub);  // 定义优化变量:IloNumVar,3维,以及对应的边界

            // 设定目标函数
            double[] objvals = {1.0, 2.0, 3.0};  // 目标函数系数
            cplex.addMaximize(cplex.scalProd(x, objvals));  // 定义目标函数:addMaximize最大化,scalProd,连乘

            // 设定约束条件
            double[] coeff1 = {-1.0, 1.0, 1.0};  // 第一组约束条件的系数
            double[] coeff2 = {1.0, -3.0, 1.0};  // 第二组约束条件的系数
            cplex.addLe(cplex.scalProd(x, coeff1), 20.0);  // 定义第一组约束条件的系数,addLe(a,b):a小于等于b
            cplex.addLe(cplex.scalProd(x, coeff2), 30.0);  // 定义第二组约束条件的系数

            // cplex.solve():模型求解
            if (cplex.solve()) {
                // cplex.output(),数据输出,功能类似System.out.println();
                cplex.output().println("Solution status = " + cplex.getStatus());  // cplex.getStatus:求解状态,成功则为Optimal
                // cplex.getObjValue():目标函数的最优值
                cplex.output().println("Solution value = " + cplex.getObjValue());
                // cplex.getValues(x):变量x的最优值
                double[] val = cplex.getValues(x);
                for (int j = 0; j < val.length; j++)
                    cplex.output().println("x" + (j+1) + "  = " + val[j]);
            }
            // 退出优化模型
            cplex.end();

        } catch (IloException e) {
            System.err.println("Concert exception caught: " + e);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

例题2:整数规划问题

a = [ 8 7 9 4 5 8 0 7 4 4 4 3 3 8 7 7 0 10 8 7 1 1 0 2 8 ] a=

[87945807444338770108711028]
a= 88471703019731004488254778 b = [ 3 5 8 10 9 7 10 2 6 2 7 3 5 1 8 1 6 7 1 2 1 2 9 2 10 ] b=
[3581097102627351816712129210]
b= 3771151036282579106112928210

存在以上两个二维矩阵,要求分别从两个矩阵中的每一行,选出一个元素,使得总的数值最小化,约束条件为a和b中,相同行所选定的元素对应的列,也要相同。

min ⁡ ∑ i = 0 4 ( a i j x i j + b i j y i j ) subject to x i j = y i j , ∀ i , j ∑ j = 0 4 x i j = 1 , ∀ i ∑ j = 0 4 y i j = 1 , ∀ i

mini=04(aijxij+bijyij)subject toxij=yij,i,jj=04xij=1,ij=04yij=1,i
minsubject toi=04(aijxij+bijyij)xij=yij,i,jj=04xij=1,ij=04yij=1,i

完整代码如下:

    public static void main(String[] args) {
        int[][] a = {
                {8, 7, 9, 4, 5},
                {8, 0, 7, 4, 4},
                {4, 3, 3, 8, 7},
                {7, 0, 10, 8, 7},
                {1, 1, 0, 2, 8}
        };
        int[][] b = {
                {3, 5, 8, 10, 9},
                {7, 10, 2, 6, 2},
                {7, 3, 5, 1, 8},
                {1, 6, 7, 1, 2},
                {1, 2, 9, 2, 10}
        };
        try {
            // 声明cplex优化模型
            IloCplex model = new IloCplex();

//             定义两个二维优化变量
            IloIntVar[][] x = new IloIntVar[5][5];
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    x[i][j] = model.intVar(0, 4, "x[" + i + "," + j + "]");
                }
            }
            IloIntVar[][] y = new IloIntVar[5][5];
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    y[i][j] = model.intVar(0, 4, "y[" + i + "," + j + "]");
                }
            }
            
            // 定义目标函数
            IloLinearNumExpr objExpr = model.linearNumExpr();
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    objExpr.addTerm(a[i][j], x[i][j]);
                    objExpr.addTerm(b[i][j], y[i][j]);
                }
            }
            model.addMinimize(objExpr);

            // 定义约束条件
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    // 第一组约束
                    model.addEq(x[i][j], y[i][j]);
                }
                // 第二组约束
                model.addEq(model.sum(x[i]), 1);
                model.addEq(model.sum(y[i]), 1);
            }

            // 优化计算,输出最优解
            if (model.solve()) {
                System.out.println("最优解为:" + model.getObjValue());
                for (int i = 0; i < 5; i++) {
                    for (int j = 0; j < 5; j++) {
                        System.out.println("x[" + i + "," + j + "]: " + model.getValue(x[i][j]));
                    }
                }
            }

            // 退出优化模型
            model.end();

        } catch (IloException e) {
            throw new RuntimeException(e);
        }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/593053
推荐阅读
相关标签
  

闽ICP备14008679号