使用linprog时触发ValueError:A_ub必须为二维数组的问题求助
使用linprog时触发ValueError:A_ub必须为二维数组的问题求助
问题描述
我在用linprog做线性规划计算的时候,一直碰到这个ValueError,但我检查了A_ub和c的尺寸,明明是一致的,实在搞不明白问题出在哪。
我的代码如下:
import numpy as np from scipy.optimize import linprog A_eq = np.array([[1,0,0,0,0,1], [0,1,0,-1.05,1,0], [-0.4,-0.3,1,0,-1.05,1]]) b_eq = np.array([200,100,0]) A_ub = [0,0,0,-1,-1,-1] b_ub = -300 c = np.array([1.2, 1.3, 1.3, 0, 0, 1.05]) res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=[0, None])
运行后触发的错误:
ValueError: Invalid input for linprog: A_ub must have exactly two dimensions, and the number of columns in A_ub must be equal to the size of c
问题分析与解决方法
兄弟,问题就出在你定义的A_ub上!你现在把它写成了一维列表,但linprog明确要求A_ub必须是二维数组——哪怕你只有一行约束条件,也得用二维的结构来表示。
你看你的c是长度为6的数组,A_ub虽然元素个数刚好是6,但它是一维的,不符合linprog的输入规范。解决方法超简单,把A_ub改成二维形式就行,有两种常用方式:
- 方式一:用
np.array包裹成二维数组,多套一层括号A_ub = np.array([[0,0,0,-1,-1,-1]]) - 方式二:直接写成嵌套列表
A_ub = [[0,0,0,-1,-1,-1]]
另外还有个小细节:你的b_ub当前是单个数值,虽然linprog会自动兼容,但最好也改成一维数组或列表,比如b_ub = [-300],这样代码风格更统一,也能避免一些潜在的小问题。
修改后的完整代码示例:
import numpy as np from scipy.optimize import linprog A_eq = np.array([[1,0,0,0,0,1], [0,1,0,-1.05,1,0], [-0.4,-0.3,1,0,-1.05,1]]) b_eq = np.array([200,100,0]) A_ub = np.array([[0,0,0,-1,-1,-1]]) b_ub = [-300] c = np.array([1.2, 1.3, 1.3, 0, 0, 1.05]) res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=[0, None])
这样运行应该就不会再触发这个ValueError了,你可以试试!
备注:内容来源于stack exchange,提问作者Azil559
相关产品推荐
相关产品推荐

