2016-07-09 218 views
0

與我的C++ Concert Cplex有問題。 我正在嘗試重新創建最短路徑問題。輸出文本文件是:Cplex模型:沒有解決方案

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 

然後我用下面的代碼來獲取解決方案:

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  = [] 

有誰知道我的程序有什麼問題? 感謝

編輯:

我的模型是建立在程序本身,這裏是第一部分:

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-d陣列的聲明:

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; 

我看不出在哪裏做了任何事情來將vals(IloNums的二維數組)與x(模型中IloNumVars的二維數組)中的值相關聯。我認爲你應該在IloNumVars上調用類似spp.getValue(...)的值來將值傳入IloNums數組中。

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中重複一些內容。有兩個解決方案完美地相對於該解決方案CPLEX有效的爲您提供:

x_14 = 1, all other x_ijs = 0 or x_41 = -1 all other x_ijs = 0 

導致客觀價值0

x_14x_41作爲變量,但與目標中的任何成本沒有關聯,則基本上鼓勵從源代碼到下載而不花費任何代價。問題不在於你的模型,它工作正常。這是您構建圖形的方式,但它是。

相關問題