繁体   English   中英

使用 Scipy 最大化优化

[英]Maximize Optimization using Scipy

我试图用下面显示的约束来解决这个线性规划函数, x1x2的答案应该分别是26 ,目标函数的值应该等于36 我写的代码给出了答案43 我可能做错了什么? 最大化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)

您的代码存在以下问题:

  • 您传递objectiveminimize导致objective最小化而不是最大化 如果你想用minimize最大化objective ,你应该将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)

CVXPY

 # 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM