SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy (akpọ sai pie) bụ ngwungwu mgbakọ na mwepụ nwere ọnụọgụgụ nke gụnyekwara ọba akwụkwọ C na Fortran. SciPy na-atụgharị nnọkọ Python gị ka ọ bụrụ gburugburu sayensị data zuru oke dịka MATLAB, IDL, Octave, R, ma ọ bụ SciLab.

N'isiokwu a, anyị ga-eleba anya na usoro ndị bụ isi nke mmemme mgbakọ na mwepụ - idozi nsogbu njikarịcha ọnọdụ maka ọrụ scalar nke ọtụtụ mgbanwe site na iji ngwugwu scipy.optimize. A tụlelarị algọridim maka njikarịcha na-enweghị mgbochi ikpeazụ isiokwu. Enwere ike nweta enyemaka zuru ezu na nke ọhụrụ na ọrụ scipy mgbe niile site na iji iwu enyemaka (), Shift + Tab ma ọ bụ na akwụkwọ ikike.

Okwu Mmalite

Otu interface a na-ahụkarị maka idozi ma nsogbu njikarịcha ọnọdụ na nke na-enweghị isi na ngwugwu scipy.optimize bụ ọrụ a na-enye. minimize(). Otú ọ dị, a maara na ọ dịghị usoro zuru ụwa ọnụ iji dozie nsogbu niile, ya mere nhọrọ nke usoro zuru oke, dị ka mgbe niile, na-adaba n'ubu onye nyocha.
A na-akọwapụta njikarịcha algorithm kwesịrị ekwesị site na iji arụmụka ọrụ minimize(..., method="").
Maka njikarịcha ọnọdụ nke ọrụ dị iche iche, mmejuputa usoro ndị a dị:

  • trust-constr - chọọ opekempe mpaghara na mpaghara ntụkwasị obi. Edemede Wiki, akụkọ na Habré;
  • SLSQP - mmemme quadratic usoro nke nwere ihe mgbochi, usoro Newtonian maka idozi sistemụ Lagrange. Edemede Wiki.
  • TNC - Truncated Newton Constrained, ọnụ ọgụgụ dị nta nke iterations, dị mma maka ọrụ ndị na-abụghị nke nwere ọnụ ọgụgụ dị ukwuu nke mgbanwe ndị nwere onwe ha. Edemede Wiki.
  • L-BFGS-B - usoro sitere na ndị otu Broyden-Fletcher-Goldfarb-Shanno, ejiri mbelata oriri ebe nchekwa etinyere n'ihi ntinye akụkụ nke vectors sitere na matrix Hessian. Edemede Wiki, akụkọ na Habré.
  • COBYLA - MARE mmachibidoro njikarịcha site na nso nso Linear, njikarịcha mmachi yana oke ahịrị (na-enweghị mgbako gradient). Edemede Wiki.

Dabere na usoro ahọpụtara, edobere ọnọdụ na mgbochi maka idozi nsogbu ahụ n'ụzọ dị iche:

  • ihe klas Bounds maka ụzọ L-BFGS-B, TNC, SLSQP, ntụkwasị obi-constr;
  • ndepụta (min, max) maka otu ụzọ L-BFGS-B, TNC, SLSQP, ntụkwasị obi-constr;
  • ihe ma ọ bụ ndepụta ihe LinearConstraint, NonlinearConstraint maka COBYLA, SLSQP, ụzọ ntụkwasị obi-constr;
  • akwụkwọ ọkọwa okwu ma ọ bụ ndepụta ọkọwa okwu {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} maka COBYLA, ụzọ SLSQP.

Nkọwa edemede:
1) Tụlee iji algorithm njikarịcha ọnọdụ na mpaghara ntụkwasị obi (usoro = "trust-constr") nwere ihe mgbochi akọwapụtara dị ka ihe. Bounds, LinearConstraint, NonlinearConstraint ;
2) Tụlee usoro mmemme n'usoro site na iji usoro opekata mpe mpe mpe mpe mpe mpe akwa (Usoro = "SLSQP") nwere mmachi akọwapụtara n'ụdị ọkọwa okwu. {'type', 'fun', 'jac', 'args'};
3) Nyochaa ihe atụ nke njikarịcha ngwaahịa emepụtara site na iji ihe atụ nke ụlọ ọrụ webụ.

Usoro nkwalite ọnọdụ = "trust-constr"

Mmejuputa usoro trust-constr dabere na EQSQP maka nsogbu na mgbochi nke ụdị nha anya na na IPBỌỌ maka nsogbu na mgbochi n'ụdị ahaghị nhata. A na-etinye usoro abụọ a site na algọridim maka ịchọta opekempe mpaghara na mpaghara ntụkwasị obi ma dabara nke ọma maka nnukwu nsogbu.

