glpk.js存在可行解却返回无原始可行解问题求助
GLPK.js求解含负整数变量ILP时返回无解的问题解决
问题核心结论
你的问题并非需要开启负整数解支持——GLPK.js的generals(一般整数变量)默认允许所有整数取值(正、负、零),无需额外配置。真正的原因是你在构建约束时犯了参数配置错误,导致约束冲突,求解器才返回无解。
具体错误分析
1. p变量的非负约束配置错误
你的基础ILP要求p0 >= 0、p1 >=0等,但在JSON配置的c0-c7约束中,你错误地设置了:
{"name":"c0","vars":[{"name":"p0","coef":1}],"bnds":{"type":2,"ub":0,"lb":0}}
GLPK中type:2对应下界约束(GLP_LO),但你同时将ub设为0,这等价于强制p0=0(0 ≤ p0 ≤0)。而你在第二个案例的额外约束中又要求p0=1(c21),这直接造成约束冲突,求解器自然返回无解。
正确配置:只设置下界为0,不限制上界(或设为极大值):
{"name":"c0","vars":[{"name":"p0","coef":1}],"bnds":{"type":2,"lb":0}}
或使用双向约束类型(type:4),上界设为极大值:
{"name":"c0","vars":[{"name":"p0","coef":1}],"bnds":{"type":4,"lb":0,"ub":1e9}}
2. 总和约束配置错误
你的基础ILP要求p0+p1+...+p7 >=1,但JSON的c8约束错误设置为:
{"name":"c8","vars":[...],"bnds":{"type":2,"ub":0,"lb":1}}
type:2是下界约束,仅需指定lb,ub会被忽略,但你错误设置的ub:0会被GLPK解析为矛盾约束(要求总和≥1且≤0)。
正确配置:
{"name":"c8","vars":[{"name":"p0","coef":1},{"name":"p1","coef":1},...],"bnds":{"type":2,"lb":1}}
验证修正效果
修正上述约束后,第二个案例中p0=1、其余p变量=0、rise0=-1的解将满足所有约束:
- 所有p变量≥0(符合修正后的非负约束)
- p变量总和=1≥1(符合总和约束)
- 代入
c9约束:p1 - p0 - rise0 = 0 -1 - (-1) =0(满足等式) - 其余rise变量为0,对应约束全部满足
此时GLPK.js将正常返回该可行解。
内容的提问来源于stack exchange,提问作者Minop
相关产品推荐
相关产品推荐

