我试图用下面所示的约束来解决这个线性规划函数,答案是x1和x2应该分别2和6,并且目标函数的值应该等于36.我写的代码给了我答案4和3.我可能做错了什么?功能最大化z=3*x1 + 5*x2.限制是x1 <= 4; 2*x2 <=12; 3*x1 + 2*x2 <= 18; x1>=0; x2>=0.
import numpy as np
from scipy.optimize import minimize
def objective(x, sign=1.0):
x1 = x[0]
x2 = x[1]
return sign*((3*x1) + (5*x2))
def constraint1(x, sign=1.0):
return sign*(3*x[0] +2*x[1]- 18.0)
x0=[0,0]
b1 = (0,4)
b2 = (0,12)
bnds= (b1,b2)
con1 = {'type': 'ineq', 'fun': constraint1}
cons = [con1]
sol = minimize (objective,x0,method='SLSQP',bounds=bnds,constraints=cons)
print(sol)
Run Code Online (Sandbox Code Playgroud)
您的代码存在以下问题:
objective方式minimize导致最小化而不是目标的最大化.如果要最大化 objective,minimize则应将sign参数设置为-1.请参阅scipy 文档中的最大化示例.minimize假设约束函数返回的值大于零.因此,您编写约束的方式意味着3*x1 + 2*x2 - 18.0 >=0,而实际约束使用<=.b2不对应于约束隐含的边界2*x2 <= 12.如果有人想要工作代码,就在下面。我还添加了 cvx。解决方案是 x: array([2., 6.])
def objective(x, sign=-1.0):
x1 = x[0]
x2 = x[1]
return sign*(3*x1 + 5*x2)
def constraint1(x):
return 18.0 - 3*x[0] -2*x[1]
x0 = [0,0]
b1 = (0,4)
b2 = (0,6)
bnds= (b1,b2)
con1 = {'type': 'ineq', 'fun': constraint1}
cons = [con1]
sol = minimize(objective, x0, method='SLSQP', bounds = bnds, constraints = cons)
print(sol)
Run Code Online (Sandbox Code Playgroud)
# Create two scalar optimization variables (CVXPY Variable)
x1 = cp.Variable()
x2 = cp.Variable()
# Create two constraints (Python list)
constraints = [3*x1 + 2*x2 <= 18, x1 >= 0, x2 >= 0, x1 <=4, x2 <= 6]
# Form objective
obj = cp.Maximize(3*x1 + 5*x2)
# Form and solve problem
prob = cp.Problem(obj, constraints)
prob.solve() # Returns the optimal value.
print("status:", prob.status)
print("optimal value", np.round(prob.value, 5))
print("optimal var", np.round(x1.value, 5), np.round(x2.value, 5))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13887 次 |
| 最近记录: |