SciPy (izgovara se sai pie) je matematički paket temeljen na numpyju koji također uključuje C i Fortran biblioteke. SciPy pretvara vašu interaktivnu Python sesiju u potpuno okruženje znanosti o podacima kao što su MATLAB, IDL, Octave, R ili SciLab.
U ovom ćemo članku pogledati osnovne tehnike matematičkog programiranja – rješavanje problema uvjetne optimizacije za skalarnu funkciju nekoliko varijabli pomoću paketa scipy.optimize. O algoritmima neograničene optimizacije već je bilo riječi u zadnji članak. Detaljnija i ažurirana pomoć o scipy funkcijama uvijek se može dobiti pomoću naredbe help(), Shift+Tab ili u službena dokumentacija.
Uvod
Zajedničko sučelje za rješavanje problema uvjetne i neograničene optimizacije u paketu scipy.optimize pruža funkcija minimize(). No, poznato je da ne postoji univerzalna metoda za rješavanje svih problema, pa je izbor adekvatne metode, kao i uvijek, na plećima istraživača.
Odgovarajući algoritam optimizacije specificiran je pomoću argumenta funkcije minimize(..., method="").
Za uvjetnu optimizaciju funkcije nekoliko varijabli dostupne su implementacije sljedećih metoda:
SLSQP — sekvencijalno kvadratno programiranje s ograničenjima, Newtonova metoda za rješavanje Lagrangeova sustava. Wiki članak.
TNC - Krnji Newton ograničen, ograničen broj ponavljanja, dobar za nelinearne funkcije s velikim brojem nezavisnih varijabli. Wiki članak.
L-BFGS-B — metoda tima Broyden–Fletcher–Goldfarb–Shanno, implementirana sa smanjenom potrošnjom memorije zbog djelomičnog učitavanja vektora iz Hessian matrice. Wiki članak, članak na Habréu.
COBYLA — MARE ograničena optimizacija linearnom aproksimacijom, ograničena optimizacija s linearnom aproksimacijom (bez proračuna gradijenta). Wiki članak.
Ovisno o odabranoj metodi različito se postavljaju uvjeti i ograničenja za rješavanje problema:
objekt klase Bounds za metode L-BFGS-B, TNC, SLSQP, trust-constr;
popis (min, max) za iste metode L-BFGS-B, TNC, SLSQP, trust-constr;
objekt ili popis objekata LinearConstraint, NonlinearConstraint za COBYLA, SLSQP, trust-constr metode;
rječnik ili popis rječnika {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} za metode COBYLA, SLSQP.
Pregled članka:
1) Razmotrite upotrebu algoritma uvjetne optimizacije u regiji povjerenja (method=”trust-constr”) s ograničenjima navedenim kao objekti Bounds, LinearConstraint, NonlinearConstraint ;
2) Razmotrite sekvencijalno programiranje korištenjem metode najmanjih kvadrata (metoda = "SLSQP") s ograničenjima navedenim u obliku rječnika {'type', 'fun', 'jac', 'args'};
3) Analizirati primjer optimizacije proizvedenih proizvoda na primjeru web studija.
Metoda uvjetne optimizacije="trust-constr"
Provedba metode trust-constr na temelju EQSQP za probleme s ograničenjima oblika jednakosti i na TRIP za probleme s ograničenjima u obliku nejednakosti. Obje su metode implementirane algoritmima za pronalaženje lokalnog minimuma u području pouzdanosti i dobro su prikladne za probleme velikih razmjera.
Matematička formulacija problema nalaženja minimuma u općem obliku:
Za stroga ograničenja jednakosti, donja granica je jednaka gornjoj granici .
Za jednosmjerno ograničenje postavlja se gornja ili donja granica np.inf s pripadajućim znakom.
Neka je potrebno pronaći minimum poznate Rosenbrockove funkcije dviju varijabli:
U ovom slučaju, sljedeća su ograničenja postavljena na njegovu domenu definicije:
U našem slučaju, u točki postoji jedinstveno rješenje , za koje vrijede samo prvo i četvrto ograničenje.
Prođimo kroz ograničenja odozdo prema gore i pogledajmo kako ih možemo napisati u scipyju.
Ograničenja и definirajmo ga pomoću objekta Bounds.
Jacobianova matrica za ograničenja također se može izračunati korištenjem konačnih razlika. Međutim, u ovom slučaju Hessova matrica ne može se izračunati pomoću konačnih razlika. Hessian se mora definirati kao funkcija ili pomoću klase HessianUpdateStrategy.
Alternativno, prva i druga derivacija funkcije koja se optimizira može se aproksimirati. Na primjer, Hessian se može aproksimirati pomoću funkcije SR1 (kvazi-Newtonova aproksimacija). Gradijent se može aproksimirati konačnim razlikama.
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 uvjetne optimizacije="SLSQP"
Metoda SLSQP dizajnirana je za rješavanje problema minimiziranja funkcije u obliku:
gdje и — skupovi indeksa izraza koji opisuju ograničenja u obliku jednakosti ili nejednakosti. — skupovi donjih i gornjih granica za domenu definiranja funkcije.
Linearna i nelinearna ograničenja opisana su u obliku rječnika s ključevima 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 ]
Primjer optimizacije
U vezi s prelaskom na petu tehnološku strukturu, pogledajmo optimizaciju proizvodnje na primjeru web studija koji nam donosi mali, ali stabilan prihod. Zamislimo sebe kao direktora brodske kuhinje koja proizvodi tri vrste proizvoda:
x0 - prodaja odredišnih stranica, od 10 tr.
x1 - korporativne web stranice, od 20 tr.
x2 - online trgovine, od 30 tr.
Naš prijateljski radni tim sastoji se od četiri juniora, dva srednje i jednog seniora. Njihov mjesečni fond radnog vremena:
lipnja: 4 * 150 = 600 чел * час,
sredina: 2 * 150 = 300 чел * час,
senjor: 150 чел * час.
Neka prvi raspoloživi mlađi provede (0, 1, 2) sati na razvoju i postavljanju jednog mjesta tipa (x10, x20, x30), srednji - (7, 15, 20), viši - (5, 10, 15 ) sati najboljeg provoda u vašem životu.
Kao svaki normalan direktor, želimo maksimizirati mjesečnu dobit. Prvi korak do uspjeha je zapisati funkciju cilja value kao iznos prihoda od proizvoda proizvedenih mjesečno:
I na kraju, najružičastija pretpostavka je da se zbog niske cijene i visoke kvalitete za nama stalno ređa red zadovoljnih kupaca. Možemo sami odabrati mjesečne količine proizvodnje na temelju rješavanja problema ograničene optimizacije s scipy.optimize:
Zaokružimo slobodno na cijele brojeve i izračunajmo mjesečno opterećenje veslača s optimalnom raspodjelom proizvoda x = (8, 6, 3) :
lipnja: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
sredina: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
senjor: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.
Zaključak: kako bi direktor dobio svoj zasluženi maksimum, optimalno je izraditi 8 odredišnih stranica, 6 stranica srednje veličine i 3 trgovine mjesečno. U ovom slučaju, senior mora orati bez podizanja pogleda sa stroja, opterećenje srednjih bit će otprilike 2/3, juniori manje od polovice.
Zaključak
U članku se opisuju osnovne tehnike rada s paketom scipy.optimize, koristi se za rješavanje problema uvjetne minimizacije. Osobno koristim scipy čisto u akademske svrhe, zbog čega je navedeni primjer tako komičan.
Puno teorije i virtualnih primjera može se pronaći, na primjer, u knjizi I.L. Akulich "Matematičko programiranje u primjerima i problemima." Više hardcore aplikacija scipy.optimize izgraditi 3D strukturu iz skupa slika (članak na Habréu) možete pogledati u scipy-kuharica.
Glavni izvor informacija je docs.scipy.orgonima koji žele pridonijeti prijevodu ovog i drugih odjeljaka scipy Dobrodošli u GitHub.
Hvala mefistofeje za sudjelovanje u pripremi publikacije.