Usoro mgbakọ na mwepụ nke nsogbu ịchọta opekempe n'ụdị izugbe:

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

Maka mmachi nha nhata siri ike, a na-edozi oke ala ya ka nke elu SciPy, njikarịcha na ọnọdụ.
Maka mmachi otu ụzọ, edobere oke elu ma ọ bụ nke ala np.inf ya na akara kwekọrọ.
Ka ọ dị mkpa ịchọta opekempe nke ọrụ Rosenbrock amaara nke mgbanwe abụọ:

SciPy, njikarịcha na ọnọdụ

N'okwu a, edobere mmachi ndị a na ngalaba nkọwa ya:

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

N'ọnọdụ anyị, enwere ngwọta pụrụ iche n'oge ahụ SciPy, njikarịcha na ọnọdụ, nke naanị ihe mgbochi mbụ na nke anọ dị irè.
Ka anyị gabiga ihe mgbochi ahụ site na ala ruo n'elu wee lelee ka anyị ga-esi dee ha na scipy.
Mgbochi SciPy, njikarịcha na ọnọdụ и SciPy, njikarịcha na ọnọdụ ka anyị jiri ihe agbụ akọwa ya.

from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])

Mgbochi SciPy, njikarịcha na ọnọdụ и SciPy, njikarịcha na ọnọdụ Ka anyị dee ya n'ụdị ahịrị:

SciPy, njikarịcha na ọnọdụ

Ka anyị kọwapụta ihe mgbochi ndị a dị ka ihe LinearConstraint:

import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

Na n'ikpeazụ mmachi na-abụghị online na matrix ụdị:

SciPy, njikarịcha na ọnọdụ

Anyị na-akọwapụta matrix Jacobian maka mmachi a yana njikọ ahịrị ahịrị nke matriks Hessian nwere vector aka ike. SciPy, njikarịcha na ọnọdụ:

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

Ugbu a, anyị nwere ike ịkọwa ihe mgbochi na-enweghị isi dị ka ihe 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)

Ọ bụrụ na nha ya buru ibu, enwere ike ịkọwapụta matrices n'ụdị obere:

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)

ma ọ bụ dị ka ihe 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)

Mgbe ị na-agbakọ matrix Hessian SciPy, njikarịcha na ọnọdụ chọrọ mgbalị dị ukwuu, ị nwere ike iji klas HessianUpdateStrategy. Atụmatụ ndị a dị: BFGS и SR1.

from scipy.optimize import BFGS

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())

Enwere ike gbakọọ Hessian site na iji oke dị iche iche:

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')

Enwere ike gbakọọ matrix Jacobian maka ihe mgbochi site na iji oke dị iche iche. Agbanyeghị, na nke a enweghị ike ịgbakọ matrix Hessian site na iji oke dị iche iche. A ga-akọwarịrị Hessian dị ka ọrụ ma ọ bụ iji klas HessianUpdateStrategy.

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())

Ihe ngwọta maka nsogbu njikarịcha dị ka nke a:

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]

Ọ bụrụ na ọ dị mkpa, enwere ike ịkọwa ọrụ maka ịgbakọ Hessian site na iji klas 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)

ma ọ bụ ngwaahịa nke Hessian na vector aka ike site na oke 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)

N'aka nke ọzọ, usoro nke mbụ na nke abụọ nke ọrụ a na-eme ka ọ dị mma nwere ike ime ihe. Dịka ọmụmaatụ, Hessian nwere ike iji ọrụ ahụ mee ihe SR1 (ụkpụrụ nke Newtonian). Enwere ike ịgbado gradient ahụ site na oke dị iche iche.

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)

Usoro nkwalite ọnọdụ = "SLSQP"

Emebere usoro SLSQP iji dozie nsogbu nke ibelata ọrụ n'ụdị:

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

SciPy, njikarịcha na ọnọdụ

Ebee SciPy, njikarịcha na ọnọdụ и SciPy, njikarịcha na ọnọdụ - tent nke indices nke okwu na-akọwa mmachi n'ụdị nhata ma ọ bụ ahaghị nhata. SciPy, njikarịcha na ọnọdụ - nhazi nke ala na elu maka ngalaba nkọwa nke ọrụ ahụ.

A kọwapụtara mmachi ahịrị na enweghị usoro n'ụdị ọkọwa okwu nwere igodo 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])
          }

A na-achọ opekempe dị ka ndị a:

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 ]

Ihe atụ kacha mma

