如何在Python线性规划中正确设置上下界?linprog参数报错求解
解决scipy linprog中上下界(bounds)的维度错误问题
你的错误是因为linprog的bounds参数格式不对——它要求为每个决策变量单独指定(下界, 上界)的二元组,最终组成一个长度等于变量数的列表(这里是4个变量,所以列表要有4个二元组)。你之前把所有下界打包成一个元组、所有上界打包成另一个元组再放进列表,相当于给了2个4元素的元组,完全不符合要求。
两种修改方法:
方法1:手动构造每个变量的上下界对
直接为每个变量写出对应的(下界, 上界):bounds = [(0, 6500), (0, 8200), (0, 2300), (0, 1000)]方法2:用zip自动配对(更高效)
利用Python的zip函数,把lb和ub中对应位置的元素自动配对,生成符合要求的结构:bounds = list(zip(lb, ub))
修改后的完整代码:
from scipy.optimize import linprog f = [612.03, 619, 617.13, 923] A = [[-94, -96, -94.3, -118.6], [-83.7, -83, -87.6, -89.7], [1.02, 0.51, 0, 0], [203.9, 214.5, 27.88, 78.2], [53.6, 70.7, 71.5, 5.95], [14.9, 0, 0, 0], [35.1, 73.7, 0, 0], [0, 0, 0, 34.7], [0, 0, 0, 100]] b = [-95 * 8000, -85 * 8000, 8000, 210 * 8000, 90 * 8000, 18 * 8000, 35 * 8000, 2.7 * 8000, 5 * 8000] Aeq = [[1, 1, 1, 1]] beq = [8000] lb = (0, 0, 0, 0) ub = (6500, 8200, 2300, 1000) # 修改bounds的构造方式 bounds = list(zip(lb, ub)) x = linprog(c=f, A_ub=A, b_ub=b, A_eq=Aeq, b_eq=beq, bounds=bounds) print(x)
额外说明:
如果某个变量没有下界(允许负无穷)或上界(允许正无穷),可以用None代替对应的边界值,比如某个变量下界不限、上界为1000,就写(None, 1000)。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

