I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy (ebizwa ngokuba yi-sai pie) yiphakheji yezibalo esekwe kwi-numpy ekwabandakanya amathala eencwadi e-C kunye ne-Fortran. I-SciPy ijika iseshoni yakho yePython esebenzayo ibe yindawo epheleleyo yesayensi yedatha efana neMATLAB, IDL, Octave, R, okanye SciLab.

Kweli nqaku, siza kujonga iindlela ezisisiseko zokucwangcisa imathematika - ukusombulula iingxaki zokuphucula iimeko zomsebenzi we-scalar wezinto ezininzi ezahlukeneyo usebenzisa iphakheji ye-scipy.optimize. Ii-algorithms ezinganyanzelwanga zokuphucula sele kuxoxiwe ngazo inqaku lokugqibela. Iinkcukacha ezithe kratya kunye noncedo oluhlaziyiweyo kwimisebenzi ye-scipy lunokuhlala lufumaneka usebenzisa uncedo () umyalelo, Shift+Tab okanye kwi. amaxwebhu asemthethweni.

Intshayelelo

Ujongano oluqhelekileyo lokusombulula zombini iingxaki ezinemiqathango nezingathintelekiyo kwipakethe ye-scipy.optimize inikwe ngumsebenzi. minimize(). Nangona kunjalo, kuyaziwa ukuba akukho ndlela yendalo yonke yokusombulula zonke iingxaki, ngoko ke ukhetho lwendlela eyaneleyo, njengokuba njalo, luwela kumahlombe omphandi.
I-algorithm yolungiselelo olufanelekileyo ixelwa kusetyenziswa ingxabano yomsebenzi minimize(..., method="").
Ukulungiswa okunemiqathango komsebenzi weenguqu ezininzi, ukuphunyezwa kwezi ndlela zilandelayo ziyafumaneka:

  • trust-constr — khangela ubuncinci bendawo kwindawo yokuzithemba. Inqaku leWiki, inqaku ngoHabré;
  • SLSQP - inkqubo ye-quadratic elandelelanayo enemithintelo, indlela yeNewtonian yokusombulula inkqubo yeLagrange. Inqaku leWiki.
  • TNC - I-Truncated Newton Constrained, inani elilinganiselweyo lokuphindaphinda, ilungile kwimisebenzi engabonakaliyo kunye nenani elikhulu lezinto ezizimeleyo. Inqaku leWiki.
  • L-BFGS-B -indlela esuka kwiqela le-Broyden-Fletcher-Goldfarb-Shanno, ephunyezwe ngokunciphisa ukusetyenziswa kwememori ngenxa yokulayishwa ngokuyinxenye kwee-vectors ezivela kwi-matrix ye-Hessian. Inqaku leWiki, inqaku ngoHabré.
  • COBYLA -I-MARE Constrained Optimization nguLinear Approximation, ukunyanzeliswa kokulungelelaniswa kunye noqikelelo lomda (ngaphandle kokubala kwegradient). Inqaku leWiki.

Ngokuxhomekeke kwindlela ekhethiweyo, iimeko kunye nezithintelo zokusombulula ingxaki zisetwa ngokwahlukileyo:

  • into yeklasi Bounds kwiindlela ze-L-BFGS-B, TNC, SLSQP, trust-constr;
  • uluhlu (min, max) kwiindlela ezifanayo L-BFGS-B, TNC, SLSQP, trust-constr;
  • into okanye uluhlu lwezinto LinearConstraint, NonlinearConstraint yeCOBYLA, SLSQP, iindlela zokuthembela-constr;
  • isichazi-magama okanye uluhlu lwezichazi-magama {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} yeCOBYLA, iindlela ze-SLSQP.

Ulwandlalo lwenqaku:
1) Qwalasela ukusetyenziswa kwe-algorithm yokuphucula imiqathango kwindawo yokuthembela (indlela = "trust-constr") kunye nemiqobo echazwe njengezinto. Bounds, LinearConstraint, NonlinearConstraint ;
2) Qwalasela udweliso lwenkqubo olulandelelanayo usebenzisa indlela yezikwere ezincinci (indlela = "SLSQP") enezithintelo ezichazwe kuhlobo lwesichazi-magama. {'type', 'fun', 'jac', 'args'};
3) Hlalutya umzekelo wokulungiswa kweemveliso ezenziweyo usebenzisa umzekelo we-studio yewebhu.

Indlela yokuphucula enemiqathango="ithemba-constr"

