SciPy (á³áá áá áá£áá) á áá¥á áá ášá°áá°ášá° ášáá³á¥ á¥á á á²áá á á°ášááªá C á¥á Fortran á€á°-áá»áááµá á«á«áµá³áᢠSciPy ášá¥ááµáá á ááá°ááá ášáááá ááá áá á¥áá° MATLABᣠIDLᣠOctaveᣠR ááá SciLab áá³á ášá°áá ášááᥠá³áááµ á á«á£á¢ áááá ááá¢
á áá
áœáá ááµá¥ ᣠášáá³á¥ áá®áá«ááœá áá°ášá³á áŽááá®áœá á¥áááášá³áá - ááá³á ášááá»ážáµ áœáá®áœá á scipy.optimize á¥á
á á áá áá áá¥á á°áááá®áœ scalar á°áá£á ááá³áµá¢ á«áá°áá°á ášááá»ážáµ áµáá° ááá®áœ á áµááµá ááááµ á°á°ááá á³áá¢
ááá¢á«
á scipy.optimize á¥á
á ááµá¥ ááá±áá ááá³á á¥á á«áá°áá°á ášááá»ážáµ áœáá®áœá áááá³áµ á ááµ ášá°ááá° á áááᜠá á°áá£á© ááá§á minimize()
. ááá á¥áá áááá áœáá®áœ áááá³áµ ááá ááááµ ááá á ááá áᎠá¥áá°áá áá³ááá, áµááá
á á áᎠááášá¥, á¥áá° áááá, á á°áá«ááªá áµášá» áá áááá³á.
áµááááá ášááá»ážáµ áµáá° ááá ášá°áá£á ááááá á áá áá áááá»áᢠminimize(..., method="")
.
ášá áá«á³ á°áááá®áœá á°áá£á ááá³á ááá»ážáµ ášáášá°ááµá ááŽáᜠá°áá£á«á áááµášá ááááá¡-
trust-constr
- á á«áµ áá°ááá ááá ááµá¥ ášá á«á£á¢á áá á°á ááááá¢ášá᪠áá£á¥á ,á hub áá áá£á¥á ;SLSQP
- á°ášá³á³á á³áµá«á²á áá®áá«ááá ášá¥áá³áᜠáá ᣠášááá«áá áµáááµá áááá³áµ ášááá¶áá«á ááŽá¢ášá᪠áá£á¥á .TNC
- ášá°áášá ááá°á ášá°áá°á ᣠášá°áá°á ášáµáááᜠá¥ááµá£ á¥á áá» á°áááá®áœ á«ááµ ášááµáá áá áááá á°áá£á«áµ á¥á©á¢ášá᪠áá£á¥á .L-BFGS-B
- áš Broyden-Fletcher-Goldfarb-Shanno á¡áµá ášá°áá ááŽá£ ášáá²á«á ááµáªááµ á¬áá°á á ášáá á áá«á áááá«áµ á á°ááá° ášáá á°áš áµááµá³ ááá³ ášá°á°áá ášá¢ášá᪠áá£á¥á ,á hub áá áá£á¥á .COBYLA
â MARE ášá°áá°á ááá»ážáµ á ááµáá«á ááá³áᣠášá°áá°á ááá»ážáµ á ááµáá«á ááá³á (á«á ááµ á ááµ áµááµ)á¢ášá᪠áá£á¥á .
á á°áášá á áᎠáá á áááµášáµ áœáá©á áááá³áµ ááá³áᜠá¥á áá°áŠáœ á á°ááš ááááµ á°ááá áá-
- ááá ááá
Bounds
ááŽáᜠL-BFGS-B, TNC, SLSQP, á¥áááµ-constr; - áááá
(min, max)
áá°áá³á³á ááŽáᜠL-BFGS-B, TNC, SLSQP, trust-constr; - áá ááá ášááá®áœ áááá
LinearConstraint
,NonlinearConstraint
á COBYLA, SLSQP, á¥áááµ-ášááá£á á ááŽááœ; - áááá áááµ ááá ášáááá -áááµ áááá
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
á COBYLA, SLSQP ááŽááœ.
ášáœáá ááááá¡-
1) ááá³á ášáá»á»á« áµáá°-ááá á á á°á« ááá ááµá¥ (áᎠ= "trust-constr") á¥áá° á¥ááᜠášá°ááá¹ áá°áŠáœ áá áá ááá á«áµá¡á áµá¢ Bounds
, LinearConstraint
, NonlinearConstraint
;
2) á áááá áááµ ááá ášá°ááá¹ áá°áŠáœ áá á áµáá¹ ášá«á¬áᜠáᎠ(áᎠ= "SLSQP") á áá áá á°ášá³á³á áá®áá«ááœá á«áµá¡á áµá¢ {'type', 'fun', 'jac', 'args'}
;
3) ášáµá áµá±á²á®á áá³á á áá áá ášá°áášá± ááá¶áœá ášááá»ážáµ áá³á áá°ááµáá¢
ááá³á ášáá»á»á« ááŽ="trust-constr"
ááŽáá áá°áá á trust-constr
á ááá á°ááµáá¶
á á á ááá á á áá á°á ášááááµ áœáá ášáá³á¥ áááá¡-
áá áá«á« ášá¥á©áááµ áá°áŠáœ, ášá³áœáá áá°á ášáááá áá°á áá á¥á©á áá .
áá ááµ-ááááµ áá°á¥, ášáááá ááá ášá³áœáá áá°á¥ á°ááá
á·á np.inf
ášá°ááá
ááááµ áá.
ášáááµ á°áááá®áœ ášáá³áá
áš Rosenbrock á°áá£á áá
á°ááá ááááµ á áµááá áááá¢
á áá áá᳠ᣠášáášá°ááµ áá°áŠáœ á á¥á± áµááá áá á°ááá áá-
á á¥á ááá³, á áá¥á¡ áá áá© ášáá áááµá á á , ááá
á ášááááªá«á á¥á á á«á°áá á¥áá³áᜠá¥á» ášáá°á© áážá.
á¥áá³áá¹á ášá³áœ á¥áµáš áá á¥ááá á¥á á¥ááŽáµ á á³áá á¥ááœáážá ášáááá á¥áááášáµá¢
áá°áŠáœ О ášáŠáááµáµ áááá á áá áá á¥áááááá¢
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])
áá°áŠáœ О á ááµáá«á ááá á¥ááœááá¡-
á¥ááá á áá°áŠáœ á¥áá° LinearConstraint ááá á¥ááááážáá¡-
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])
á¥á á áášášá»á á ááµáªááµ ááµá¥ á«áá á«áá°ááá° áá°á¥
ášá«ááá¥á ááµáªááµ ááá áá°á¥ á¥á ášáá²á«á ááµáªááµ ášáááá° á¬áá°á áá á«ááá ášááµáá á¥áá á¥ááááááᢠ:
á áá ááµáá ášáááá áá°á¥ á¥áá° áá áááá
á¥ááœááá NonlinearConstraint
:
from scipy.optimize import NonlinearConstraint
def cons_f(x):
return [x[0]**2 + x[1], x[0]**2 - x[1]]
def cons_J(x):
return [[2*x[0], 1], [2*x[0], -1]]
def cons_H(x, v):
return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)
áá á áµáá ášááᣠááµáªááµ á¥áá²á á á¥áá± áááᜠááœááá¡-
from scipy.sparse import csc_matrix
def cons_H_sparse(x, v):
return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_sparse)
ááá á¥áá° áá LinearOperator
:
from scipy.sparse.linalg import LinearOperator
def cons_H_linear_operator(x, v):
def matvec(p):
return np.array([p[0]*2*(v[0]+v[1]), 0])
return LinearOperator((2, 2), matvec=matvec)
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
jac=cons_J, hess=cons_H_linear_operator)
ášáá²á«á ááµáªááµ á²á°á á¥á á¥ášáµ áá ááá, áááá áá áá ááœáá HessianUpdateStrategy
BFGS
О SR1
.
from scipy.optimize import BFGS
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())
áá²á«á á¥áá²á ááµá áá©áá¶áœá á áá áá áá°á ááœáá-
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')
ášá«á®á¢á«á ááµáªááµ ááá°áŠáœ á¥áá²á ááµá áá©áá¶áœá á áá áá áá°á ááœááᢠááá áá, á áá ááá³ ááµá¥ ášáá²á«á ááµáªááµ ášáášášá» áá©áá¶áœá á áá áá áá°á á ááœáá. áá²á«á á¥áá° á°áá£á ááá ášHessianUpdateStrategy áááá á áá áá áááᜠá áá áµá¢
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())
ášááá»ážáµ áœáá áááµáá áá áá áááµááá¢
from scipy.optimize import minimize
from scipy.optimize import rosen, rosen_der, rosen_hess, rosen_hess_prod
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 8, CG iterations: 7, optimality: 2.99e-09, constraint violation: 1.11e-16, execution time: 0.033 s.
[0.41494531 0.17010937]
á áµááá ášáá, áá²á«áá áááµááµ á«áá á°áá£á LinearOperator áááá á áá áá áááᜠááœáá
def rosen_hess_linop(x):
def matvec(p):
return rosen_hess_prod(x, p)
return LinearOperator((2, 2), matvec=matvec)
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess_linop,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
ááá ášáá²á«á áááµ á¥á ášáááá° á¬áá°á á áááªá«á á á©á hessp
:
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hessp=rosen_hess_prod,
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
á á áá«áᣠá¥ášá°áá»áž á«áá á°áá£á ášááááªá« á¥á ááá°á á°ááœáŠáᜠá áááµ áá°ášá ááœááᢠááá³á, áá²á«á á°áá£á©á á áá áá áá á ááœáá SR1
(quasi-Newtonian approximation)ᢠášáá«á²ášááµ áá±á á áá áá©áá¶áœ áá á ááœááá¢
from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr', jac="2-point", hess=SR1(),
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
ááá³á ášááá»ážáµ áᎠ= "SLSQP"
áš SLSQP áᎠá ááµ á°áá£áá á á á¹ ášááááµ áœáá®áœá áááá³áµ ášá°áá°á ááá¡-
ášáµ О - á á¥á©áááµ ááá á á¥á©áááµ ááá áá°áŠáœá ášáááá¹ áááá«áᜠá ááááœá¢ - áá°áá£á© áẠáá« ášá³áœáá á¥á ášáááá áµáá á®áœ áµá¥áµáŠáœá¢
ááµáá«á á¥á áá¥á°á á«ááá áá°áŠáœ á áááá -áááµ ááá ášáááᜠáá á°ááážááᢠtype
, fun
О jac
.
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
1 - x [0] ** 2 - x [1],
1 - x [0] ** 2 + x [1]]),
'jac': lambda x: np.array ([[- 1.0, -2.0],
[-2 * x [0], -1.0],
[-2 * x [0], 1.0]])
}
eq_cons = {'type': 'eq',
'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
'jac': lambda x: np.array ([2.0, 1.0])
}
ášáá á°ááá ááá á áášá°áá ááááµ áášáááá.
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
bounds=bounds)
print(res.x)
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
ášááá»ážáµ áá³á
áá° á ááµá°áá ášáŽáááá ááá á ášáážááá áá á°á«áá ášáᥠáµá±á²á®á áá³á á áá áá ášáááµ ááá»ážáµá á¥áá áá á áµáᜠáá ášá°ášáá áᢠá«áµáááááᢠá¥áµá² á¥á«á³áœáá á¥áá° á¶áµáµ á áááµ ááá¶áœá ášáá«áááµ áá á³áá¬áá°á á áµááá á¥ááµá¥á¢
- x0 - ášáášáá« ááŸáœá áážá¥, áš 10 tr.
- x1 - ášá®ááá¬áµ áµá á£á¢á«ááœ, áš 20 tr.
- x2 - ášááµáá áá áá°á¥á®áœ, áš 30 tr.
ášá¥á áá³áá ášáµá« á¡áµá á á«áµ ááášáᣠáááµ áá«ášáá á¥á á ááµ á²áášá á«á«áµá³áᢠášá¥áá± áááá ášáµá« áá áááµá¡-
- á°áááœá¡-
4 * 150 = 600 Ñел * ÑаÑ
, - ááá
2 * 150 = 300 Ñел * ÑаÑ
, - áŽááá¡
150 Ñел * ÑаÑ
.
ášááááªá«á ášááá ááášá (0 ᣠ1 ᣠ2) á°áá³áµá á á ááµ ááááµ á£á¢á« (x10 ᣠx20 ᣠx30) ᣠáá«ášáá - (7 ᣠ15 ᣠ20) ᣠášáá°á - (5 ᣠ10 ᣠ15) áááµ á¥á áá°áá«áµ áá á«á³áá ᢠ) ášá áááµá ááᥠáá á°áá³áµá¢
áá á¥áá° ááááá áá°á á á³áá¬áá°áᣠáááá áµááá ášá ááµášá á¥ááááááᢠááµá¬áµ ášááááªá«á á¥ááá ášááááá á°áá£á ááá áá value
á áá ášá°áášá± ááá¶áœ ášáᢠáá á:
def value(x):
return - 10*x[0] - 20*x[1] - 30*x[2]
áá áµá á°áµ á áá°áá ášáá°ááá á²ááá ášáááá á°áá£á á á°áá«áá ááááµ áááá³á.
áá£á© á¥ááá á°á«á°áá»áœá ášáá á á áá á¥áá³áá°á© áášáášá á¥á á áµá« á°ááµ áá áá°áŠáœá ááµá°ááá ááá¡-
áá á¥á©á ááá¡-
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([600 - 10 * x [0] - 20 * x [1] - 30 * x[2],
300 - 7 * x [0] - 15 * x [1] - 20 * x[2],
150 - 5 * x [0] - 10 * x [1] - 15 * x[2]])
}
áá°á á áá°á¥ ášáááµ áá ááµ á ááá³á á¥á» ááá á áá áµá¡-
bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])
á¥á á áášášá»á ᣠá á£á á áµá°á³áœ áááµ á áá
á°á áá á¥á ášáá°á á¥á«áµ áááá«áµ ᣠá°áµá°á á°áá áᜠáášá áá¥á á«áááášá¥ áá°áááᢠášá°áá°á ášááá»ážáµ áœááá á ááá³áµ áá á áááµášáµ áááá ášáááµ áá ááœá á¥á«á³áœáá ááášá¥ á¥ááœááá scipy.optimize
:
x0 = np.array([10, 10, 10])
res = minimize(value, x0, method='SLSQP', constraints=ineq_cons, bounds=bnds)
print(res.x)
[7.85714286 5.71428571 3.57142857]
áá° áá áá¥á®áœ á¥ááá« á¥á áááá ášáááááœá áááµ á á¥á© ášáááµ áµáááµ á¥áá°áᢠx = (8, 6, 3)
:
- á°áááœá¡-
8 * 10 + 6 * 20 + 3 * 30 = 290 Ñел * ÑаÑ
; - ááá
8 * 7 + 6 * 15 + 3 * 20 = 206 Ñел * ÑаÑ
; - áŽááá¡
8 * 5 + 6 * 10 + 3 * 15 = 145 Ñел * ÑаÑ
.
áá ááá«-á³áá¬áá°á© ášááá£áá ášáá°ááá áááá á ᣠ8 áášáá« ááŸáœá ᣠ6 áá«ášáá áá á á«áážáá á£á¢á«ááœá á¥á 3 áá°á¥á®áœá á áá ááá á á¥á© ááᢠá áá ááá³ á²áášá ášááœá áá á¥á á³á«á áášáµ á áá ᵠᣠášááááá¹ áááµ á áááµ 2/3 ᣠááášááá¹ ášááᜠá á³áœ ááááá¢
áá°áá°áá«
áœáá ášá¥á
á áá áááµá«áµ áá°ášá³á áŽááá®áœá ááášáá«á scipy.optimize
, ááá³á ášááááµ áœáá®áœá áááá³áµ á«ááááá. á áá á¥á ááááᢠscipy
áá á«á³áá ááá á¥á» ááᣠááá
á áá ášá°á°á á áá³á á¥áá°áá
á áááµ á áµáá á°áá¥á® ášáááá¢
á¥á ááµá áá³áŠáœ á¥á ááá£á áá³ááᜠááá³á á IL Akulich ááœáá ááµá¥ "á áá³ááᜠá¥á áœáá®áœ ááµá¥ ášáá³á¥ áá®áá«ááœ" áááá. á°ášá᪠áááµá®á áá°áá áªá« scipy.optimize
ášááµáᜠáµá¥áµá¥ áš 3 á² ááá
á ááááá£áµ (
ááá ášáášá ááá ááᢠscipy
á¥áá©á á á°á
á áá¡
СпаÑОбП
ááá: hab.com