SciPy (hääldatakse sai pie) on numpy-põhine matemaatikapakett, mis sisaldab ka C- ja Fortrani teeke. SciPy muudab teie interaktiivse Pythoni seansi täielikuks andmeteaduse keskkonnaks, nagu MATLAB, IDL, Octave, R või SciLab.
Selles artiklis vaatleme matemaatilise programmeerimise põhitehnikaid – mitme muutuja skalaarfunktsiooni tingimusliku optimeerimise ülesannete lahendamist paketi scipy.optimize abil. Piiramatuid optimeerimisalgoritme on juba käsitletud viimane artikkel. Üksikasjalikumat ja ajakohasemat abi scipy funktsioonide kohta saab alati kasutades käsku help(), Shift+Tab või ametlik dokumentatsioon.
Sissejuhatus
Ühise liidese nii tingimuslike kui ka piiramatute optimeerimisprobleemide lahendamiseks paketi scipy.optimize pakub funktsioon minimize(). Siiski on teada, et universaalset meetodit kõigi probleemide lahendamiseks ei ole olemas, seega langeb adekvaatse meetodi valik, nagu ikka, uurija õlgadele.
Sobiv optimeerimisalgoritm määratakse funktsiooni argumendi abil minimize(..., method="").
Mitme muutuja funktsiooni tingimuslikuks optimeerimiseks on saadaval järgmised meetodid:
SLSQP — järjestikune ruutprogrammeerimine piirangutega, Newtoni meetod Lagrange'i süsteemi lahendamiseks. Wiki artikkel.
TNC - Kärbitud Newton Piiratud, piiratud arv iteratsioone, sobib mittelineaarsete funktsioonide jaoks, millel on suur hulk sõltumatuid muutujaid. Wiki artikkel.
L-BFGS-B — Broyden-Fletcher-Goldfarb-Shanno meeskonna meetod, mida rakendati Hesse maatriksist vektorite osalise laadimise tõttu vähendatud mälutarbimisega. Wiki artikkel, artikkel Habré kohta.
COBYLA — MARE piiratud optimeerimine lineaarse lähendusega, piiratud optimeerimine lineaarse lähendusega (ilma gradiendi arvutamiseta). Wiki artikkel.
Sõltuvalt valitud meetodist seatakse probleemi lahendamise tingimused ja piirangud erinevalt:
klassi objekt Bounds meetodite jaoks L-BFGS-B, TNC, SLSQP, trust-constr;
nimekiri (min, max) samade meetodite jaoks L-BFGS-B, TNC, SLSQP, trust-constr;
objekt või objektide loend LinearConstraint, NonlinearConstraint COBYLA, SLSQP, trust-constr meetodite jaoks;
sõnastik või sõnaraamatute loend {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} COBYLA, SLSQP meetodite jaoks.
Artikli ülevaade:
1) Kaaluge tingimusliku optimeerimisalgoritmi kasutamist usalduspiirkonnas (method=”trust-constr”) koos objektidena määratud piirangutega Bounds, LinearConstraint, NonlinearConstraint ;
2) Kaaluge järjestikust programmeerimist, kasutades vähimruutude meetodit (meetod = "SLSQP"), mille piirangud on määratletud sõnastiku kujul {'type', 'fun', 'jac', 'args'};
3) Analüüsige valmistatud toodete optimeerimise näidet veebistuudio näitel.
Tingimuslik optimeerimismeetod="trust-constr"
Meetodi rakendamine trust-constr põhineb EQSQP võrdõiguslikkuse vormi piirangutega seotud probleemide puhul ja edasi TRIP ebavõrdsuse kujul esinevate piirangutega seotud probleemide jaoks. Mõlemat meetodit rakendavad usalduspiirkonnas lokaalse miinimumi leidmise algoritmid ja need sobivad hästi suuremahuliste probleemide lahendamiseks.
Rangete võrdsuse piirangute korral määratakse alumine piir võrdseks ülemise piiriga .
Ühesuunalise piirangu jaoks määratakse ülemine või alumine piir np.inf vastava märgiga.
Olgu vaja leida kahe muutuja teadaoleva Rosenbrocki funktsiooni miinimum:
Sel juhul on selle määratluspiirkonnale seatud järgmised piirangud:
Meie puhul on punktis ainulaadne lahendus , mille puhul kehtivad ainult esimene ja neljas piirang.
Vaatame piirangud alt üles ja vaatame, kuidas neid scipy keeles kirjutada.
Piirangud и defineerime selle objekti Piirid kasutades.
Piirangute Jacobi maatriksit saab arvutada ka lõplike erinevuste abil. Kuid sel juhul ei saa Hessi maatriksit lõplike erinevuste abil arvutada. Hessian peab olema defineeritud funktsioonina või kasutades klassi HessianUpdateStrategy.
Alternatiivselt saab optimeeritava funktsiooni esimest ja teist tuletist ligikaudselt hinnata. Näiteks Hesseni saab ligikaudselt määrata funktsiooni abil SR1 (kvaasi-Newtoni lähendus). Gradienti saab ligikaudselt hinnata lõplike erinevustega.
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)
Tingimuslik optimeerimismeetod = SLSQP
SLSQP meetod on mõeldud funktsiooni minimeerimise probleemide lahendamiseks järgmisel kujul:
kus и — avaldiste indeksite komplektid, mis kirjeldavad piiranguid võrdsuse või ebavõrdsuse kujul. — funktsiooni määratluspiirkonna alumiste ja ülemiste piiride komplektid.
Lineaarseid ja mittelineaarseid piiranguid kirjeldatakse võtmetega sõnaraamatute kujul 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 ]
Optimeerimise näide
Seoses üleminekuga viiendale tehnoloogilisele struktuurile vaatame veebistuudio näitel tootmise optimeerimist, mis toob meile väikese, kuid stabiilse sissetuleku. Kujutagem end ette kolme tüüpi tooteid tootva kambüüsi direktorina:
x0 - maandumislehtede müük, alates 10 tr.
x1 - ettevõtete veebisaidid, alates 20 tr.
x2 - veebipoed, alates 30 tr.
Meie sõbralikus kollektiivis on neli juuniorit, kaks keskmist ja üks seenior. Nende igakuine tööajafond:
juunid: 4 * 150 = 600 чел * час,
keskmised: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Laske esimesel juunioril kulutada (0, 1, 2) tunde ühe tüüpi (x10, x20, x30), keskmise (7, 15, 20), vanem (5, 10, 15) saidi arendamiseks ja kasutuselevõtuks. ) tundi oma elu parimast ajast.
Nagu iga tavaline direktor, tahame ka meie igakuist kasumit maksimeerida. Esimene samm edu saavutamiseks on eesmärgifunktsiooni üleskirjutamine value tulu summana toodetud toodetest kuus:
Ja lõpuks on kõige roosilisem oletus, et madala hinna ja kõrge kvaliteedi tõttu on meie jaoks pidevalt järjekord rahulolevatest klientidest. Igakuised tootmismahud saame ise valida, lähtudes piiratud optimeerimisprobleemi lahendamisest scipy.optimize:
Järeldus: selleks, et direktor saaks oma väljateenitud maksimumi, on optimaalne luua kuus 8 sihtlehte, 6 keskmise suurusega saiti ja 3 kauplust. Sel juhul peab seenior kündma ilma masinalt üles vaatamata, keskmiste koormus jääb ligikaudu 2/3, juunioritel alla poole.
Järeldus
Artiklis kirjeldatakse paketiga töötamise põhivõtteid scipy.optimize, mida kasutatakse tingimusliku minimeerimise probleemide lahendamiseks. Isiklikult kasutan scipy puhtalt akadeemilistel eesmärkidel, mistõttu on toodud näide nii koomilist laadi.
Palju teooriat ja virtuaalseid näiteid võib leida näiteks I. L. Akulichi raamatust “Matemaatika programmeerimine näidetes ja probleemides”. Rohkem hardcore rakendust scipy.optimize piltide komplektist 3D-struktuuri loomiseks (artikkel Habré kohta) saab vaadata scipy-kokaraamat.
Peamine teabeallikas on docs.scipy.orgneed, kes soovivad anda oma panuse selle ja teiste osade tõlkimisse scipy Tere tulemast GitHub.
Tänan mefistofeed väljaande koostamises osalemise eest.