我正在尝试使用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的负值。我不明白为什么它不是不可行。
答案 0 :(得分:0)
简短的回答是每台机器(以及应用程序)都能产生正确的输出,直至达到一定的容差水平。
CPLEX
manual部分关于可行性容忍度的长篇答案:
指定可行性容差,即程度 通过单纯形法计算的基本变量的值可以 违反了他们的界限。可行性影响了选择 最佳基础,可以在出现问题时重置为更高的值 在优化期间难以保持可行性。你可以 如果找到最佳解决方案,也希望降低此容差 毫无疑问,该解决方案确实是最佳的。如果 可行性公差设定得太低,CPLEX可能会错误地得出结论 一个问题是不可行的。如果您遇到不可行的报告 在第二阶段的优化过程中,进行了小幅调整 可行性公差可以提高绩效。
<强>值强>
从
1e-9
到1e-1
的任意数字;默认值:1e-06
。
简单来说,1e-06
会忽略幅度小于CPLEX
的任何不可行性。由于|-2.5485e-014| < 1e-06
,CPLEX
认为解决方案是可行的。
您可以通过更改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。它不会解决你的问题,这是一个沉重的阅读,但是当你有一些时间时,请试一试 - 它的乐趣!