[GLPK][Java] 整数变量求解无法得到整数解问题求助
嘿,我来帮你排查下这个问题——明明给所有列都设了整数类型,却还是得到分数解,确实挺闹心的。我整理了几个常见的排查方向,你可以逐一试试:
先确认整数约束真的被正确应用了
有时候代码里的设置可能有疏漏:比如是不是只给部分列设置了整数类型?或者调用设置类型的方法时参数错了(比如把GLPK的GLP_IV写成了GLP_CV连续型)?你可以在求解前加一段代码,打印每一列的类型信息,确认所有需要整数的变量都被标记成了整数类型,避免“以为设置了但实际没生效”的情况。检查求解器是不是用错了模式
GLPK默认是求解普通线性规划(LP)的,如果你调用的是glp_simplex这类单纯形法求解函数,那就算设置了整数约束,它也会直接忽略,返回LP的分数解。你得确保调用的是整数规划求解方法,也就是glp_intopt,这样求解器才会处理整数约束。排查模型本身的合理性
有没有可能模型里的约束或者变量上下界导致整数解不存在?比如某个约束是x + y = 0.5,那哪怕x和y都是整数变量,也不可能有整数解,这时候求解器会返回LP的可行分数解。另外,检查下变量的上下界是不是不小心设成了非整数,比如给某个整数变量设了0 <= x <= 1.5,那求解器可能会返回1.5这样的分数。调整GLPK的求解参数
看看是不是参数配置让求解器“放水”了:比如整数容差(tol_int)设置得太大,导致求解器把接近整数的分数当成整数返回;或者有没有开启某些松弛选项?你可以把容差调小到比如1e-6,确保求解器严格满足整数约束,同时检查glp_iocp里的参数,有没有禁用整数规划相关的选项。确认模型构建过程没有覆盖约束
有没有可能在设置完整数约束之后,又修改了模型(比如动态添加列、调整约束),但没给新的变量设置整数类型?或者求解前不小心重新初始化了模型,导致之前的整数约束被清空了?可以梳理下代码的执行顺序,确保整数约束是在模型构建完成后、求解前最后设置的。
内容的提问来源于stack exchange,提问作者Adrien Varet

