SciPy (prononcita sai torto) estas numpy-bazita matematikpakaĵo kiu ankaŭ inkludas C kaj Fortran-bibliotekojn. SciPy igas vian interagan Python-sesion en kompletan datuman sciencan medion kiel MATLAB, IDL, Octave, R aŭ SciLab.
En ĉi tiu artikolo, ni rigardos la bazajn teknikojn de matematika programado - solvante kondiĉajn optimumigajn problemojn por skalara funkcio de pluraj variabloj uzante la scipy.optimize-pakaĵon. Nelimigitaj optimizaj algoritmoj jam estis diskutitaj en lasta artikolo. Pli detala kaj ĝisdata helpo pri scipy-funkcioj ĉiam povas esti akirita per la help() komando, Shift+Tab aŭ en oficiala dokumentaro.
Enkonduko
Ofta interfaco por solvi kaj kondiĉajn kaj nelimigitajn optimumigajn problemojn en la scipy.optimize-pakaĵo estas disponigita per la funkcio minimize(). Tamen oni scias, ke ne ekzistas universala metodo por solvi ĉiujn problemojn, do la elekto de taŭga metodo, kiel ĉiam, falas sur la ŝultrojn de la esploristo.
La taŭga optimumiga algoritmo estas specifita uzante la funkcioargumenton minimize(..., method="").
Por kondiĉa optimumigo de funkcio de pluraj variabloj, efektivigoj de la sekvaj metodoj estas haveblaj:
SLSQP — sinsekva kvadrata programado kun limoj, Newtoniana metodo por solvi la Lagrange-sistemon. Vikio artikolo.
TNC - Detranĉita Newton Limigita, limigita nombro da ripetoj, bona por neliniaj funkcioj kun granda nombro da sendependaj variabloj. Vikio artikolo.
L-BFGS-B — metodo de la Broyden–Fletcher–Goldfarb–Shanno-teamo, efektivigita kun reduktita memorkonsumo pro parta ŝarĝo de vektoroj de la hesia matrico. Vikio artikolo, artikolo pri Habré.
COBYLA — MARE Constrained Optimization By Linear Approximation, limigita optimumigo kun lineara aproksimado (sen gradienta kalkulo). Vikio artikolo.
Depende de la elektita metodo, kondiĉoj kaj limigoj por solvi la problemon estas agordita malsame:
klasobjekto Bounds por metodoj L-BFGS-B, TNC, SLSQP, trust-constr;
la listo (min, max) por la samaj metodoj L-BFGS-B, TNC, SLSQP, trust-constr;
objekto aŭ listo de objektoj LinearConstraint, NonlinearConstraint por COBYLA, SLSQP, trust-constr-metodoj;
vortaro aŭ listo de vortaroj {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} por COBYLA, SLSQP-metodoj.
Artikola skizo:
1) Konsideru la uzon de kondiĉa optimumiga algoritmo en la fidregiono (metodo = "trust-constr") kun limoj specifitaj kiel objektoj Bounds, LinearConstraint, NonlinearConstraint ;
2) Konsideru sinsekvan programadon uzante la metodon de malplej kvadrataj (metodo = "SLSQP") kun limigoj specifitaj en la formo de vortaro {'type', 'fun', 'jac', 'args'};
3) Analizu ekzemplon de optimumigo de fabrikitaj produktoj uzante la ekzemplon de retejo-studio.
Kondiĉa optimumiga metodo="trust-constr"
Efektivigo de la metodo trust-constr bazita sur EQSQP por problemoj kun limoj de la formo de egaleco kaj plu VOJAĜO por problemoj kun limoj en formo de neegalaĵoj. Ambaŭ metodoj estas efektivigitaj per algoritmoj por trovado de loka minimumo en la fidregiono kaj estas bone konvenitaj por grandskalaj problemoj.
Matematika formuliĝo de la problemo de trovado de minimumo en ĝenerala formo:
Por striktaj egaleclimoj, la malsupra limo estas metita egala al la supra limo .
Por unudirekta limo, la supra aŭ malsupra limo estas fiksita np.inf kun la responda signo.
Estu necese trovi la minimumon de konata Rosenbrock-funkcio de du variabloj:
En ĉi tiu kazo, la sekvaj restriktoj estas fiksitaj sur ĝia domajno de difino:
En nia kazo, estas unika solvo ĉe la punkto , por kiuj validas nur la unua kaj kvara limigoj.
Ni trarigardu la limigojn de malsupre al supro kaj rigardu kiel ni povas skribi ilin en scipy.
Restriktoj и ni difinu ĝin uzante la objekton Bounds.
La jakobia matrico por limoj ankaŭ povas esti kalkulita uzante finhavajn diferencojn. Tamen, en ĉi tiu kazo la Hessa matrico ne povas esti kalkulita uzante finhavajn diferencojn. La Hessian devas esti difinita kiel funkcio aŭ uzante la HessianUpdateStrategy klason.
Alternative, la unua kaj dua derivaĵoj de la funkcio estanta optimumigita povas esti proksimumataj. Ekzemple, la Hessian povas esti proksimuma uzante la funkcion SR1 (kvazaŭ-newtona aproksimado). La gradiento povas esti proksimuma per finhavaj diferencoj.
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)
Kondiĉa optimumiga metodo="SLSQP"
La SLSQP-metodo estas dizajnita por solvi problemojn de minimumigado de funkcio en la formo:
Kie и — aroj de indeksoj de esprimoj priskribantaj restriktojn en formo de egalecoj aŭ neegalaĵoj. — aroj de malsuperaj kaj superaj baroj por la domajno de difino de la funkcio.
Liniaj kaj neliniaj limoj estas priskribitaj en la formo de vortaroj kun klavoj 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 ]
Optimumigo Ekzemplo
Lige kun la transiro al la kvina teknologia strukturo, ni rigardu produktadon-optimumigo uzante la ekzemplon de retejo-studio, kiu alportas al ni malgrandan sed stabilan enspezon. Ni imagu nin kiel la direktoro de galero kiu produktas tri specojn de produktoj:
x0 - vendado de landpaĝoj, de 10 tr.
x1 - kompaniaj retejoj, ekde 20 tr.
x2 - interretaj vendejoj, de 30 tr.
Nia amika laborteamo inkluzivas kvar junulojn, du mezajn kaj unu maljunulojn. Ilia monata labortempa fonduso:
junioj: 4 * 150 = 600 чел * час,
mezoj: 2 * 150 = 300 чел * час,
sinjoro: 150 чел * час.
Lasu la unuajn disponeblajn junulojn pasigi (0, 1, 2) horojn por la disvolviĝo kaj disvastigo de unu loko de tipo (x10, x20, x30), meza - (7, 15, 20), altranga - (5, 10, 15). ) horoj de la plej bona tempo de via vivo.
Kiel ĉiu normala direktoro, ni volas maksimumigi monatajn profitojn. La unua paŝo al sukceso estas noti la objektivan funkcion value kiel la kvanto de enspezo de produktoj produktitaj monate:
Kaj finfine, la plej roza supozo estas, ke pro la malalta prezo kaj alta kvalito, vico da kontentaj klientoj konstante viciĝas por ni. Ni mem povas elekti la monatajn produktadajn volumojn, surbaze de solvado de la limigita optimumiga problemo scipy.optimize:
Ni rondiru malfikse al tutaj nombroj kaj kalkulu la monatan ŝarĝon de remistoj kun optimuma distribuado de produktoj. x = (8, 6, 3) :
junioj: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
mezoj: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
sinjoro: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.
Konkludo: por ke la direktoro ricevu sian merititan maksimumon, estas optimume krei 8 landpaĝojn, 6 mezgrandajn retejojn kaj 3 vendejojn monate. En ĉi tiu kazo, la maljunulo devas plugi sen rigardi supren de la maŝino, la ŝarĝo de la mezoj estos proksimume 2/3, la junuloj malpli ol duono.
konkludo
La artikolo skizas la bazajn teknikojn por labori kun la pakaĵo scipy.optimize, uzata por solvi kondiĉajn minimumigproblemojn. Persone mi uzas scipy pure por akademiaj celoj, tial la ekzemplo donita estas de tia komika naturo.
Multaj teorioj kaj virtualaj ekzemploj troveblas, ekzemple, en la libro de I.L. Akulich "Matematika programado en ekzemploj kaj problemoj". Pli hardcore aplikaĵo scipy.optimize konstrui 3D strukturon el aro da bildoj (artikolo pri Habré) videblas en scipy-kuirlibro.
La ĉefa fonto de informo estas docs.scipy.orgtiuj, kiuj volas kontribui al la traduko de ĉi tiu kaj aliaj sekcioj scipy Bonvenon al GitHub.
Спасибо mefistofeoj por partopreno en la preparado de la eldonaĵo.