2017-09-02 3 views
0

の不等式条件指定された変数を最小限に抑えるためにscipyのダウンロードを使用して、私は次の目的関数を最小化したいと思います:実験として、他の変数

enter image description here

W1およびW2のパラメータはラムダで囲まれています。

enter image description here

enter image description here

制約は次のとおりです。

enter image description here

私はこのような多変量ケースを最適化する方法についてのまともなscipyのダウンロードの例を発見していません。誰かがこの問題についての指針を貸すことができたら、私はそれを感謝します。

答えて

2

コード:

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. ] 

これだけthe official docsからの情報を使用して、基本的です。

編集ここでは一般的な最適化機能を使用しましたが、これはLPですので、おそらくscipy.optimize.linprogを使用してください。

私はそれをチェックしませんでしたが、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: -0.0 
message: 'Optimization terminated successfully.' 
nit: 4 
slack: array([ 0., 3.]) 
status: 0 
success: True 
    x: array([-0.14285714, 1.14285714, 0.  , 0.  ]) 
+0

グレートソリューション。これありがとう。 – MLhacker

関連する問題