Ukuphunyezwa kwendlela trust-constr ngenxa ye EQSQP kwiingxaki ezinemithintelo yohlobo lokulingana kunye nokuqhubeka UHAMBO kwiingxaki ezinemiqobo ngendlela yokungalingani. Zombini iindlela ziphunyezwa nge-algorithms zokufumana ubuncinci bendawo kwindawo yokuzithemba kwaye zilungele kakuhle iingxaki ezinkulu.

Ukuqulunqwa kwezibalo zengxaki yokufumana ubuncinci kwifom ngokubanzi:

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

Kwimiqobo engqongqo yokulingana, umda ophantsi ubekwe ulingana nomda ophezulu I-SciPy, ukulungiswa kunye neemeko.
Ukunyanzeliswa kwendlela enye, umda ophezulu okanye osezantsi ubekiwe np.inf ngophawu oluhambelanayo.
Makube yimfuneko ukufumana ubuncinci bomsebenzi owaziwayo weRosenbrock wezinto ezimbini eziguquguqukayo:

I-SciPy, ukulungiswa kunye neemeko

Kule meko, ezi zithintelo zilandelayo zisetwe kwindawo yayo yenkcazo:

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

Kwimeko yethu, kukho isisombululo esikhethekileyo kwinqanaba I-SciPy, ukulungiswa kunye neemeko, apho kuphela izithintelo zokuqala nezesine zivumelekile.
Makhe sidlule kwizithintelo ukusuka ezantsi ukuya phezulu kwaye sijonge indlela esinokuyibhala ngayo kwi-scipy.
Zi thintelo I-SciPy, ukulungiswa kunye neemeko и I-SciPy, ukulungiswa kunye neemeko masiyichaze sisebenzisa into yeMida.

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

Zi thintelo I-SciPy, ukulungiswa kunye neemeko и I-SciPy, ukulungiswa kunye neemeko Masiyibhale ngendlela yomgca:

I-SciPy, ukulungiswa kunye neemeko

Makhe sichaze le miqobo njengento ye-LinearConstraint:

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

Kwaye ekugqibeleni isithintelo esingenamgca kwifom ye-matrix:

I-SciPy, ukulungiswa kunye neemeko

Sichaza i-matrix ye-Jacobian yesi sithintelo kunye nendibaniselwano yomgca we-matrix ye-Hessian kunye ne-vector engafanelekanga. I-SciPy, ukulungiswa kunye neemeko:

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

Ngoku sinokuchaza isithintelo esingenamgca njengento 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)

Ukuba ubungakanani bukhulu, iimatriki nazo zinokuchazwa ngendlela enqabileyo:

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)

okanye njengento 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)

Xa ubala i-matrix ye-Hessian I-SciPy, ukulungiswa kunye neemeko kufuna umgudu omkhulu, ungasebenzisa iklasi HessianUpdateStrategy. Ezi zicwangciso zilandelayo ziyafumaneka: BFGS и SR1.

from scipy.optimize import BFGS

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

I-Hessian ingabalwa ngokusebenzisa iiyantlukwano ezinqamlekileyo:

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

I-matrix ye-Jacobian yezithintelo nayo ingabalwa ngokusebenzisa iiyantlukwano ezinqamlekileyo. Nangona kunjalo, kule meko i-matrix ye-Hessian ayinakubalwa ngokusebenzisa iiyantlukwano ezinqamlekileyo. I-Hessian kufuneka ichazwe njengomsebenzi okanye usebenzisa iklasi ye-HessianUpdateStrategy.

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

Isisombululo kwingxaki yolungiselelo sijongeka ngolu hlobo:

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]

Ukuba kuyimfuneko, umsebenzi wokubala i-Hessian unokuchazwa kusetyenziswa iklasi ye-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)

okanye imveliso ye-Hessian kunye ne-vector engafanelekanga ngeparameter 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)

Kungenjalo, i-derivatives yokuqala neyesibini yomsebenzi owenziwayo inokuqikelelwa. Umzekelo, i-Hessian inokuqikelelwa kusetyenziswa umsebenzi SR1 (quasi-Newtonian approximation). Ithambeka linokuqikelelwa ngomahluko onomda.

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)

Indlela yokuphucula enemiqathango="SLSQP"

Indlela ye-SLSQP yenzelwe ukusombulula iingxaki zokunciphisa umsebenzi ngendlela:

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

I-SciPy, ukulungiswa kunye neemeko

Kuphi I-SciPy, ukulungiswa kunye neemeko и I-SciPy, ukulungiswa kunye neemeko - iiseti zezalathisi zentetho ezichaza izithintelo ngendlela yokulingana okanye ukungalingani. I-SciPy, ukulungiswa kunye neemeko - iiseti zemida ephantsi kunye nephezulu kwi-domain yenkcazo yomsebenzi.

Izithintelo zomgca kunye nezingahambelaniyo zichazwe ngendlela yezichazi-magama ezinezitshixo 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])
          }

