Cplex的结果是负面的或不可行的

时间:2014-06-06 15:33:54

标签: c++ cplex

我正在尝试使用Cplex解决LP问题。变量是3和4个dimentinal正数组。像这样:

`typedef IloArray<IloNumVarArray> IloNumVarArray2;
 typedef IloArray<IloNumVarArray2> IloNumVarArray3;
 IloNumVarArray3 A(env, J) ; 
for (int j=0; j<J; j++){
    A[j]=IloNumVarArray2(env,T);
     for ( int t=0; t<T; t++){
      A[j][t]=IloNumVarArray(env,S,0,IloInfinity,ILOFLOAT);
         }}`

Cplex给出A的负值。我不明白为什么它不是不可行。

1 个答案:

答案 0 :(得分:0)

简短的回答是每台机器(以及应用程序)都能产生正确的输出,直至达到一定的容差水平。

CPLEX manual部分关于可行性容忍度的长篇答案:

  

指定可行性容差,即程度   通过单纯形法计算的基本变量的值可以   违反了他们的界限。可行性影响了选择   最佳基础,可以在出现问题时重置为更高的值   在优化期间难以保持可行性。你可以   如果找到最佳解决方案,也希望降低此容差   毫无疑问,该解决方案确实是最佳的。如果   可行性公差设定得太低,CPLEX可能会错误地得出结论   一个问题是不可行的。如果您遇到不可行的报告   在第二阶段的优化过程中,进行了小幅调整   可行性公差可以提高绩效。

     

<强>值

     

1e-91e-1的任意数字;默认值:1e-06

简单来说,1e-06会忽略幅度小于CPLEX的任何不可行性。由于|-2.5485e-014| < 1e-06CPLEX认为解决方案是可行的。

您可以通过更改EpRHS API的C++值,将可行性容差设置为差异数字。 This example shows how you do it:

IloModel model(env, "chvatal");          // Instantiates the model
IloCplex cplex(model);                   // Instantiates a CPLEX instance
cplex.setParam(IloCplex::SimDisplay, 2); // Changes SimDisplay, no idea whats this:)
cplex.setParam(IloCplex::RootAlg, IloCplex::Network); // Solves the LP with the Network solver

所以在你的情况下你应该做类似

的事情
cplex.setParam(IloCplex::EpRHS, 1e-9)

请注意,您设置的内容必须在[1e-9, 1e-1]范围内。因此,无法像1e-14一样准确,这意味着您获得的结果将是相同的。

更长,更精细的答案是here。它不会解决你的问题,这是一个沉重的阅读,但是当你有一些时间时,请试一试 - 它的乐趣!