如何用Coin-or Cbc Solver生成LP问题解文件?(C++库及命令行报错)
解决方案
一、修复命令行执行报错问题
你遇到的命令行报错是因为参数顺序错误,Cbc会把solve误识别为待导入的文件。正确的命令格式应该将solve放在参数之后,或者调整参数顺序:
- 正确命令1:
cbc problem.lp -solu solution.txt solve - 更规范的写法(明确指定导入动作):
cbc -import problem.lp -solu solution.txt solve
这样Cbc会先导入problem.lp,指定解输出文件为solution.txt,再执行求解动作,不会再出现文件打开错误。
二、C++库生成解文件的实现方式
Cbc的C++库确实没有直接提供写入解文件的封装函数,但可以通过API获取解的相关数据,手动写入文件。以下是核心实现步骤:
求解完成后验证状态
先判断模型是否求得最优解:if (model->status() == 0) { // 0代表最优解状态 // 执行解文件写入逻辑 }获取解数据并写入文件
打开文件后,依次写入目标函数值、变量解信息:#include <fstream> #include "CbcModel.hpp" void writeSolution(CbcModel* model, const std::string& filePath) { std::ofstream soluFile(filePath); if (!soluFile.is_open()) { // 处理文件打开失败逻辑 return; } // 写入目标函数值 soluFile << "Optimal objective value: " << model->objectiveValue() << "\n\n"; // 写入变量解信息 int numVars = model->getNumCols(); soluFile << "Variable solutions:\n"; for (int i = 0; i < numVars; ++i) { std::string varName = model->getColName(i); double varValue = model->getColSolution(i); soluFile << varName << ": " << varValue << "\n"; } soluFile.close(); }调用这个函数时,只需在求解完成后传入Cbc模型对象和目标文件路径即可。
如果需要和Cbc命令行输出的解文件格式完全一致,可以参考其输出格式调整写入内容,比如添加变量的上下界、是否为整数变量等信息,这些都可以通过Cbc的API(如
model->getColLower(i)、model->getColUpper(i)、model->isInteger(i))获取。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

