我试图在cvxpy中解决一个优化程序。问题在于它返回的答案违反了它所给出的基本约束。我以前成功地运行过这个程序,并试图模拟与以前相同的代码,但这个问题让我困惑了哪里出了问题。任何帮助都将不胜感激
我试图解决的优化问题:
obj funct: maximize 0.1a1 + 0.1428a2 + 0.2a3
s.t 7a1 + 11a2 + 16a3 <= 80
a1, a2, a3 > =0, all integers
当我运行下面的代码时,a1、a2和a3的值为5,这违反了给定的约束
import cvxpy as cvx
import numpy as np
import scipy as sc
from scipy import linalg
#Define Starting Matrix
A1 = np.array([10,0,0])
A2 = np.array([0,7,0])
A3 = np.array([0,0,5])
#Optimal Basis and Inverse
B = np.array([A1, A2, A3])
print(f"B:{B}")
Binv = linalg.inv(B)
print(f"B-1:{Binv}")
#Define Cost Matrix
c = np.array([1, 1, 1])
#Optimal Dual Solution, y.hat
yhat = np.matmul(c,Binv)
print(f"y.hat:{yhat}")
#Pricing Problem
a = cvx.Variable(shape=(3,1), name="a")
w = np.array([[7,11,16]])
#Define Obj Function
objective2 = cvx.Maximize(cvx.matmul(yhat,a))
#Define Constraints
constraint2 = [
cvx.matmul(a,w)<=80,
a >=0
]
#Define Problem and Solve
knapsack = cvx.Problem(objective2, constraint2)
solution2 = knapsack.solve()
print(solution2)
print(a.value)
2.2142857137502494
[[5.]
[5.]
[5.]]
你的维度被打破了
与以下各项的矩阵乘法:
结果:
您可以轻松验证这一点:
您可能需要将列向量a更改为行向量a。这也意味着对w(以及我不想提及的其他表达式)进行转置:
相关问题 更多 >
编程相关推荐