Python 在给定其他变量不等式条件下,使用Scipy最小化变量

Python 在给定其他变量不等式条件下,使用Scipy最小化变量,python,scipy,Python,Scipy,作为一个实验,我想最小化以下目标函数: 参数w1和w2由lambda限定: 限制条件如下: 我还没有找到一个像样的例子来说明如何优化这样的多变量情况。如果有人能就这个问题提供指导,我将不胜感激。代码: import numpy as np from scipy.optimize import minimize def fun(x): return np.sum(x[2:]) x0 = np.zeros(4) # lambda1, lambda 2, w1, w2 cons =

作为一个实验,我想最小化以下目标函数:

参数w1和w2由lambda限定:

限制条件如下:

我还没有找到一个像样的例子来说明如何优化这样的多变量情况。如果有人能就这个问题提供指导,我将不胜感激。

代码:

import numpy as np
from scipy.optimize import minimize

def fun(x):
  return np.sum(x[2:])

x0 = np.zeros(4)  # lambda1, lambda 2, w1, w2
cons = ({'type': 'ineq', 'fun': lambda x:  x[2] - 2 + 10 * x[0] + 3 * x[1]},
        {'type': 'ineq', 'fun': lambda x:  x[3] - 2 + 5 * x[0] + 5 * x[1]},
        {'type': 'ineq', 'fun': lambda x:  x[2]},
        {'type': 'ineq', 'fun': lambda x:  x[3]},
        {'type': 'eq', 'fun': lambda x:  x[0] + x[1] - 1})
res = minimize(fun, x0, constraints=cons)
print(res)
print(np.round(res.x, 2))
输出:

fun: -3.3306690738754696e-16
jac: array([ 0.,  0.,  1.,  1.])
message: 'Optimization terminated successfully.'
nfev: 7
nit: 1
njev: 1
status: 0
success: True
  x: array([  5.00000000e-01,   5.00000000e-01,  -3.33066907e-16,
    0.00000000e+00])
[ 0.5  0.5 -0.   0. ]
 fun: -0.0
 message: 'Optimization terminated successfully.'
 nit: 4
 slack: array([ 0.,  3.])
 status: 0
 success: True
   x: array([-0.14285714,  1.14285714,  0.        ,  0.        ])
这基本上只使用来自的信息

编辑我在这里使用了常规优化函数,但您可能应该使用scipy.optimize.linprog,因为这是一个LP

我没有检查它,但linprog的用法看起来有点像:

from scipy.optimize import linprog
c = [0, 0, 1, 1]
A = [[-10, -3, -1, 0], [-5, -5, 0, -1]]
b = [-2, -2]
A_eq = [[1, 1, 0, 0]]
b_eq = [1]
x0_bnds = (-np.inf, -np.inf, 0, 0)
x1_bnds = (np.inf, np.inf, np.inf, np.inf)
res = linprog(c, A, b, A_eq, b_eq, bounds=list(zip(x0_bnds, x1_bnds)))
print(res)
输出:

fun: -3.3306690738754696e-16
jac: array([ 0.,  0.,  1.,  1.])
message: 'Optimization terminated successfully.'
nfev: 7
nit: 1
njev: 1
status: 0
success: True
  x: array([  5.00000000e-01,   5.00000000e-01,  -3.33066907e-16,
    0.00000000e+00])
[ 0.5  0.5 -0.   0. ]
 fun: -0.0
 message: 'Optimization terminated successfully.'
 nit: 4
 slack: array([ 0.,  3.])
 status: 0
 success: True
   x: array([-0.14285714,  1.14285714,  0.        ,  0.        ])

很好的解决方案。谢谢你。