SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

Ko te SciPy (ko te sai pie te whakahua) he kohinga pangarau-a-numpy kei roto hoki nga whare pukapuka C me Fortran. Ka huri a SciPy i to wahanga Python tauwhitiwhiti hei taiao putaiao raraunga oti penei i te MATLAB, IDL, Octave, R, SciLab ranei.

I roto i tenei tuhinga, ka titiro tatou ki nga tikanga taketake o te hotaka pangarau - whakaoti rapanga arotautanga herenga mo te mahi scalar o etahi taurangi ma te whakamahi i te kete scipy.optimize. Kua korerohia nga algorithm arotautanga kore herea i roto Tuhinga whakamutunga. Ka taea te tiki i nga wa katoa he awhina mo nga mahi scipy ma te tono awhina(), Shift+Ripa, i roto ranei tuhinga whaimana.

Whakataki

He atanga noa mo te whakaoti rapanga arotautanga herenga me te kore herea i roto i te kete scipy.optimize e whakaratohia ana e te mahi minimize(). Engari, e mohiotia ana kaore he tikanga mo te ao katoa mo te whakaoti rapanga katoa, na reira ko te whiriwhiri i tetahi tikanga tika, i nga wa katoa, ka taka ki runga i nga pokohiwi o te kairangahau.
Ko te algorithm arotautanga e tika ana ka tohua ma te whakamahi i te tautohe mahi minimize(..., method="").
Mo te arotautanga herenga o te mahi o te maha o nga taurangi, kei te waatea nga whakatinanatanga o nga tikanga e whai ake nei:

  • trust-constr — rapu mo te iti rawa o te rohe i roto i te rohe whakawhirinaki. Tuhinga Wiki, tuhinga mo Habré;
  • SLSQP — te hotaka raupapatanga tapawha me nga herenga, tikanga Newtonian mo te whakaoti i te punaha Lagrange. Tuhinga Wiki.
  • TNC - Ko Newton Kua Tapahia, He iti te maha o nga whitiwhitinga, he pai mo nga mahi korerangi me te maha o nga taurangi motuhake. Tuhinga Wiki.
  • L-BFGS-B — he tikanga mai i te roopu Broyden–Fletcher–Goldfarb–Shanno, i whakatinanahia me te iti o te kohi mahara na te utaina wahanga o nga vectors mai i te matrix Hessian. Tuhinga Wiki, tuhinga mo Habré.
  • COBYLA — MARE Arotautanga Herea Ma te Whakatata Rarangi, te arotautanga herea me te tata rarangi (kaore he tatauranga rōnaki). Tuhinga Wiki.

I runga i te tikanga kua tohua, he rereke nga whakaritenga me nga here mo te whakaoti rapanga:

  • ahanoa akomanga Bounds mo nga tikanga L-BFGS-B, TNC, SLSQP, whakawhirinaki-constr;
  • te rarangi (min, max) mo nga tikanga ano L-BFGS-B, TNC, SLSQP, trust-constr;
  • he ahanoa, he rarangi taonga ranei LinearConstraint, NonlinearConstraint mo COBYLA, SLSQP, tikanga whakawhirinaki-constr;
  • papakupu, rarangi papakupu ranei {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} mo COBYLA, nga tikanga SLSQP.

Whakahuahua tuhinga:
1) Whakaarohia te whakamahi i te algorithm arotautanga herenga i roto i te rohe whakawhirinaki (tikanga =”trust-constr”) me nga here kua tohua hei ahanoa Bounds, LinearConstraint, NonlinearConstraint ;
2) Whakaarohia te raupapa raupapa ma te whakamahi i nga tikanga tapawha iti rawa (tikanga = "SLSQP") me nga here kua tohua ki te ahua o te papakupu {'type', 'fun', 'jac', 'args'};
3) Te tātari i tetahi tauira o te arotautanga o nga hua hanga ma te whakamahi i te tauira o te whare taiwhanga paetukutuku.

Tikanga arotautanga here = "trust-constr"

