我有一个优化问题,其中约束之一是:
(x_i 的加权和) = 常数。
这是例子:
# Solving: ones @ x -> min
# weights 1D-array (n)
ones = np.ones_like(weights)
coefficient = 1/2 * len(weights) * np.prod(weights)
# constrain I want: weights @ x == coefficient
scipy.optimize.linprog
需要 2D 数组作为等式约束的系数矩阵,并需要 1D 数组作为右侧部分。但就我而言,我有一维数组作为系数(可以很容易地转换为对角矩阵)。
右侧部分也有系数,我们无法将其转换为向量,因为有很多变体,其总和相同但值 x_i 不同,因此我们不能只约束所有 x_i 值。
您应该如何解决此类包含的问题?
我明白了。您可以为系数创建 2D 数组,为右侧部分创建 1D 数组,就像这样。
b_eq = np.zeros_like(weights, dtype=np.float64)
b_eq = len(weights)
A_eq_tmp = np.zeros((len(C), len(C)))
A_eq_tmp[0] = 2/weights
所以基本上你用零填充整个矩阵,并且右边的部分也是如此。然后,用您的权重填充矩阵中的一行,并在右侧部分填充一个值。