I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy (ebizwa ngokuthi i-sai pie) iyiphakheji yezibalo esekelwe ku-numpy ephinde ihlanganise nemitapo yolwazi ye-C ne-Fortran. I-SciPy iguqula isikhathi sakho sePython esisebenzisanayo sibe indawo ephelele yesayensi yedatha njenge-MATLAB, IDL, Octave, R, noma i-SciLab.

Kulesi sihloko, sizobheka amasu ayisisekelo wohlelo lwezibalo - ukuxazulula izinkinga zokuthuthukisa ezinemibandela zomsebenzi we-scalar weziguquguquko eziningana kusetshenziswa iphakheji ye-scipy.optimize. Ama-algorithms okuthuthukisa okungavinjelwe asexoxiwe ngawo isihloko sokugcina. Usizo oluningiliziwe nolwakamuva mayelana nemisebenzi ye-scipy lungatholakala kusetshenziswa i-help() umyalo, u-Shift+Tab noma ku- imibhalo esemthethweni.

Isingeniso

Isixhumi esibonakalayo esivamile sokuxazulula izinkinga zombili ezinemibandela nezingavinjelwanga kuphakheji ye-scipy.optimize inikezwa umsebenzi minimize(). Kodwa-ke, kuyaziwa ukuthi ayikho indlela yendawo yonke yokuxazulula zonke izinkinga, ngakho-ke ukukhetha indlela eyanele, njengokuhlala njalo, kuwela emahlombe omcwaningi.
I-algorithm efanele yokuthuthukisa icaciswa kusetshenziswa i-agumenti yomsebenzi minimize(..., method="").
Ukuze kwenziwe ngcono okunemibandela komsebenzi wokuguquguquka okuningi, ukusetshenziswa kwalezi zindlela ezilandelayo kuyatholakala:

  • trust-constr — sesha ubuncane bendawo endaweni yokuqiniseka. Isihloko se-Wiki, isihloko ngoHabre;
  • SLSQP - uhlelo lwe-quadratic olulandelanayo olunezingqinamba, indlela ye-Newtonian yokuxazulula uhlelo lwe-Lagrange. Isihloko se-Wiki.
  • TNC - I-Newton Enqanyuliwe Ivinjelwe, inombolo ekhawulelwe yokuphindaphinda, ilungele imisebenzi engaqondile enenani elikhulu lokuhlukahluka okuzimele. Isihloko se-Wiki.
  • L-BFGS-B - indlela evela eqenjini le-Broyden-Fletcher-Goldfarb-Shanno, esetshenziswe ngokuncishiswa kokusetshenziswa kwenkumbulo ngenxa yokulayisha ingxenye yama-vectors asuka ku-matrix yase-Hessian. Isihloko se-Wiki, isihloko ngoHabre.
  • COBYLA - I-MARE Constrained Optimization By Linear Approximation, ukuthuthukiswa okuvinjelwe ngokulinganisa komugqa (ngaphandle kokubala kwe-gradient). Isihloko se-Wiki.

Ngokuya ngendlela ekhethiwe, izimo nemikhawulo yokuxazulula inkinga isethwe ngokuhlukile:

  • into yekilasi Bounds izindlela L-BFGS-B, TNC, SLSQP, trust-constr;
  • uhlu (min, max) ngezindlela ezifanayo L-BFGS-B, TNC, SLSQP, trust-constr;
  • into noma uhlu lwezinto LinearConstraint, NonlinearConstraint ye-COBYLA, SLSQP, izindlela zokuthembana;
  • isichazamazwi noma uhlu lwezichazamazwi {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} ye-COBYLA, izindlela ze-SLSQP.

Uhlaka lwe-athikili:
1) Cabangela ukusetshenziswa kwe-algorithm enemibandela yokuthuthukisa endaweni yokuthembana (indlela=”trust-constr”) enezingqinamba ezicaciswe njengezinto. Bounds, LinearConstraint, NonlinearConstraint ;
2) Cabangela ukuhlela okulandelanayo usebenzisa indlela yezikwele ezincane (indlela = "SLSQP") enemikhawulo ecaciswe ngendlela yesichazamazwi. {'type', 'fun', 'jac', 'args'};
3) Hlaziya isibonelo sokwenziwa kahle kwemikhiqizo ekhiqiziwe usebenzisa isibonelo sesitudiyo sewebhu.

Conditional optimization method="trust-constr"

