32

Python での制約付き非線形最適化の推奨パッケージは何ですか?

私が解決しようとしている特定の問題は次のとおりです。

未知のX(Nx1) があり、M(Nx1)uベクトルとM(NxN)s行列があります。

max [5th percentile of (ui_T*X), i in 1 to M]
st 
0<=X<=1 and
[95th percentile of (X_T*si*X), i in 1 to M]<= constant

u問題を開始したとき、との見積もりは 1 つしかなく、 でs上記の問題を解くことができましたcvxpy

uと の 1 つの推定ではなく、値の分布全体があることに気付きました。そのsため、分布全体を使用できるように目的関数を変更したいと考えました。上記の問題の説明は、その情報を意味のある方法で含めようとする私の試みです。

cvxpyを使用してこれを解決することはできません。試してみましscipy.optimize.annealたが、未知の値に境界を設定できないようです。私も見ましたpulpが、非線形制約は許可されていません。

4

4 に答える 4

16

scipy制約付き非線形最適化のための素晴らしいパッケージがあります。

optimize docを読むことから始めることができますが、SLSQP の例を次に示します。

minimize(func, [-1.0,1.0], args=(-1.0,), jac=func_deriv, constraints=cons, method='SLSQP', options={'disp': True})
于 2014-02-13T21:27:16.837 に答える
12

他の人もコメントしているように、SciPy 最小化パッケージは開始するのに適した場所です。また、 Python Gekko ペーパー(セクション 4 を参照)には、他の多くの最適化パッケージのレビューもあります。以下の例 (Hock Schittkowski #71 ベンチマーク) には、目的関数、等式制約、不等式制約が含まれていScipy.optimize.minimizeます。

import numpy as np
from scipy.optimize import minimize

def objective(x):
    return x[0]*x[3]*(x[0]+x[1]+x[2])+x[2]

def constraint1(x):
    return x[0]*x[1]*x[2]*x[3]-25.0

def constraint2(x):
    sum_eq = 40.0
    for i in range(4):
        sum_eq = sum_eq - x[i]**2
    return sum_eq

# initial guesses
n = 4
x0 = np.zeros(n)
x0[0] = 1.0
x0[1] = 5.0
x0[2] = 5.0
x0[3] = 1.0

# show initial objective
print('Initial SSE Objective: ' + str(objective(x0)))

# optimize
b = (1.0,5.0)
bnds = (b, b, b, b)
con1 = {'type': 'ineq', 'fun': constraint1} 
con2 = {'type': 'eq', 'fun': constraint2}
cons = ([con1,con2])
solution = minimize(objective,x0,method='SLSQP',\
                    bounds=bnds,constraints=cons)
x = solution.x

# show final objective
print('Final SSE Objective: ' + str(objective(x)))

# print solution
print('Solution')
print('x1 = ' + str(x[0]))
print('x2 = ' + str(x[1]))
print('x3 = ' + str(x[2]))
print('x4 = ' + str(x[3]))

Python Gekko での同じ問題は次のとおりです。

from gekko import GEKKO
m = GEKKO()
x1,x2,x3,x4 = m.Array(m.Var,4,lb=1,ub=5)
x1.value = 1; x2.value = 5; x3.value = 5; x4.value = 1

m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Minimize(x1*x4*(x1+x2+x3)+x3)

m.solve(disp=False)
print(x1.value,x2.value,x3.value,x4.value)

SLSQP で問題を解決できない場合は、Python の非線形計画法ソルバーに関するより包括的なディスカッション スレッドもあります。ソルバーの方法に関する追加情報が必要な場合は、工学設計の最適化に関する私のコース資料を利用できます。

于 2016-12-23T05:56:38.180 に答える