
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 . Usizo oluningiliziwe nolwakamuva mayelana nemisebenzi ye-scipy lungatholakala kusetshenziswa i-help() umyalo, u-Shift+Tab noma ku- .
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. , ;SLSQP- uhlelo lwe-quadratic olulandelanayo olunezingqinamba, indlela ye-Newtonian yokuxazulula uhlelo lwe-Lagrange. .TNC- I-Newton Enqanyuliwe Ivinjelwe, inombolo ekhawulelwe yokuphindaphinda, ilungele imisebenzi engaqondile enenani elikhulu lokuhlukahluka okuzimele. .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. , .COBYLA- I-MARE Constrained Optimization By Linear Approximation, ukuthuthukiswa okuvinjelwe ngokulinganisa komugqa (ngaphandle kokubala kwe-gradient). .
Ngokuya ngendlela ekhethiwe, izimo nemikhawulo yokuxazulula inkinga isethwe ngokuhlukile:
- into yekilasi
Boundsizindlela L-BFGS-B, TNC, SLSQP, trust-constr; - uhlu
(min, max)ngezindlela ezifanayo L-BFGS-B, TNC, SLSQP, trust-constr; - into noma uhlu lwezinto
LinearConstraint,NonlinearConstraintye-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 ngezinkinga ezinezingqinamba zendlela yokulingana nokuqhubeka 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:



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

Kulokhu, imikhawulo elandelayo isethwe esizindeni sencazelo yayo:






Esimweni sethu, kunesixazululo esiyingqayizivele endaweni
, okuyimikhawulo yokuqala neyesine kuphela evumelekile.
Ake sidlule emigomeni kusukela phansi kuye phezulu futhi sibheke ukuthi singayibhala kanjani nge-scipy.
Izithibelo
и
masiyichaze sisebenzisa into ethi Bounds.
from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])Izithibelo
и
Masiyibhale ngendlela yomugqa:

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:

Sichaza i-matrix ye-Jacobian yalesi sivimbelo kanye nenhlanganisela yomugqa we-matrix ye-Hessian ene-vector engaqondakali.
:


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
kudinga umzamo omkhulu, ungasebenzisa ikilasi . 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:




Kuphi
и
- amaqoqo ezinkomba zezinkulumo ezichaza imikhawulo ngendlela yokulingana noma ukungalingani.
- 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:

Yini okulingana:

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 () ingabukwa ku .
Umthombo oyinhloko wolwazi labo abafisa ukufaka isandla ekuhunyushweni kwalesi sigaba nezinye scipy Siyakwamukela ku .
Спасибо ngokubamba iqhaza ekulungiseleleni ukushicilelwa.
Source: www.habr.com
