2016-07-21 8 views
0

cplexを使用してJavaで二重の値を取得しようとしています。しかし、私は間違った価値を得ています。私はそれが間違っていることを知っています。私は他のソルバーを使って二重の値をチェックしています私は自分のコードで何の問題も見つけられませんでした。誰が私に何が間違っているか教えてもらえますか?私の問題は、以下の通りである: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(); 
     } 
    } 
} 

答えて

0

何も悪いことはありません。あなたのモデルに対する二重の問題は複数の最適解を持っています。したがって、ソルバーは、それらのどれもが間違っていないソリューションを提供できます。これを確認する方法は、プライマルからの二重の値を使用して二重問題の目的を計算することです、あなたは両方の問題に対して同じ目的値を得るべきです。

+0

ありがとう:) – Dipta

関連する問題