使用 Cplex 在 Java 中获得双重价值

Getting dual value in Java using Cplex

我正在尝试使用 cplex 在 java 中获取对偶值。但我得到了错误的价值。我知道这是错误的,因为我已经使用其他求解器检查了对偶值。我找不到我的代码有任何问题。谁能告诉我这里出了什么问题?我的问题如下:

minimize 100000x1 + 0.869x2 + 299997x3 + 199998x4 + 199998x5
subject to x1 = 1
           x1+x2=1
           x3 = 1
           x3+x4=1
           x5 = 1
           x1+x2+X3+x4+x5 <= 500

这是我的代码:

public class dual_new {
    public static void main(String[] args) {
    Model_1();
    }
    public static void Model_1() {
        try {
            //create new model
            IloCplex cplex = new IloCplex();
            //define variables
            IloNumVar x1 = cplex.numVar(0, 1,"x1");
            IloNumVar x2 = cplex.numVar(0, 1,"x2");
            IloNumVar x3 = cplex.numVar(0, 1,"x3");
            IloNumVar x4 = cplex.numVar(0, 1,"x4");
            IloNumVar x5 = cplex.numVar(0, 1,"x5");



            //define expressions
            IloLinearNumExpr objective = cplex.linearNumExpr();
            objective.addTerm(100000, x1);
            objective.addTerm(0.869, x2);
            objective.addTerm(299997, x3);
            objective.addTerm(199998, x4);
            objective.addTerm(199998, x5);

            //define objective
            cplex.addMinimize(objective);
            //define constraints
            List<IloRange>constraints = new ArrayList<IloRange>();
            constraints.add(cplex.addEq(cplex.prod(1, x1),1));
            constraints.add(cplex.addEq(cplex.sum(cplex.prod(1, x1),cplex.prod(1, x2)),1));
            constraints.add(cplex.addEq(cplex.prod(1, x3),1));
            constraints.add(cplex.addEq(cplex.sum(cplex.prod(1, x3),cplex.prod(1, x4)),1));
            constraints.add(cplex.addEq(cplex.prod(1, x5),1));
            constraints.add(cplex.addLe(cplex.sum(cplex.prod(1, x1),cplex.prod(1, x2),cplex.prod(1, x3),cplex.prod(1, x4),cplex.prod(1, x5)),500));

            //solve model
            if (cplex.solve()) {
                System.out.println("obj = "+cplex.getObjValue());
                System.out.println("x1   = "+cplex.getValue(x1));
                System.out.println("x2   = "+cplex.getValue(x2));
                System.out.println("x3   = "+cplex.getValue(x3));
                System.out.println("x4   = "+cplex.getValue(x4));
                System.out.println("x5   = "+cplex.getValue(x5));

                for(int i=0; i<constraints.size();i++)
                System.out.println("dual = "+(i+1) +" = " +cplex.getDual(constraints.get(i)));
            }
            else {
                System.out.println("Model not solved");
            }
            cplex.end();
        }
        catch (IloException exc) {
            exc.printStackTrace();
        }
    }
}

没有错。您模型的对偶问题有多个最优解;因此,求解器可以为您提供其中 none 个错误的任何解决方案。检查这一点的一种方法是使用原始问题的对偶值计算对偶问题的 objective,您应该为两个问题获得相同的 objective 值。