Ukuqaliswa kwendlela trust-constr ngokusekelwe ku I-EQSQP ngezinkinga ezinezingqinamba zendlela yokulingana nokuqhubeka UHAMBO ngezinkinga ezinezingqinamba ngendlela yokungalingani. Zombili izindlela zisetshenziswa ngama-algorithms okuthola ubuncane bendawo endaweni yokuqiniseka futhi zilungele izinkinga ezinkulu.

Ukwakhiwa kwezibalo zenkinga yokuthola ubuncane befomu elijwayelekile:

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

Ukuze kube nemingcele eqinile yokulingana, isibopho esiphansi sisethwa silingana nomkhawulo ongaphezulu I-SciPy, nokwenza kahle ngezimo.
Ngomkhawulo wendlela eyodwa, umkhawulo ophezulu noma ophansi umisiwe np.inf ngophawu oluhambisanayo.
Makudingeke ukuthola ubuncane bomsebenzi we-Rosenbrock owaziwayo wokuguquguquka okubili:

I-SciPy, nokwenza kahle ngezimo

Kulokhu, imikhawulo elandelayo isethwe esizindeni sencazelo yayo:

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

Esimweni sethu, kunesixazululo esiyingqayizivele endaweni I-SciPy, nokwenza kahle ngezimo, okuyimikhawulo yokuqala neyesine kuphela evumelekile.
Ake sidlule emigomeni kusukela phansi kuye phezulu futhi sibheke ukuthi singayibhala kanjani nge-scipy.
Izithibelo I-SciPy, nokwenza kahle ngezimo и I-SciPy, nokwenza kahle ngezimo masiyichaze sisebenzisa into ethi Bounds.

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

Izithibelo I-SciPy, nokwenza kahle ngezimo и I-SciPy, nokwenza kahle ngezimo Masiyibhale ngendlela yomugqa:

I-SciPy, nokwenza kahle ngezimo

Ake sichaze lezi zingqinamba njengento ye-LinearConstraint:

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

Futhi ekugcineni umkhawulo ongaqondile kwifomu le-matrix:

I-SciPy, nokwenza kahle ngezimo

Sichaza i-matrix ye-Jacobian yalesi sivimbelo kanye nenhlanganisela yomugqa we-matrix ye-Hessian ene-vector engaqondakali. I-SciPy, nokwenza kahle ngezimo:

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

Manje sesingakwazi ukuchaza isithiyo esingaqondile 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)

Uma usayizi mkhulu, ama-matrices angabuye acaciswe ngefomu elincane:

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)

noma 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)

Lapho ubala i-matrix ye-Hessian I-SciPy, nokwenza kahle ngezimo kudinga umzamo omkhulu, ungasebenzisa ikilasi HessianUpdateStrategy. Amasu alandelayo ayatholakala: BFGS и SR1.

from scipy.optimize import BFGS

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

I-Hessian ingabalwa kusetshenziswa umehluko olinganiselwe:

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

I-matrix ye-Jacobian yezingqinamba ingase ibalwe kusetshenziswa umehluko olinganiselwe. Kodwa-ke, kulokhu i-matrix ye-Hessian ayikwazi ukubalwa kusetshenziswa umehluko olinganiselwe. I-Hessian kumele ichazwe njengomsebenzi noma kusetshenziswa isigaba se-HessianUpdateStrategy.

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

Isixazululo senkinga yokuthuthukisa sibukeka kanje:

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]

Uma kunesidingo, umsebenzi wokubala i-Hessian ungachazwa kusetshenziswa isigaba se-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)

noma umkhiqizo we-Hessian kanye ne-vector engafanele ngokusebenzisa ipharamitha 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, okuphuma kokunye kokuqala nokwesibili komsebenzi othuthukiswayo kungalinganiselwa. Isibonelo, i-Hessian ingalinganiswa kusetshenziswa umsebenzi SR1 (ukulinganisa kwe-quasi-Newtonian). I-gradient ingalinganiselwa ngokuhluka okunomkhawulo.

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 yokuthuthukisa enemibandela="SLSQP"

Indlela ye-SLSQP yakhelwe ukuxazulula izinkinga zokunciphisa umsebenzi ngefomu:

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

I-SciPy, nokwenza kahle ngezimo

Kuphi I-SciPy, nokwenza kahle ngezimo и I-SciPy, nokwenza kahle ngezimo - amaqoqo ezinkomba zezinkulumo ezichaza imikhawulo ngendlela yokulingana noma ukungalingani. I-SciPy, nokwenza kahle ngezimo - amasethi emingcele ephansi nengaphezulu yesizinda sencazelo yomsebenzi.

