SciPy (shqiptohet byrek sai) është një paketë matematikore e bazuar në numpy që përfshin gjithashtu bibliotekat C dhe Fortran. SciPy e kthen një sesion interaktiv Python në një mjedis të plotë të shkencës së të dhënave si MATLAB, IDL, Octave, R ose SciLab.
Në këtë artikull, ne do të shikojmë teknikat bazë të programimit matematik - zgjidhjen e problemeve të optimizimit të kushtëzuar për një funksion skalar të disa variablave duke përdorur paketën scipy.optimize. Algoritmet e optimizimit të pakufizuar janë diskutuar tashmë në artikulli i fundit. Ndihmë më e detajuar dhe më e përditësuar për funksionet scipy gjithmonë mund të merret duke përdorur komandën help(), Shift+Tab ose në dokumentacion zyrtar.
Paraqitje
Një ndërfaqe e përbashkët për zgjidhjen e problemeve të optimizimit të kushtëzuar dhe të pakufizuar në paketën scipy.optimize ofrohet nga funksioni minimize(). Megjithatë, dihet se nuk ekziston një metodë universale për zgjidhjen e të gjitha problemeve, kështu që zgjedhja e një metode adekuate, si gjithmonë, bie mbi supet e studiuesit.
Algoritmi i duhur i optimizimit specifikohet duke përdorur argumentin e funksionit minimize(..., method="").
Për optimizimin e kushtëzuar të një funksioni të disa variablave, janë në dispozicion zbatimet e metodave të mëposhtme:
SLSQP — programim kuadratik sekuencial me kufizime, metoda Njutoniane për zgjidhjen e sistemit të Lagranzhit. Artikull Wiki.
TNC - Njuton i shkurtuar I kufizuar, numër i kufizuar përsëritjesh, i mirë për funksione jolineare me një numër të madh variablash të pavarur. Artikull Wiki.
L-BFGS-B - një metodë nga ekipi Broyden-Fletcher-Goldfarb-Shanno, e zbatuar me konsum të reduktuar të memories për shkak të ngarkimit të pjesshëm të vektorëve nga matrica Hessian. Artikull Wiki, artikull në Habré.
COBYLA — MARE Optimization Constrained By Linear Aproximation, optimization constrained me përafrim linear (pa llogaritje gradient). Artikull Wiki.
Në varësi të metodës së zgjedhur, kushtet dhe kufizimet për zgjidhjen e problemit vendosen ndryshe:
objekti i klasës Bounds për metodat L-BFGS-B, TNC, SLSQP, trust-constr;
Lista (min, max) për të njëjtat metoda L-BFGS-B, TNC, SLSQP, trust-constr;
një objekt ose një listë objektesh LinearConstraint, NonlinearConstraint për metodat COBYLA, SLSQP, trust-constr;
fjalor ose listë fjalorësh {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} për metodat COBYLA, SLSQP.
Përmbledhja e artikullit:
1) Merrni parasysh përdorimin e një algoritmi të optimizimit të kushtëzuar në rajonin e besimit (metodë = "trust-constr") me kufizime të specifikuara si objekte Bounds, LinearConstraint, NonlinearConstraint ;
2) Merrni parasysh programimin vijues të katrorëve më të vegjël (metoda =”SLSQP”) me kufizime të specifikuara si fjalor {'type', 'fun', 'jac', 'args'};
3) Analizoni një shembull të optimizimit të produkteve të prodhuara duke përdorur shembullin e një studioje në internet.
Metoda e optimizimit të kushtëzuar = "trust-constr"
Zbatimi i metodës trust-constr bazuar në EQSQP për probleme me kufizime të formës së barazisë dhe në TRIP për problemet me kufizime në formën e pabarazive. Të dyja metodat zbatohen nga algoritme për gjetjen e një minimumi lokal në rajonin e besimit dhe janë të përshtatshme për probleme në shkallë të gjerë.
Formulimi matematikor i problemit të gjetjes së një minimumi në formë të përgjithshme:
Për kufizime strikte të barazisë, kufiri i poshtëm vendoset i barabartë me kufirin e sipërm .
Për një kufizim me një drejtim, është vendosur kufiri i sipërm ose i poshtëm np.inf me shenjën përkatëse.
Le të jetë e nevojshme të gjejmë minimumin e një funksioni të njohur Rosenbrock të dy variablave:
Në këtë rast, kufizimet e mëposhtme vendosen në fushën e përkufizimit të tij:
Në rastin tonë, ekziston një zgjidhje unike në pikën , për të cilat vlejnë vetëm kufizimet e para dhe të katërt.
Le të kalojmë nëpër kufizimet nga poshtë lart dhe të shohim se si mund t'i shkruajmë ato në mënyrë të qartë.
Kufizimet и le ta përcaktojmë duke përdorur objektin Bounds.
Gjatë llogaritjes së matricës Hessian kërkon shumë përpjekje, mund të përdorni një klasë HessianUpdateStrategy. Strategjitë e mëposhtme janë në dispozicion: BFGS и SR1.
Matrica Jakobiane për kufizimet mund të llogaritet gjithashtu duke përdorur diferencat e fundme. Megjithatë, në këtë rast matrica Hessian nuk mund të llogaritet duke përdorur diferencat e fundme. Hessian duhet të përcaktohet si një funksion ose duke përdorur klasën HessianUpdateStrategy.
Përndryshe, derivatet e parë dhe të dytë të funksionit që optimizohet mund të përafrohen. Për shembull, Hessian mund të përafrohet duke përdorur funksionin SR1 (përafrim kuazi-njutonian). Gradienti mund të përafrohet me diferenca të fundme.
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)
Metoda e optimizimit të kushtëzuar = "SLSQP"
Metoda SLSQP është krijuar për të zgjidhur problemet e minimizimit të një funksioni në formën:
ku и - grupe indeksesh shprehjesh që përshkruajnë kufizime në formën e barazive ose pabarazive. - grupe kufijsh të poshtëm dhe të sipërm për domenin e përcaktimit të funksionit.
Kufizimet lineare dhe jolineare përshkruhen në formën e fjalorëve me çelësa 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])
}
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Shembull i optimizmit
Në lidhje me kalimin në strukturën e pestë teknologjike, le të shohim optimizimin e prodhimit duke përdorur shembullin e një studioje në internet, e cila na sjell të ardhura të vogla por të qëndrueshme. Le ta imagjinojmë veten si drejtor i një galerie që prodhon tre lloje produktesh:
x0 - shitja e faqeve të uljes, nga 10 tr.
x1 - faqet e internetit të korporatave, nga 20 tr.
x2 - dyqane online, nga 30 tr.
Ekipi ynë miqësor i punës përfshin katër juniorë, dy të mesëm dhe një të moshuar. Fondi i tyre mujor i kohës së punës:
Qershor: 4 * 150 = 600 чел * час,
të mesmet: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Lëreni të riun e parë në dispozicion të shpenzojë (0, 1, 2) orë në zhvillimin dhe vendosjen e një siti të tipit (x10, x20, x30), i mesëm - (7, 15, 20), i moshuar - (5, 10, 15 ) orët e kohës më të mirë të jetës suaj.
Si çdo drejtor normal, ne duam të maksimizojmë fitimet mujore. Hapi i parë drejt suksesit është të shkruani funksionin objektiv value si shuma e të ardhurave nga produktet e prodhuara në muaj:
Dhe së fundi, supozimi më rozë është se për shkak të çmimit të ulët dhe cilësisë së lartë, një radhë klientësh të kënaqur vazhdimisht janë në radhë për ne. Ne mund të zgjedhim vetë vëllimet e prodhimit mujor, bazuar në zgjidhjen e problemit të optimizimit të kufizuar scipy.optimize:
Le të rrumbullakohemi lirshëm në numrat e plotë dhe të llogarisim ngarkesën mujore të vozitësve me një shpërndarje optimale të produkteve x = (8, 6, 3) :
Përfundim: në mënyrë që drejtori të marrë maksimumin e tij të merituar, është optimale të krijohen 8 faqe ulje, 6 faqe të mesme dhe 3 dyqane në muaj. Në këtë rast, i moshuari duhet të lërojë pa parë nga makina, ngarkesa e mesit do të jetë afërsisht 2/3, të rinjtë më pak se gjysma.
Përfundim
Artikulli përshkruan teknikat themelore për të punuar me paketën scipy.optimize, përdoret për të zgjidhur problemet e minimizimit të kushtëzuar. Personalisht e përdor scipy thjesht për qëllime akademike, prandaj shembulli i dhënë është i një natyre kaq komike.
Shumë teori dhe shembuj virtualë mund të gjenden, për shembull, në librin e I.L. Akulich "Programimi matematikor në shembuj dhe probleme". Më shumë aplikacion hardcore scipy.optimize për të ndërtuar një strukturë 3D nga një grup imazhesh (artikull në Habré) mund të shihet në scipy-libër gatimi.
Burimi kryesor i informacionit është docs.scipy.orgata që dëshirojnë të kontribuojnë në përkthimin e këtij dhe seksioneve të tjera scipy Mire se erdhet ne GitHub.
Falënderim mefistofetë për pjesëmarrje në përgatitjen e botimit.