如何使用Soplex求解零目标函数?报_rationalLP != 0错误如何修复?
问题修复方案
报错的核心原因是默认初始化的
SoPlex实例仅开启了实数(double)求解模式,没有分配有理数求解所需的_rationalLP实例指针,调用addColRational接口时触发了断言校验失败。
修复方案一:直接使用有理数类型求解器实例(推荐)
把默认的SoPlex对象定义替换为SoPlexRational类型,初始化时直接进入有理数求解模式:
// 原代码 // SoPlex mysoplex; // 修改为 SoPlexRational mysoplex;
修改后后续所有Rational后缀的接口都可以正常调用,不需要额外配置。
修复方案二:手动切换到有理数模式
如果需要保留原有实数模式的部分逻辑,可以在调用任何Rational接口前,手动触发模式切换:
SoPlex mysoplex; mysoplex.setIntParam(SoPlex::OBJSENSE, SoPlex::OBJSENSE_MINIMIZE); // 新增这一行切换到有理数模式 mysoplex.switchToRational();
切换完成后再调用addColRational等接口即可正常运行。
注意事项
- 切换到有理数模式后,所有增列、增行、参数配置操作都要使用带
Rational后缀的对应接口,不要和Real后缀的实数接口混用,避免出现类型不匹配异常。 - 有理数接口使用精确分数运算,仅在原实数接口因为数值稳定性问题导致迭代次数过多时,才会出现求解速度提升的效果。如果本身模型数值没有问题,有理数运算开销会高于实数运算,若后续速度不达预期可以优先检查模型稀疏性优化。
内容的提问来源于stack exchange,提问作者Chia Teck Yan
相关产品推荐
相关产品推荐