Izithiyo zomugqa nezingaqondile zichazwa ngendlela yezichazamazwi ezinokhiye 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])
          }

Ukusesha ubuncane benziwa kanje:

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 ]

Isibonelo sokuthuthukisa

Maqondana nenguquko eya esakhiweni sesihlanu sobuchwepheshe, ake sibheke ukuthuthukiswa kokukhiqiza sisebenzisa isibonelo se-web studio, esisilethela imali encane kodwa ezinzile. Ake sizicabange njengomqondisi wesikebhe esikhiqiza izinhlobo ezintathu zemikhiqizo:

  • x0 - ukuthengisa amakhasi okufika, kusuka ku-10 tr.
  • x1 - amawebhusayithi ezinkampani, kusukela ku-20 tr.
  • x2 - izitolo eziku-inthanethi, kusukela ku-30 ​​tr.

Ithimba lethu elisebenzayo elinobungane lihlanganisa abancane abane, ababili abaphakathi nendawo noyedwa ophezulu. Isikhwama sabo sesikhathi sokusebenza sanyanga zonke:

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

Vumela omncane wokuqala otholakalayo achithe (0, 1, 2) amahora ekuthuthukisweni nasekusetshenzisweni kwesayithi eyodwa yohlobo (x10, x20, x30), maphakathi - (7, 15, 20), abadala - (5, 10, 15 ) amahora esikhathi esingcono kakhulu sempilo yakho.

Njenganoma yimuphi umqondisi ojwayelekile, sifuna ukukhulisa inzuzo yanyanga zonke. Isinyathelo sokuqala sempumelelo ukubhala phansi umsebenzi wenhloso value njengenani lemali engenayo evela emikhiqizweni ekhiqizwa ngenyanga:

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

Lokhu akulona iphutha;

Isinyathelo esilandelayo siwukuvimbela abasebenzi bethu ekusebenzeni ngokweqile futhi sethule imikhawulo yamahora okusebenza:

I-SciPy, nokwenza kahle ngezimo

Yini okulingana:

I-SciPy, nokwenza kahle ngezimo

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

Umkhawulo osemthethweni ukuthi ukuphuma komkhiqizo kumele kube kuhle kuphela:

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

Futhi ekugcineni, umcabango omuhle kakhulu ukuthi ngenxa yenani eliphansi kanye nekhwalithi ephezulu, ulayini wamakhasimende anelisekile uhlala usihlelele. Singakhetha amavolumu okukhiqiza anyanga zonke ngokwethu, ngokususelwe ekuxazululeni inkinga ebambekile yokwenza kahle 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]

Masizungeze izinombolo eziphelele futhi sibale umthwalo wanyanga zonke wabagwedli ngokusatshalaliswa okuphelele kwemikhiqizo x = (8, 6, 3) :

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

Isiphetho: ukuze umqondisi athole ubukhulu bakhe obumfanele, kuhle kakhulu ukudala amakhasi okufika ayi-8, amasayithi aphakathi nendawo ayi-6 kanye nezitolo ezi-3 ngenyanga. Kulokhu, abadala kufanele balime ngaphandle kokubheka phezulu emshinini, umthwalo we-middles uzoba cishe u-2/3, abancane bangaphansi kwesigamu.

isiphetho

I-athikili ichaza amasu ayisisekelo okusebenza nephakheji scipy.optimize, esetshenziselwa ukuxazulula izinkinga zokunciphisa okunemibandela. Ngokwami ​​ngiyasebenzisa scipy ngokwezinjongo zemfundo kuphela, yingakho isibonelo esinikeziwe singesohlobo lwamahlaya.

Ithiyori eminingi nezibonelo ezibonakalayo zingatholakala, ngokwesibonelo, encwadini ka-I.L. Akulich “Uhlelo lwezibalo ngezibonelo nezinkinga.” Uhlelo lokusebenza oluqinile scipy.optimize ukwakha isakhiwo se-3D kusuka kusethi yezithombe (isihloko ngoHabre) ingabukwa ku scipy-cookbook.

Umthombo oyinhloko wolwazi docs.scipy.orglabo abafisa ukufaka isandla ekuhunyushweni kwalesi sigaba nezinye scipy Siyakwamukela ku GitHub.

Спасибо ama-mephistophees ngokubamba iqhaza ekulungiseleleni ukushicilelwa.

Source: www.habr.com

Thenga ukusingathwa okuthembekile kwamasayithi anokuvikelwa kwe-DDoS, amaseva e-VPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekile ngokuvikelwa kwe-DDoS, amaseva e-VPS VDS | ProHoster