CPLEX - 访问解决方案C ++时出错

时间:2017-07-06 17:08:17

标签: c++ cplex

我在访问LP问题的解决方案时遇到问题。

这是调用cplex.solve();

后CPLEX的输出
libc++abi.dylib: terminating with uncaught exception of type IloAlgorithm::NotExtractedException

但是当我调用cplex.getValues(值,变量)时;该程序给出一个SIGABRT信号抛出以下异常:

std::vector<links_t> links(pointsA.size()*pointsB.size());

std::unordered_map<int, std::vector<std::size_t> > point2DToLinks;

for(std::size_t i=0; i<pointsA.size(); ++i){

  for(std::size_t j=0; j<pointsB.size(); ++j){

    std::size_t index = (i*pointsA.size()) + j;

    links[index].from = i;
    links[index].to   = j;

    links[index].value = cv::norm(pointsA[i] - pointsB[j]);

    point2DToLinks[pointsA[i].point2D[0]->id].push_back(index);
    point2DToLinks[pointsA[i].point2D[1]->id].push_back(index);
    point2DToLinks[pointsA[i].point2D[2]->id].push_back(index);

    point2DToLinks[pointsB[j].point2D[0]->id].push_back(index);
    point2DToLinks[pointsB[j].point2D[1]->id].push_back(index);
    point2DToLinks[pointsB[j].point2D[2]->id].push_back(index);

  }

}

std::size_t size = links.size() + point2DToLinks.size();

IloEnv environment;

IloNumArray coefficients(environment, size);

for(std::size_t i=0; i<links.size(); ++i)    coefficients[i] = links[i].value;
for(std::size_t i=links.size(); i<size; ++i) coefficients[i] = -lambda;

IloNumVarArray variables(environment, size, 0, 1, IloNumVar::Bool);

IloObjective objective(environment, 0.0, IloObjective::Minimize);

objective.setLinearCoefs(variables, coefficients);

IloRangeArray constrains = IloRangeArray(environment);

std::size_t counter = 0;

for(auto point=point2DToLinks.begin(); point!=point2DToLinks.end(); point++){

  IloExpr expression(environment);

  const std::vector<std::size_t> & inLinks = point->second;

  for(std::size_t j=0; j<inLinks.size(); j++) expression += variables[inLinks[j]];

  expression -= variables[links.size() + counter];

  constrains.add(IloRange(environment, 0, expression));

  expression.end();

  ++counter;

}

IloModel model(environment);

model.add(objective);
model.add(constrains);

IloCplex cplex(model);

cplex.solve();

if(cplex.getStatus() != IloAlgorithm::Optimal){
  fprintf(stderr, "error: cplex terminate with an error.\n");
  abort();
}

IloNumArray values(environment, size);

cplex.getValues(values, variables);

for(std::size_t i=0; i<links.size(); ++i)
  if(values[i] > 0) pairs.push_back(links[i]);

environment.end();

这是我的代码。我做错了什么?

(Invoke-WebRequest ifconfig.me/ip).content | Out-File "C:\test\test2.txt"
$ErrorActionPreference = "Stop"
$File = "C:\test\test.txt"
$File2 = "C:\test\test2.txt"

Compare-Object -ReferenceObject (Get-Content $File2) -DifferenceObject (Get-
Content $File) -IncludeEqual

1 个答案:

答案 0 :(得分:2)

如果您向CPLEX询问CPLEX在其模型中没有的变量值,则会发生此错误。在构建模型时,仅仅声明和定义变量以使其包含在模型中是不够的。它也必须是模型中约束或目标之一的一部分。您声明/定义的任何未包含在其中一个约束或目标中的变量因此不会被提取到CPLEX内部工作的变量集中。你可以做两件明显的事情来解决这个问题。

首先,您可以尝试在变量中获取循环内的变量值,并测试每个变量值是否实际位于cplex模型中 - 我认为它类似于cplex.isExtracted(var)。当你遇到一个未提取的变量时,做一些简单的事情,比如打印一条消息,告诉你哪个变量导致了这个问题。

其次,您可以将模型从CPLEX导出为LP格式文件并手动检查。这是一种非常有用的方法,可以查看模型中的实际内容,而不是模型中认为的内容。