Te whakatinanatanga o te tikanga trust-constr i runga i EQSQP mo nga raruraru me nga herenga o te ahua o te taurite me te ake TRIP mo nga raruraru me nga here i roto i te ahua o nga rereke. Ko nga tikanga e rua ka whakatinanahia e te algorithms mo te rapu i te iti rawa o te rohe i roto i te rohe maia me te pai mo nga raru nui.

Te whakatakotoranga pangarau o te rapanga o te kimi i te iti i te ahua whanui:

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

Mo nga herenga taurite, ka whakatauritehia te rohenga o raro ki te rohe o runga SciPy, arotautanga me nga tikanga.
Mo te herenga ara kotahi, ka whakatauhia te tepe o runga, o raro ranei np.inf me te tohu e rite ana.
Me kimihia te iti o te mahi Rosenbrock e mohiotia ana o nga taurangi e rua:

SciPy, arotautanga me nga tikanga

I roto i tenei take, ka whakatauhia nga here e whai ake nei i runga i tana rohe whakamaarama:

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

I roto i to maatau, he otinga ahurei kei te waahi SciPy, arotautanga me nga tikanga, ko nga here tuatahi me te tuawha anake e whai mana ana.
Me haere ki roto i nga here mai i raro ki runga ka titiro me pehea e tuhia ai ki te scipy.
Whakataunga SciPy, arotautanga me nga tikanga и SciPy, arotautanga me nga tikanga me tautuhi ma te whakamahi i te ahanoa Bounds.

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

Whakataunga SciPy, arotautanga me nga tikanga и SciPy, arotautanga me nga tikanga Me tuhi i roto i te ahua rarangi:

SciPy, arotautanga me nga tikanga

Me tautuhi enei here hei ahanoa LinearConstraint:

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

Ka mutu ko te herenga kore i roto i te ahua matrix:

SciPy, arotautanga me nga tikanga

Ka tautuhia e matou te matrix Jacobian mo tenei herenga me te huinga rarangi o te matrix Hessian me te vector arbitrary SciPy, arotautanga me nga tikanga:

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

Inaianei ka taea e tatou te tautuhi i te herenga korerangi hei ahanoa 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)

Mena he nui te rahi, ka taea hoki te tohu matrices ki te ahua iti:

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)

hei ahanoa ranei 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)

I te tatau i te matrix Hessian SciPy, arotautanga me nga tikanga me whakapau kaha, ka taea e koe te whakamahi i te karaehe HessianUpdateStrategy. Kei te waatea nga rautaki e whai ake nei: BFGS и SR1.

from scipy.optimize import BFGS

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

Ka taea hoki te tatau te Hessian ma te whakamahi i nga rereketanga mutunga:

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

Ka taea hoki te tatau i te matrix Jacobian mo nga herenga ma te whakamahi i nga rereketanga mutunga. Heoi, i tenei keehi kaore e taea te tatau te matrix Hessian ma te whakamahi i nga rereketanga mutunga. Ko te Hessian me tautuhi hei mahi, hei whakamahi ranei i te akomanga HessianUpdateStrategy.

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

Ko te otinga ki te raru arotautanga he penei te ahua:

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]

Mena e tika ana, ka taea te tautuhi i te mahi mo te tatau i te Hessian ma te whakamahi i te akomanga 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)

ko te hua ranei o te Hessian me te weriweri i roto i te tawhā 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)

Ko te tikanga, ka taea te tatai nga hua tuatahi me te tuarua o te mahi e arotau ana. Hei tauira, ka taea te tata ki te Hessian ma te whakamahi i te mahi SR1 (whakatata rite-Newtonian). Ka taea te tata i te rōnaki mā ngā rerekētanga mutunga.

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)

Tikanga arotautanga here = "SLSQP"

Ko te tikanga SLSQP i hangaia hei whakaoti rapanga mo te whakaiti i tetahi mahi i te ahua:

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

SciPy, arotautanga me nga tikanga

Kei hea SciPy, arotautanga me nga tikanga и SciPy, arotautanga me nga tikanga — he huinga tohu tohu korero e whakaatu ana i nga here i roto i te ahua o te orite, o te koretake ranei. SciPy, arotautanga me nga tikanga — nga huinga o nga rohe o raro me o runga mo te rohe whakamaramatanga o te mahi.

