SciPy (á¡áá¶ááœáẠSai pie) ááẠC ááŸáá·áº Fortran á á¬ááŒáá·áºááá¯ááºáá»á¬ážáá«áááºááá·áº ááááºážá¡ááŒá±áá¶áááºá¹áá»á¬á¡áá¯ááºáá áºáá¯ááŒá áºáááºá SciPy ááẠáááºáá¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºáá±á¬ Python á ááºááŸááºááᯠMATLABá IDLá Octaveá R ááá¯á·ááá¯áẠSciLab áá²á·ááá¯á· ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ á¡áá»ááºá¡áááºáááá¹áá¶áááºáááºážáá»ááºá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áá±ážáááºá
á€áá±á¬ááºážáá«ážááœááºá scipy.optimize áááºáá±á·áá»áºááᯠá¡áá¯á¶ážááŒá¯á ááááºážááŸááºáá»á¬ážá
áœá¬á scalar áá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠá¡ááŒá±á¡áá±á¡á ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºáá¯ááºáá±á¬ááºááŒááºážááá¯ááºáᬠááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážáá¬ááœáẠáááºá¹áá»á¬áááá¯ááááºáá±ážááœá²ááŒááºážá á¡ááŒá±áá¶áááºážááá¬áá»á¬ážááᯠááŒáá·áºááŸá¯áá«áááºá á¡áá¬ážá¡áá®ážáááŸá ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážááá¯ááºáᬠá¡ááºáááá¯áá®áááºáá»á¬ážááᯠááœá±ážááœá±ážááŒá®ážááŒá
áºáááºá
áááá«ááºáž
scipy.optimize áááºáá±á·ááºá»ááŸá á¡ááŒá±á¡áá±á¡áááŸáá·áº á¡áá¬ážá¡áá®ážáááŸááá±á¬ ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážáááºá¡ááœáẠáá¯á¶á¡ááºáá¬áá±á·á
áºááᯠáá¯ááºáá±á¬ááºáá»ááºá áá¶á·ááá¯ážáá±ážáá¬ážáááºá minimize()
. ááá¯á·áá±á¬áºáááºáž ááŒá¿áá¬á¡á¬ážáá¯á¶ážááᯠááŒá±ááŸááºážááẠuniversal method áááŸáááŒá±á¬ááºáž ááááŸááá¬ážáá±á¬ááŒá±á¬áá·áº áá¯á¶áá±á¬ááºáá±á¬áááºážáááºážááᯠááœá±ážáá»ááºááŒááºážááẠá¡ááŒá²áááºáž áá¯áá±áá®á ááá¯á¶ážáá±á«áºááœáẠáá»áá±á¬ááºáá±áá«áááºá
function argument ááá¯á¡áá¯á¶ážááŒá¯á ááá·áºáá»á±á¬áºáá±á¬ optimization algorithm ááá¯áááºááŸááºáá¬ážáááºá minimize(..., method="")
.
ááááºážááŸááºáá»á¬ážá
áœá¬á áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á á¡ááŒá±á¡áá±ááŸááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºáááºá¡ááœááºá á¡á±á¬ááºáá«áááºážáááºážáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááº-
trust-constr
â áá¯á¶ááŒááºá áááºáá»ááá±á¬áá±áááŸá áá±ááá¹ááá¡áááá·áºáá¯á¶ážááᯠááŸá¬ááœá±áá«ááá®áá®áá±á¬ááºážáá«áž ,Habre ááá±á¬ááºážáá«áž ;SLSQP
- ááá·áºáááºáá»ááºáá»á¬ážááŸáá·áºá¡áá° áááºááá¯áẠáá±ážáá±á¬áá·áºáá¯á¶á ᶠáááá¯ááááºáá±ážááœá²ááŒááºážá Lagrange á áá áºá¡á¬áž ááŒá±ááŸááºážáááºá¡ááœáẠNewtonian áááºážáááºážááá®áá®áá±á¬ááºážáá«áž .TNC
- ááŒááºáá±á¬ááºáá¬ážáá±á¬ ááá°áááºá¡á¬áž ááá·áºáááºáá¬ážáá±á¬á ááá·áºáááºáá¬ážáá±á¬ áááºáá«áááºáá«ááŒá¯áá¯ááºááŸá¯áá»á¬ážá áá®ážááŒá¬ážááááºážááŸááºáá»á¬ážá áœá¬ááŸáááá·áº ááá¯ááºážááá¯ááºáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡ááœáẠáá±á¬ááºážááœááºáááºááá®áá®áá±á¬ááºážáá«áž .L-BFGS-B
â BroydenâFletcherâGoldfarbâShanno á¡ááœá²á·á០áááºážáááºážáá áºáá¯á Hessian matrix á០vector áá»á¬ážááᯠáá áºá áááºáá áºááá¯ááºážáááºáá±ážááŒááºážááŒá±á¬áá·áº ááŸááºáá¬ááºáá¯á¶ážá áœá²ááŸá¯ áá»áŸá±á¬á·áá»ááŒááºážááŒáá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºááá®áá®áá±á¬ááºážáá«áž ,Habre ááá±á¬ááºážáá«áž .COBYLA
â Linear Approximation á¡á¬ážááŒáá·áº MARE ááá·áºáááºáá¬ážáá±á¬ á¡áá±á¬ááºážáá¯á¶ážááŒá áºá¡á±á¬ááºá linear approximation (gradient ááœááºáá»ááºááŒááºážáááŸááá²) ááŒáá·áº ááá·áºáááºáá¬ážáá±á¬ optimizationááá®áá®áá±á¬ááºážáá«áž .
ááœá±ážáá»ááºáá¬ážáá±á¬áááºážáááºážáá±á«áº áá°áááºá ááŒá¿áá¬ááŒá±ááŸááºážááŒááºážá¡ááœáẠá¡ááŒá±á¡áá±áá»á¬ážááŸáá·áº ááá·áºáááºáá»ááºáá»á¬ážááᯠááœá²ááŒá¬ážá áœá¬ áááºááŸááºáá¬ážáááº-
- class object áá«á
Bounds
áááºážáááºážáá»á¬ážá¡ááœáẠL-BFGS-B, TNC, SLSQP, trust-constr; - á
á¬áááºáž
(min, max)
áá°áá®áá±á¬áááºážáááºážáá»á¬ážá¡ááœáẠL-BFGS-B, TNC, SLSQP, trust-constr; - á¡áá¬ááá¹áá¯áá
áºáᯠááá¯á·ááá¯áẠá¡áá¬ááá¹áá¯áá»á¬ážá
á¬áááºáž
LinearConstraint
,NonlinearConstraint
COBYLAá SLSQPá áá¯á¶ááŒááºááŸá¯-constr áááºážáááºážáá»á¬ážá¡ááœááºá - á¡áááá¬áẠááá¯á·ááá¯áẠá¡áááá¬ááºá
á¬áááºáž
{'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt}
COBYLAá SLSQP áááºážáááºážáá»á¬ážá¡ááœááºá
áá±á¬ááºážáá«ážáá±á¬ááºááŒá±á¬ááºáž-
1) á¡áá¬ááá¹áá¯áá»á¬ážá¡ááŒá
ẠáááºááŸááºáá¬ážáá±á¬ ááá·áºáááºáá»ááºáá»á¬ážááŒáá·áº áá¯á¶ááŒááºá
áááºáá»ááá±á¬áá±á (method=âtrust-constrâ) ááœáẠá¡ááŒá±á¡áá±á¡ááá¯áẠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºáá¬ážáá±á¬ á¡ááºáááá¯áá®áááºááᯠá¡áá¯á¶ážááŒá¯ááẠá
ááºážá
á¬ážáá«á Bounds
, LinearConstraint
, NonlinearConstraint
;
2) á¡áááá¬ááºáá¯á¶á
á¶ááŒáá·áº áááºááŸááºáá¬ážáá±á¬ ááá·áºáááºáá»ááºáá»á¬ážááŒáá·áº á¡áááºážáá¯á¶áž á
áá¯áááºážáá¯á¶áááºážáááºáž (áááºážáááºáž = "SLSQP") ááᯠá¡áá¯á¶ážááŒá¯á áááºááá¯áẠáááá¯ááááºáá±ážááœá²ááŒááºážááᯠá
ááºážá
á¬ážáá«á {'type', 'fun', 'jac', 'args'}
;
3) áááºá
áá°áá®ááá¯áááá°áá¬ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá¯ááºáá¬ážáá±á¬áá¯ááºáá¯ááºáá»á¬ážá ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážáááá°áá¬ááᯠááá¯ááºážááŒá¬ážá
áááºááŒá¬áá«á
á¡ááŒá±á¡áá±á¡á ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážáááºážáááºáž = "trust-constr"
áááºážáááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá trust-constr
áá±á«áºá¡ááŒá±áá¶áá¬
áá±áá°áá»áá¯á¶á á¶ááœáẠá¡áááá·áºáá¯á¶ážááŸá¬ááœá±ááŒááºážááŒá¿áá¬á áááºá¹áá»á¬áá±á¬áºááŒá°áá¬
áááºážáá»ááºáá±á¬ áááºážáá°áá®áá»áŸááŸá¯ááá¯ááºáᬠááá·áºáááºáá»ááºáá»á¬ážá¡ááœááºá á¡á±á¬ááºáá±á¬ááºááᯠá¡áááºáá±á¬ááºááŸáá·áº áá®á
á±áááºá .
áá
áºáááºážáá±á¬ááºážááá·áºáááºáá»ááºá¡ááœááºá á¡áá±á«áº ááá¯á·ááá¯áẠá¡á±á¬áẠááá·áºáááºáá»ááºááᯠáááºááŸááºáááºá np.inf
áááºááá¯ááºáá±á¬ááá¹ááá¬ááŸáá·áºá¡áá°á
ááááºážááŸááºááŸá
áºáá¯á áá°áááá»á¬ážáá±á¬ Rosenbrock áá¯ááºáá±á¬ááºáá»ááºá á¡áááºážáá¯á¶ážááᯠááŸá¬ááœá±ááẠááá¯á¡ááºáá«á
á±-
á€ááá á¹á ááœááºá áááºážá á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááœáẠá¡á±á¬ááºáá«ááá·áºáááºáá»ááºáá»á¬ážááᯠáááºááŸááºáá¬ážáááº-
áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá áá°ážáá°ážááŒá¬ážááŒá¬ážááŒá±ááŸááºážáá»ááºáá
áºáá¯ááŸááááºá áááááŸáá·áº á
áá¯áá¹áááá·áºáááºáá»ááºáá»á¬ážáᬠá¡áá»á¯á¶ážáááºáááºá
á¡á±á¬ááºááŒá±ááá± á¡áá±á«áºááá± ááá·áºáááºáá»ááºááœá±ááᯠááŒááºááŒá®áž á¡á²áá«ááœá±ááᯠscipy áá²á· áááºááá¯áá±ážááá¯ááºááá²ááá¯áᬠááŒáá·áºááŒáá¡á±á¬ááºá
áááºá·ááẠО Bounds object ááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠáááºááŸááºááŒáá«á
áá¯á·á
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])
áááºá·ááẠО á¡á²áá«ááᯠlinear form áá²á·áá±ážááŒáá·áºáá¡á±á¬ááºá
á€ááá·áºáááºáá»ááºáá»á¬ážááᯠLinearConstraint object á¡ááŒá ẠáááºááŸááºááŒáá«á áá¯á·á
import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])
áá±á¬ááºáá¯á¶ážááœáẠmatrix áá¯á¶á á¶ááŒáá·áº linear ááá¯ááºáá±á¬ ááá·áºáááºáá»ááº
á€ááá·áºáááºáá»ááºá¡ááœáẠJacobi matrix ááŸáá·áº Hessian matrix á linear áá±á«ááºážá ááºááŸá¯ááᯠáááá¬ážáá±á¬ vector áá áºáá¯ááŒáá·áº áááºááŸááºááẠ:
ááᯠáá»áœááºá¯ááºááá¯á·ááẠááá¯ááºážááá¯ááºáá±á¬ ááá·áºáááºáá»ááºááᯠá¡áá¬ááá¹áá¯áá
áºáá¯á¡ááŒá
ẠáááºááŸááºááá¯ááºáá«ááŒá®á 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)
Hessian matrix ááᯠááœááºáá»ááºáá±á¬á¡áá« ááŒáá¯ážá
á¬ážá¡á¬ážáá¯ááºááŸá¯áá»á¬ážá
áœá¬ááá¯á¡ááºáááºá áááºáááºá¡áááºážááá¯áá¯á¶ážááá¯ááºáááºá HessianUpdateStrategy
BFGS
О SR1
.
from scipy.optimize import BFGS
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())
Hessian ááᯠá¡ááá·áºá¡áááºááŒáá·áº ááœááºáá»ááºááá¯ááºáááºá
nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')
á¡ááá·áºá¡áááºáá»á¬ážá¡ááœáẠJacobian matrix ááᯠá¡ááá·áºá¡áááºáá»á¬áž á¡ááá·áºá¡áááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááœááºáá»ááºááá¯ááºáááºá ááá¯á·áá±á¬áºáááºáž á€ááá á¹á ááœááºá Hessian matrix ááᯠá¡ááá·áºá¡áááºááŒáá·áº ááœááºáá»ááºááááá«á Hessian ááᯠfunction áá áºáá¯á¡ááŒá Ạááá¯á·ááá¯áẠ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]
ááá¯á¡ááºáá«áá Hessian ááœááºáá»ááºááŒááºážá¡ááœáẠfunction ááᯠLinearOperator class ááá¯á¡áá¯á¶ážááŒá¯á áááºááŸááºááá¯ááºáááºá
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)
ááá¯á·ááá¯áẠHessian á áá¯ááºáá¯ááºááŸáá·áº ááá·áºáááºáá±á¬ááºááŸáááá·áº áááá¬ážáá±á¬ vector áá
áºáᯠ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)
ááááºážá¡á¬ážááŒáá·áº ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºáá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºá áááááŸáá·áº áá¯áááááá·áºááœá¬ážáá»á¬ážááᯠá¡áá®ážá
ááºáá¯á¶áž ááá·áºááŸááºážááá¯ááºáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá Hessian ááẠáá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á ááá·áºááŸááºážááá¯ááºáááºá SR1
(ááá°ááá¯áá®áᶠá¡áá®ážá
ááºáá¯á¶áž)á á¡áá±á¬ááºá¡ááœá±ážááᯠá¡ááá·áºá¡áááºáááŸá ááœá²ááŒá¬ážááŸá¯áá»á¬ážááŒáá·áº ááá·áºááŸááºážááá¯ááºáááºá
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 ]
á¡áá±á¬ááºážáá¯á¶ážááŒá áºá¡á±á¬áẠá¥ááá¬
ááá¹á ááááºážááá¬ááœá²á·á ááºážáá¯á¶ááá¯á· áá°ážááŒá±á¬ááºážááŒááºážááŸáá·áºáááºáááºáá áá»áœááºá¯ááºááá¯á·á¡á¬áž áá±ážáááºáá±á¬áºáááºáž áááºááŒáááºáá±á¬ áááºááœá±áááŸáá á±ááá·áº áááºá áá°áá®ááá¯áá áºáá¯á ááá°áá¬ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá¯ááºááŸá¯ ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬áẠáá¯ááºáá±á¬ááºááŒááºážááᯠááŒáá·áºááŒáá«á áá¯á·á áá¯ááºáá¯ááºáá¯á¶ážáá»áá¯ážáá¯ááºáá¯ááºááá·áº Galley ááá«ááá¯ááºáá¬á¡ááŒá Ạáá»áœááºá¯ááºááá¯á·ááᯠá áááºáá°ážááŒáá·áºááŒáá«á áá¯á·á
- x0 - 10 tr ááŸáááºážáááºáá±á¬á á¬áá»ááºááŸá¬áá»á¬ážááá¯áá±á¬ááºážáá»áááºá
- x1 - 20 tr á០áá±á¬áºááá¯ááááºáááºááºááá¯ááºáá»á¬ážá
- x2 - 30 tr á០á¡áœááºááá¯ááºážá ááá¯ážáá»á¬ážá
áá»áœááºá¯ááºááá¯á·á áá±á¬áºááœá±áá±á¬ á¡áá¯ááºá¡ááœá²á·ááœáẠá¡áááºáááºážáá±ážáŠážá á¡áááºáááºáž ááŸá áºáŠážááŸáá·áº á¡ááŒá®ážáááºážáá áºáŠážááá¯á· áá«áááºáááºá áááºážááá¯á·á áá áẠá¡áá¯ááºáá»áááºáááºáá¯á¶ááœá±-
- ááœááºááá»á¬áž
4 * 150 = 600 Ñел * ÑаÑ
, - á¡áááº-
2 * 150 = 300 Ñел * ÑаÑ
, - Senor-
150 Ñел * ÑаÑ
.
ááááá¯á¶ážáááŸáááá¯ááºáá±á¬ á¡áááºáááºážááẠá¡áá»áá¯ážá¡á á¬áž (x0á x1á x2)á á¡áááºáááºáž - (10á 20á 30)á á¡ááŒá®ážáááºáž - (7á 15á 20) á¡áá»áá¯ážá¡á á¬ážááá¯ááºáá áºáá¯á ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááŸáá·áº ááŒáá·áºáá»ááºááŸá¯ááœáẠ(ááá ááá áá) áá¬áá®ááᯠáá¯á¶ážá áœá²ááœáá·áºááŒá¯áá«á ) áááºážáááá²á· á¡áá±á¬ááºážáá¯á¶ážá¡áá»áááºáá¬áá®á
áá¬áá¬ááºáá«ááá¯ááºáá¬áá»á¬ážáá²á·ááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááẠáá
ááºá¡ááŒááºá¡á
áœááºážáá»á¬ážááᯠá¡áá»á¬ážáá¯á¶ážááá°ááá¯áá«áááºá á¡á±á¬ááºááŒááºááŸá¯á áááááŒá±ááŸááºážááŸá¬ áááºááŸááºážáá»ááºáá¯ááºáá±á¬ááºáá»ááºááᯠáá»áá±ážáááºááŒá
áºáááºá 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 Ñел * ÑаÑ
; - Senor-
8 * 5 + 6 * 10 + 3 * 15 = 145 Ñел * ÑаÑ
.
áááá¯á¶ážáá»á¯ááº- áá«ááá¯ááºáá¬ááẠáááºážá ááá¯ááºáááºáá±á¬ á¡ááŒáá·áºáá¯á¶ážááᯠáááºáá¶áááŸááááºá¡ááœáẠáááºážáááºááá·áºá á¬áá»ááºááŸá¬ á áá¯á á¡áááºá á¬ážááá¯áẠá áá¯ááŸáá·áº áá áºááá»áŸáẠá ááá¯ážááá¯áẠá áᯠáááºáá®ážááẠá¡áá±á¬ááºážáá¯á¶ážááŒá áºáááºá á€ááá á¹á ááœááºá á¡ááŒá®ážáááºážáááºá ááºááá¯ááá»áŸá±á¬áºáá²áááºááá¯ážááááºááŒá áºááŒá®ážá á¡áááºáááºážáá»á¬ážááááºáááºááá·áºááŸááºážááŒá±á¡á¬ážááŒáá·áº 8/6 ááŒá áºáááá·áºáááºá áááºáááºáá»á¬ážáááºáááºáááºáááºážáááºá
áá±á¬ááºáá»ááº
áá±á¬ááºážáá«ážááœáẠáááºáá±á·áá»áºááŒáá·áºáá¯ááºáá±á¬ááºááẠá¡ááŒá±áá¶áááºážááá¬áá»á¬ážááᯠá¡áá»ááºážáá»á¯ááºáá±á¬áºááŒáá¬ážáááºá scipy.optimize
á¡ááŒá±á¡áá±á¡á áááºážáá«ážááŸá¯ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááẠá¡áá¯á¶ážááŒá¯áááºá ááá¯ááºááá¯ááºááá¯ááºáá» áá¯á¶ážáá«áááºá scipy
ááá¬áááºááá¯ááºáᬠáááºááœááºáá»ááºá¡ááœáẠáááºáááºááŒá
áºáá±á¬ááŒá±á¬áá·áº áá±ážáá¬ážáá±á¬ á¥ááá¬ááẠáááºá
áá¬áá±á¬ááºážáá±á¬ ááá±á¬ááá¬áááŒá
áºáááºá
á¥ááá¬á¡á¬ážááŒáá·áº I.L. Akulich á âá¥ááá¬áá»á¬ážááŸáá·áº ááŒá¿áá¬áá»á¬ážááœáẠáááºá¹áá»á¬áááá¯ááááºáá±ážááœá²ááŒááºážâ á
á¬á¡á¯ááºááœáẠáá®á¡áá¯áá®ááŸáá·áº á¡áá¯á¡áá±á¬ááºá¥ááá¬áá»á¬ážá
áœá¬ááᯠááœá±á·ááŸáááá¯ááºáááºá ááá¯ááá¯ááŒááºážáááºáá±á¬áá»áŸá±á¬ááºááœáŸá¬ scipy.optimize
áá¯á¶á¡á
á¯á¶á០3D ááœá²á·á
ááºážáá¯á¶ááᯠáááºáá±á¬ááºááẠ(
ááááºážá¡áá»ááºá¡áááºáá¡áááá¡áááºážá¡ááŒá
áºááŸá¬ scipy
ááŸááŒáá¯ááá¯áá«áááºá
СпаÑОбП
source: www.habr.com