N'ihe metụtara mgbanwe na usoro teknụzụ nke ise, ka anyị lelee njikarịcha mmepụta site na iji ihe atụ nke ụlọ ọrụ weebụ, nke na-ewetara anyị obere ego mana kwụsiri ike. Ka anyị were onwe anyị dịka onye nduzi ụgbọ mmiri na-emepụta ụdị ngwaahịa atọ:

  • x0 - ire ​​ibe ọdịda, site na 10 tr.
  • x1 - webụsaịtị ụlọ ọrụ, site na 20 tr.
  • x2 - ụlọ ahịa dị n'ịntanetị, site na 30 tr.

Ndị otu ọrụ enyi anyị gụnyere ndị obere anọ, ndị etiti abụọ na otu agadi. Ego oge ọrụ ha kwa ọnwa:

  • June: 4 * 150 = 600 чел * час,
  • etiti: 2 * 150 = 300 чел * час,
  • senor: 150 чел * час.

Ka ndị mbụ dị obere nọrọ (0, 1, 2) awa na mmepe na nkenye nke otu saịtị nke ụdị (x10, x20, x30), n'etiti - (7, 15, 20), agadi - (5, 10, 15). ) awa nke oge kacha mma nke ndụ gị.

Dị ka onye nduzi nkịtị ọ bụla, anyị chọrọ ịbawanye uru kwa ọnwa. Nzọụkwụ mbụ iji nweta ihe ịga nke ọma bụ idetu ebumnuche ebumnuche value dị ka ego a na-enweta site na ngwaahịa ndị a na-emepụta kwa ọnwa:

def value(x):
    return - 10*x[0] - 20*x[1] - 30*x[2]

Nke a abụghị njehie;

Nzọụkwụ ọzọ bụ igbochi ndị ọrụ anyị ịrụbiga ọrụ ókè na iwebata ihe mgbochi na oge ọrụ:

SciPy, njikarịcha na ọnọdụ

Kedu ihe nhata:

SciPy, njikarịcha na ọnọdụ

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]])
            }

Mmachibido iwu bụ na mmepụta ngwaahịa ga-abụrịrị nke ọma:

bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])

N'ikpeazụ, echiche kachasị mma bụ na n'ihi ọnụ ahịa dị ala na ịdị elu dị elu, ndị ahịa nwere afọ ojuju na-akwụ ụgwọ maka anyị mgbe niile. Anyị nwere ike họrọ mpịakọta mmepụta kwa ọnwa n'onwe anyị, dabere na idozi nsogbu njikarịcha mmachi 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]

Ka anyị were nkesa ngwaahịa kacha mma gbakọọ ibu nke ndị ọkwọ ụgbọ ala kwa ọnwa. x = (8, 6, 3) :

  • June: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
  • etiti: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
  • senor: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.

Nkwubi okwu: ka onye nduzi wee nweta oke ya kwesịrị ekwesị, ọ dị mma ịmepụta ibe ọdịda 8, saịtị 6 ọkara na ụlọ ahịa 3 kwa ọnwa. N'okwu a, ndị agadi ga-egwu ala n'eleghị anya site na igwe, ibu nke etiti ga-abụ ihe dịka 2/3, ndị na-eto eto na-erughị ọkara.

nkwubi

Isiokwu ahụ na-akọwapụta usoro ndị bụ isi maka ịrụ ọrụ na ngwugwu scipy.optimize, eji dozie nsogbu mbelata ọnọdụ. Onwe m m na-eji scipy naanị maka ebumnuche agụmakwụkwọ, ya mere ihe atụ e nyere bụ ụdị ihe ọchị dị otú ahụ.

Enwere ike ịchọta ọtụtụ tiori na ihe atụ, dịka ọmụmaatụ, n'akwụkwọ nke IL Akulich "Mathematical programming na ihe atụ na nsogbu." Ngwa hardcore karịa scipy.optimize iji wuo ihe owuwu 3D site na onyonyo onyonyo (akụkọ na Habré) enwere ike ịlele na akwụkwọ nri scipy.

Isi mmalite nke ozi bụ docs.scipy.orgndị chọrọ inye aka na ntụgharị asụsụ nke ngalaba a na ndị ọzọ scipy Nnọọ na GitHub.

Achọpụta mephistophees maka ikere òkè na nkwadebe nke mbipụta.

isi: www.habr.com

Zụta nnabata ntụkwasị obi maka saịtị nwere nchekwa DDoS, sava VPS VDS 🔥 Zụta ebe nrụọrụ weebụ a pụrụ ịtụkwasị obi na nchekwa DDoS, sava VPS VDS | ProHoster