Ukukhangela ubuncinci benziwa ngolu hlobo lulandelayo:

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 ]

Umzekelo wokuphucula

Ngokubhekiselele kwinguqu kwisakhiwo seteknoloji yesihlanu, makhe sijonge ukulungelelaniswa kwemveliso usebenzisa umzekelo we-studio yewebhu, esizisa umvuzo omncinci kodwa ozinzile. Masibe nomfanekiso-ngqondweni wethu njengomlawuli wenqanawa evelisa iindidi ezintathu zeemveliso:

  • x0 - ukuthengisa amaphepha okumisa, ukusuka kwi-10 tr.
  • x1 - iiwebhusayithi zenkampani, ukusuka kwi-20 tr.
  • x2 - iivenkile ze-intanethi, ukusuka kwi-30 tr.

Iqela lethu elisebenza ngobuhlobo libandakanya abancinci abane, abaphakathi ababini kunye nomnye ophezulu. Ingxowa-mali yabo yexesha lokusebenza yenyanga:

  • NgoJuni: 4 * 150 = 600 чел * час,
  • iphakathi: 2 * 150 = 300 чел * час,
  • umncedisi: 150 чел * час.

Vumela abancinci bokuqala abakhoyo bachithe (0, 1, 2) iiyure kuphuhliso kunye nokusasazwa kwendawo enye yohlobo (x10, x20, x30), phakathi - (7, 15, 20), abadala - (5, 10, 15 ) iiyure zelona xesha lilungileyo lobomi bakho.

Njengaye nawuphi na umlawuli oqhelekileyo, sifuna ukwandisa inzuzo yenyanga. Inyathelo lokuqala lokuphumelela kukubhala phantsi umsebenzi wenjongo value njengesixa sengeniso evela kwiimveliso eziveliswa ngenyanga:

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

Oku akuyompazamo xa ukhangela ubuninzi, umsebenzi wenjongo uyancitshiswa ngophawu oluchaseneyo.

Inyathelo elilandelayo kukuthintela abasebenzi bethu ekusebenzeni ngokugqithisileyo kunye nokwazisa izithintelo kwiiyure zokusebenza:

I-SciPy, ukulungiswa kunye neemeko

Yintoni elinganayo:

I-SciPy, ukulungiswa kunye neemeko

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

Isithintelo esisesikweni kukuba imveliso kufuneka ibe ntle kuphela:

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

Kwaye okokugqibela, eyona ngcinga intle kukuba ngenxa yexabiso eliphantsi kunye nomgangatho ophezulu, umgca wabathengi abonelisekileyo uhlala ufolele thina. Singazikhethela ngokwethu umthamo wemveliso wenyanga ngokwethu, ngokusekwe ekusombululeni ingxaki yokuphucula enemiqobo 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]

Masijikeleze ngokukhululekileyo kumanani apheleleyo kwaye sibale umthwalo wenyanga wababheqi ngokusasazwa ngokufanelekileyo kweemveliso x = (8, 6, 3) :

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

Isiphelo: ukwenzela ukuba umlawuli afumane ubuninzi bakhe obufanelekileyo, kulungele ukudala amaphepha angama-8, iindawo ezi-6 eziphakathi kunye neevenkile ezi-3 ngenyanga. Kule meko, umntu ophezulu kufuneka alime ngaphandle kokujonga phezulu kumatshini, umthwalo we-middles uya kuba malunga ne-2/3, abancinci ngaphantsi kwesiqingatha.

isiphelo

Inqaku lichaza iindlela ezisisiseko zokusebenza kunye nephakheji scipy.optimize, esetyenziselwa ukusombulula iingxaki zokunciphisa iimeko. Ngokwam ndisebenzisa scipy kuphela ngeenjongo zemfundo, yiyo loo nto umzekelo onikiweyo ungowohlobo oluhlekisayo.

Ithiyori eninzi kunye nemizekelo ebonakalayo inokufumaneka, umzekelo, kwincwadi ka-I.L. Akulich "Inkqubo yezibalo kwimizekelo kunye neengxaki." Usetyenziso olunzima ngakumbi scipy.optimize ukwakha isakhelo se-3D ukusuka kwiseti yemifanekiso (inqaku ngoHabré) inokujongwa kwi scipy-cookbook.

Umthombo oyintloko wolwazi docs.scipy.orgabo banqwenela ukufaka isandla ekuguqulelweni kweli candelo namanye scipy Wamkelekile kwi GitHub.

Спасибо iimephistophees ngokuthatha inxaxheba ekulungiseleleni upapasho.

umthombo: www.habr.com

Yongeza izimvo