Scipy中如何在输入值总和不超1000约束下求解线性函数最小值
问题根源
- 原代码使用的
TNC求解器仅支持变量的独立取值边界约束,完全不具备自定义不等式约束的处理能力,因此“两输入值总和不超过1000”的规则没有被纳入求解逻辑,输出(1000,1000)是该方法在独立边界下的正常计算结果。 - 要实现带加总约束的求解,需要切换到支持自定义约束的求解器,可选的适配方法包括
SLSQP、trust-constr,二者都可同时兼容原有独立边界和新加的线性约束。
代码调整方案
scipy的不等式约束有固定定义规则:要求约束函数的返回值必须≥0,因此把“x[0] + x[1] ≤ 1000”等价转换为“1000 - x[0] -x[1] ≥0”,按字典格式传入求解参数即可。
调整后的完整可运行代码如下:
# 定义总和约束 sum_limit_constraint = { "type": "ineq", "fun": lambda x: 1000 - x[0] - x[1] } # 保留原有的独立变量边界设置 bounds = ((0.0, 1000.0), (0.0, 1000.0)) # 替换求解方法为支持约束的SLSQP,传入自定义约束 opt_result = scipy.optimize.minimize( objective, x0=(0, 0), method="SLSQP", bounds=bounds, constraints=[sum_limit_constraint] ) # 通过opt_result.x即可获取满足所有约束的最优输入对
注意事项
- 如果后续需要加入更多复杂约束、或者追求更高的收敛精度,可以把求解方法替换为
trust-constr,该方法对线性/非线性约束的适配稳定性优于SLSQP。 - 求解完成后可手动校验约束满足情况:返回的最优输入对一定会满足
x[0]+x[1] ≤1000,不会再出现两个变量同时达到独立边界上限的情况。
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

