矩阵形式的简单符号 LP 问题
Simple Symbolic LP problem to Matrix form
我解决了一个线性规划问题,这是我的符号形式代码。
import cvxpy as cp
import numpy as np
x11 = cp.Variable(nonneg=True)
x12 = cp.Variable(nonneg=True)
x21 = cp.Variable(nonneg=True)
x22 = cp.Variable(nonneg=True)
x31 = cp.Variable(nonneg=True)
x32 = cp.Variable(nonneg=True)
constraints = [x11 + x12 == 1000,
x21 + x22 == 1500,
x31 + x32 == 1200,
x11 + x21 + x31 == 2300,
x12 + x22 + x32 == 1400]
obj = cp.Minimize((80*x11 + 215*x12 + 100*x21 + 108*x22 + 102*x31 + 68*x32))
prob = cp.Problem(obj, constraints)
prob.solve()
print('status: ', prob.status)
print('optimal value: ', prob.value)
print('optimal variables: ', x11.value, x12.value, x21.value, x22.value, x31.value, x32.value)
状态:最优
最优值:313200.00003146095
最佳变量:999.9999999627637 3.7235625579412695e-08 1299.99999940076 200.00000059923934 6.364774533690845e-07 1199.999=994[36352]
但是我想把这段代码改成矩阵形式。这是我的另一个矩阵形式代码
x = cp.Variable((3, 2), nonneg=True)
constraints = [cp.sum(x[0,:]) == 1000,
cp.sum(x[1,:]) == 1500,
cp.sum(x[2,:]) == 1200,
cp.sum(x[:, 0]) == 2300,
cp.sum(x[:, 1]) == 1400]
coe = [[80, 215], [100, 108], [102, 68]]
t
obj = cp.Minimize(cp.sum(coe @ x))
prob = cp.Problem(obj, constraints)
prob.solve()
print('status: ', prob.status)
print('optimal value: ', prob.value)
for i in range(3):
for j in range(2):
print('optimal variables:x('+str(i)+','+str(j)+')', x[i,j].value)
状态:最优
最优值:810999.9999986519
最佳 variables:x(0,0) 649.9892627159586
最优 variables:x(0,1) 350.01073728291954
最佳variables:x(1,0) 900.0113075911175
最佳 variables:x(1,1) 599.9886924056102
最优 variables:x(2,0) 749.9994296884455
最优 variables:x(2,1) 450.00057030957413
我想结果应该是一样的,矩阵形式的代码是错误的。你能找出我的错误吗?
在处理矩阵乘法时一定要小心,尤其是在不同的库上。我发现 @
用于矩阵乘法。而不是 element-wise
乘法。参见 cvxpy
's official documents。
在 @
乘法期间,cvxpy 以某种方式误解了您的目标。
解决方法:
将 obj = cp.Minimize(cp.sum(coe @ x))
更改为
obj = cp.Minimize(cp.sum(cp.multiply(coe, x.T)))
(我也很困惑为什么 coe
被认为是 (2x3))
我解决了一个线性规划问题,这是我的符号形式代码。
import cvxpy as cp
import numpy as np
x11 = cp.Variable(nonneg=True)
x12 = cp.Variable(nonneg=True)
x21 = cp.Variable(nonneg=True)
x22 = cp.Variable(nonneg=True)
x31 = cp.Variable(nonneg=True)
x32 = cp.Variable(nonneg=True)
constraints = [x11 + x12 == 1000,
x21 + x22 == 1500,
x31 + x32 == 1200,
x11 + x21 + x31 == 2300,
x12 + x22 + x32 == 1400]
obj = cp.Minimize((80*x11 + 215*x12 + 100*x21 + 108*x22 + 102*x31 + 68*x32))
prob = cp.Problem(obj, constraints)
prob.solve()
print('status: ', prob.status)
print('optimal value: ', prob.value)
print('optimal variables: ', x11.value, x12.value, x21.value, x22.value, x31.value, x32.value)
状态:最优
最优值:313200.00003146095
最佳变量:999.9999999627637 3.7235625579412695e-08 1299.99999940076 200.00000059923934 6.364774533690845e-07 1199.999=994[36352]
但是我想把这段代码改成矩阵形式。这是我的另一个矩阵形式代码
x = cp.Variable((3, 2), nonneg=True)
constraints = [cp.sum(x[0,:]) == 1000,
cp.sum(x[1,:]) == 1500,
cp.sum(x[2,:]) == 1200,
cp.sum(x[:, 0]) == 2300,
cp.sum(x[:, 1]) == 1400]
coe = [[80, 215], [100, 108], [102, 68]]
t
obj = cp.Minimize(cp.sum(coe @ x))
prob = cp.Problem(obj, constraints)
prob.solve()
print('status: ', prob.status)
print('optimal value: ', prob.value)
for i in range(3):
for j in range(2):
print('optimal variables:x('+str(i)+','+str(j)+')', x[i,j].value)
状态:最优
最优值:810999.9999986519
最佳 variables:x(0,0) 649.9892627159586
最优 variables:x(0,1) 350.01073728291954
最佳variables:x(1,0) 900.0113075911175
最佳 variables:x(1,1) 599.9886924056102
最优 variables:x(2,0) 749.9994296884455
最优 variables:x(2,1) 450.00057030957413
我想结果应该是一样的,矩阵形式的代码是错误的。你能找出我的错误吗?
在处理矩阵乘法时一定要小心,尤其是在不同的库上。我发现 @
用于矩阵乘法。而不是 element-wise
乘法。参见 cvxpy
's official documents。
在 @
乘法期间,cvxpy 以某种方式误解了您的目标。
解决方法:
将 obj = cp.Minimize(cp.sum(coe @ x))
更改为
obj = cp.Minimize(cp.sum(cp.multiply(coe, x.T)))
(我也很困惑为什么 coe
被认为是 (2x3))