Ko nga herenga raina me nga herenga kore e whakaahuatia ana hei papakupu whai mau ki 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])
          }

Ko te rapu mo te iti rawa ka mahia penei:

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 ]

Tauira Arotautanga

I roto i te hononga ki te whakawhiti ki te hanganga hangarau tuarima, kia titiro tatou ki te hanga arotautanga mā te whakamahi i te tauira o te studio tukutuku, e mau mai i te moni iti engari pūmau. Me whakaaro tatou ko tatou te kaiwhakahaere o te waka waka e whakaputa ana i nga momo hua e toru:

  • x0 - hoko wharangi taunga, mai i te 10 tr.
  • x1 - paetukutuku rangatōpū, mai i te 20 tr.
  • x2 - toa ipurangi, mai i te 30 tr.

E wha nga teina, e rua o waenga me tetahi tuakana. Ko ta ratou putea mahi mo ia marama:

  • Pipiri: 4 * 150 = 600 чел * час,
  • waenganui: 2 * 150 = 300 чел * час,
  • rangatira: 150 чел * час.

Kia noho te teina tuatahi e waatea ana (0, 1, 2) haora mo te whakawhanaketanga me te whakatakotoranga o tetahi waahi momo (x10, x20, x30), waenganui - (7, 15, 20), tuakana - (5, 10, 15 ) haora o te wa pai o to oranga.

Ka rite ki tetahi kaiwhakahaere noa, e hiahia ana matou ki te whakanui i nga hua o ia marama. Ko te mahi tuatahi ki te angitu ko te tuhi i te mahi whainga value ko te nui o nga moni whiwhi mai i nga hua ka mahia ia marama:

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

Ehara tenei i te he; i te wa e rapu ana mo te morahi, ka whakaitihia te mahi whaainga me te tohu rereke.

Ko te mahi e whai ake nei ko te aukati i a maatau kaimahi ki te mahi nui me te whakauru i nga here mo nga haora mahi:

SciPy, arotautanga me nga tikanga

He aha te rite:

SciPy, arotautanga me nga tikanga

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

Ko te aukati ōkawa ko te whakaputanga hua me pai anake:

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

Ka mutu, ko te tino whakapae na te iti o te utu me te kounga teitei, kei te noho tonu te rarangi o nga kaihoko makona mo tatou. Ka taea e tatou te whiriwhiri i nga pukapuka whakangao ia marama ma tatou ano, i runga i te whakaoti rapanga arotautanga herea 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 huri noa tatou ki nga tau katoa ka tatau i te kawenga marama o nga kaihoe me te tohatoha hua pai x = (8, 6, 3) :

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

Whakamutunga: kia whiwhi ai te kaiwhakahaere i tana tino pai, he pai ki te hanga i nga wharangi tauranga 8, 6 nga waahi reo-rahi me nga toa 3 ia marama. I tenei keehi, me parau te tuakana me te kore e titiro ake mai i te miihini, ko te kawenga o waenga ka tata ki te 2/3, ko nga teina iti iho i te haurua.

mutunga

Ko te tuhinga e whakaatu ana i nga tikanga taketake mo te mahi me te kete scipy.optimize, whakamahia hei whakaoti rapanga whakaiti herenga. Ko ahau te whakamahi scipy mo nga kaupapa matauranga, no reira he ahua whakakata te tauira i homai.

He maha nga ariā me nga tauira mariko ka kitea, hei tauira, i roto i te pukapuka a I.L. Akulich "Mathematic programming in examples and problems." He tono pakeke ake scipy.optimize ki te hanga hanganga 3D mai i te huinga whakaahua (tuhinga mo Habré) ka taea te tiro ki roto scipy-pukapuka.

Ko te tino puna korero docs.scipy.orgte hunga e hiahia ana ki te whai waahi ki te whakamaoritanga o tenei waahanga me etahi atu waahanga scipy Nau mai haere mai GitHub.

Tuhinga mephistophees mo te whai waahi ki te whakarite i te whakaputanga.

Source: will.com

Tāpiri i te kōrero