2016-07-09 139 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作为变量,但与目标中的任何成本没有关联,则基本上鼓励从源代码到下载而不花费任何代价。问题不在于你的模型,它工作正常。这是您构建图形的方式,但它是。

相关问题