如何保存CPLEX求解器查询结果?C++ Concert技术存状态报错求助
解决CPLEX Concert C++中状态枚举转字符串存入vector的问题
嘿,这个问题我之前在做迭代求解LP的时候也踩过坑!报错的核心原因很明确:cplex.getCplexStatus()返回的是**IloCplex::Status枚举类型**,而你定义的LP_STATUS是vector<string>,C++不会自动把枚举类型转换成字符串,所以push_back找不到匹配的重载函数,就抛出了那个错误。
给你两种简单的解决办法,按需选择:
方法1:直接用CPLEX内置的字符串转换方法
CPLEX其实提供了直接返回状态字符串的函数getStatusString(),它会返回对应状态的const char*,可以直接存入vector<string>:
// 把循环里的代码改成这样 LP_STATUS.push_back(cplex.getStatusString());
这个方法最省心,CPLEX已经帮你处理了所有状态的字符串映射,比如返回"Optimal"、"Infeasible"、"TimeLimitExceeded"这类标准状态描述。
方法2:自定义枚举转字符串函数(按需扩展)
如果你需要自定义状态的字符串描述,或者想基于getCplexStatus()的枚举值做额外处理,可以自己写一个转换函数:
#include <string> #include <ilcplex/ilocplex.h> // 自定义枚举转字符串函数 std::string cplexStatusToString(IloCplex::Status status) { switch(status) { case IloCplex::Optimal: return "最优解"; case IloCplex::Infeasible: return "不可行"; case IloCplex::Unbounded: return "无界"; case IloCplex::TimeLimitExceeded: return "超时"; case IloCplex::Aborted: return "求解中断"; // 可以根据你的需求添加更多状态分支 default: return "未知状态"; } } // 循环中调用这个函数 LP_STATUS.push_back(cplexStatusToString(cplex.getCplexStatus()));
补充说明
IloCplex::Status枚举包含了所有CPLEX求解的可能状态,你可以查看CPLEX的头文件ilcplex/ilocplex.h获取完整的枚举列表。- 不管用哪种方法,转换后的字符串都可以直接存入
vector<string>,之后写入文件的逻辑就和普通字符串操作一样了。
内容的提问来源于stack exchange,提问作者rasul
相关产品推荐
相关产品推荐

