2016-07-09 3 views
0

私のC++ Concert Cplexに問題があります。 私は最短経路問題を再現しようとしています。テキストファイルへの出力は次のようになります。私は入れませんが出力されるしかしCplexモデル:いいえ解決法

IloCplex spp(model); 
    spp.setParam(IloCplex::RootAlg, IloCplex::AutoAlg); 
    spp.solve(); 
    IloArray<IloNumArray> vals(env); 
    env.out() << "Solution status = " << spp.getStatus() << endl; 
    env.out() << "Solution value = " << spp.getObjValue() << endl; 
    env.out() << "Values x  = " << vals << endl; 

Solution status = Optimal 
Solution value = 0 
Values x  = [] 

は誰もが知ってい

Minimize 
obj: 2 x_12 + x_13 + 2 x_21 + x_24 + x_31 + 3 x_34 + x_42 + 3 x_43 + x9 
Subject To 
c1: x_12 + x_13 - x_21 - x_31 + x_14 - x_41 = 1 
c2: - x_12 + x_21 + x_24 - x_42 + x_23 - x_32 = 0 
c3: - x_13 + x_31 + x_34 - x_43 - x_23 + x_32 = 0 
c4: - x_24 - x_34 + x_42 + x_43 - x_14 + x_41 = -1 
Bounds 
     x9 = 0 
End 

が、私はその後、溶液を得るために、次のコードを使用しました私のプログラムに何が間違っていますか? おかげ

EDIT:

IloEnv env; 
    IloModel model(env); 
    IloArray<IloNumVarArray> x(env); 
    IloRangeArray c(env); 
    IloInt nnodes = G.size(); 
    IloInt i, j; 
    IloEnv env = model.getEnv(); 

    //SHORTEST PATH PROBLEM 

    for (i = 0; i < nnodes; i++){ //x decision variables 
     x.add(IloNumVarArray(env, nnodes, 0, IloInfinity)); 
    } 
    for (i = 0; i < nnodes; i++){ 
     for (j = 0; j < nnodes; j++){ 
      stringstream sts; 
      sts << "x_" << i + 1 << j + 1; 
      x[i][j].setName(sts.str().c_str()); //SET NAMES 
     } 
    } 

    //set objective min sum_(all ij)[c_ij][x_ij] 
    IloExpr obj(env); 
    for (i = 0; i < nnodes; i++){ 
     for (j = 0; j < nnodes; j++){ 
      obj += G[i][j] * x[i][j]; 
     } 
    } 
    model.add(IloMinimize(env, obj)); 
    obj.end(); 

    //constraints sum_j[x_ij]-sum_j[x_ji] = 1 for s, -1 for t, or 0 
    for (i = 0; i < nnodes; i++){ 
     int ss = 0; 
     if (i == s) ss = 1; 
     if (i == t) ss = -1; 
     IloExpr sum1(env); 
     IloExpr sum2(env); 
     for (j = 0; j < nnodes; j++){ 
      sum1 += x[i][j]; 
      sum2 += x[j][i]; 
     } 
     c.add(sum1 - sum2 == ss); 
     sum1.end(); 
     sum2.end(); 
    } 
    model.add(c); 

    //solving--------------------------------------------------------- 
    IloCplex spp(model); 

    //write to file 
    spp.exportModel("model1.lp"); 
    spp.solve(); 

答えて

0

コードに何か不足があります。お使いのモデルの作成コードの開始時に、あなたがIloNumVars xの2次元配列の宣言を持っている:

IloEnv env; 
IloModel model(env); 
IloArray<IloNumVarArray> x(env); 
IloRangeArray c(env); 

しかし、その後、あなたが解決策を得るために使用するコードは次のようになりますことを言う:

IloCplex spp(model); 
spp.setParam(IloCplex::RootAlg, IloCplex::AutoAlg); 
spp.solve(); 
IloArray<IloNumArray> vals(env); 
env.out() << "Solution status = " << spp.getStatus() << endl; 
env.out() << "Solution value = " << spp.getObjValue() << endl; 
env.out() << "Values x  = " << vals << endl; 

val(IloNumの2次元配列)をxの値(モデル内のIloNumVarsの2次元配列)に関連付けるために何を行うかはわかりません。私はあなたがIloNumの配列に値を取得するために、IloNumVarsでspp.getValue(...)のようなものを呼び出す必要があると思います。

1

どうやらあなたはファイルからモデルを読んでいない:私のモデルは、プログラム自体に内蔵されて

が、ここで最初の部分です。ここにはexampleがあります。したがってあなたの場合:

#include <ilcplex/ilocplex.h> 
    ILOSTLBEGIN 

    int main (int argc, char **argv) 
    { 
    IloEnv env; 
    try { 
     IloModel model(env); 
     IloCplex cplex(model); 

     IloObjective obj; 
     IloNumVarArray var(env); 
     IloRangeArray con(env); 

     cplex.importModel(model, "tmp.lp", obj, var, con); 
     cplex.extract(model); 

     // Optimize the problem and obtain solution. 
     if (!cplex.solve()) { 
      env.error() << "Failed to optimize LP" << endl; 
      throw(-1); 
     } 

     IloNumArray vals(env); 
     env.out() << "Solution status = " << cplex.getStatus() << endl; 
     env.out() << "Solution value = " << cplex.getObjValue() << endl; 
     cplex.getValues(vals, var); 
     env.out() << "Values  = " << vals << endl; 
     cplex.getSlacks(vals, con); 
     env.out() << "Slacks  = " << vals << endl; 
     cplex.getDuals(vals, con); 
     env.out() << "Duals   = " << vals << endl; 
     cplex.getReducedCosts(vals, var); 
     env.out() << "Reduced Costs = " << vals << endl; 
    } 
    catch (IloException& e) { 
     cerr << "Concert exception caught: " << e << endl; 
    } 
    catch (...) { 
     cerr << "Unknown exception caught" << endl; 
    } 

    env.end(); 

    return 0; 
    } // END main 

ここで、tmp.lpはLPモデルファイルです。このコードを実行しています

Tried aggregator 1 time. 
LP Presolve eliminated 3 rows and 12 columns. 
Aggregator did 1 substitutions. 
All rows and columns eliminated. 
Presolve time = 0.00 sec. (0.01 ticks) 
Solution status = Optimal 
Solution value = 0 
Values  = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 
Slacks  = [0, 0, 0, 0] 
Duals   = [1, 0, 0, 1] 
Reduced Costs = [1, 0, 3, 2, 2, 4, 0, 2, 1, 0, 0, 0, 0] 
+0

返信いただきありがとうございます。元の投稿を編集しました。問題のモデルはcplexによって作成されます。テキストファイルの出力は "exportModel()"の単なる結果です。だから私の場合は、solve()にエラーがありますか? – Michael

0

まず、引用符で囲まれたmpに何かを書き留めておきます。

目標値 0その結果
x_14 = 1, all other x_ijs = 0 or x_41 = -1 all other x_ijs = 0 

:ソリューションCPLEXに関して完全に有効な2つのソリューションあなたを提供していがあります。

x_14x_41を変数にしていますが、目的のコストには関係していないため、基本的にはソースからシンクまで無駄にすることをお勧めします。問題はあなたのモデルではない、それは正常に動作します。それはあなたのグラフを作成する方法ですが、それはそうです。

関連する問題