coin-or clp线性规划的敏感性分析

计算科学 优化 线性求解器 线性规划
2021-11-30 09:15:33

我写了一个简短的例子来运行带有硬币或 Clp 的单纯形算法,像这样非常简单:

ClpSimplex solver;
solver.readLp(file_in);        
solver.initialSolve();
if(solver.isProvenOptimal()) {
  int ncol = solver.getNumCols();
  const double *solution = solver.getColSolution();
  for(int i=0; i<ncol; i++) {
    printf("%f ", solution[i]);
  }
  printf("\n");
}
if(solver.isAbandoned())
  printf("Numerical problems found\n");
if(solver.isProvenPrimalInfeasible())
  printf("Primal Infeasible\n");
if(solver.isProvenDualInfeasible())
  printf("Dual Infeasible\n");

现在我有了解决方案,我想做敏感性分析,也就是说,改变目标函数和/或第二个成员,然后检查相同的基础是否仍然是最优的(当然不是从头开始!! )

硬币或 Clp 是否能够做到这一点以及如何做到这一点?如果没有,你知道另一个免费的 LP 求解器吗?

1个回答

任何线性规划求解器都应该能够为您提供灵敏度信息。评估对成本向量变化的敏感性所需的信息是缩减成本向量和单纯形表。您应该能够从调用中获得降低成本的信息solver.getReducedCost()(为了降低成本;使用示例程序中的命名法)。

尽管单纯形表应该可以直接使用,但事实并非如此。您将需要使用调用来solver.getColumnStatus(j)(以确定是否xj是一个基本变量)。一旦你知道了基本变量——它们的值ClpSimplex::basic——你就可以根据这些信息显式地计算单纯形表。

您应该能够从CLP 用户指南中获取调用签名,然后您可以使用线性编程教科书在代码中显式计算敏感度信息。