A SciPy (ejtsd: sai pie) egy numpy alapú matematikai csomag, amely C és Fortran könyvtárakat is tartalmaz. A SciPy interaktív Python-munkamenetét egy teljes adattudományi környezetté alakítja, mint például a MATLAB, az IDL, az Octave, az R vagy a SciLab.
Ebben a cikkben a matematikai programozás alapvető technikáit tekintjük át – feltételes optimalizálási problémák megoldását több változó skalárfüggvényére a scipy.optimize csomag segítségével. A korlátlan optimalizálási algoritmusokról már volt szó utolsó cikk. A scipy függvényekkel kapcsolatos részletesebb és naprakész súgó mindig elérhető a help() paranccsal, a Shift+Tab vagy a hivatalos dokumentáció.
Bevezetés
A scipy.optimize csomag feltételes és korlátlan optimalizálási problémáinak megoldásához közös felületet biztosít a függvény minimize(). Köztudott azonban, hogy minden probléma megoldására nincs univerzális módszer, így a megfelelő módszer kiválasztása, mint mindig, a kutató vállára esik.
A megfelelő optimalizálási algoritmust a függvény argumentum segítségével adjuk meg minimize(..., method="").
Több változó függvényének feltételes optimalizálásához a következő módszerek megvalósításai állnak rendelkezésre:
SLSQP — szekvenciális másodfokú programozás megszorításokkal, Newtoni módszer a Lagrange-rendszer megoldására. Wiki cikk.
TNC - Csonka Newton Korlátozott, korlátozott számú iteráció, jó nemlineáris függvényekhez, nagyszámú független változóval. Wiki cikk.
L-BFGS-B — a Broyden–Fletcher–Goldfarb–Shanno csapat módszere, amelyet csökkentett memóriafelhasználással valósítottak meg a Hess-mátrixból származó vektorok részleges betöltése miatt. Wiki cikk, cikk Habréról.
COBYLA — MARE kényszerített optimalizálás lineáris közelítéssel, kényszerített optimalizálás lineáris közelítéssel (gradiensszámítás nélkül). Wiki cikk.
A választott módszertől függően a probléma megoldásának feltételei és korlátozásai eltérőek:
osztályú objektum Bounds metódusokhoz L-BFGS-B, TNC, SLSQP, trust-constr;
a listát (min, max) ugyanazokhoz a módszerekhez L-BFGS-B, TNC, SLSQP, trust-constr;
egy objektum vagy objektumok listája LinearConstraint, NonlinearConstraint COBYLA, SLSQP, trust-constr metódusokhoz;
szótár vagy szótárlista {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} COBYLA, SLSQP módszerekhez.
Cikk vázlata:
1) Fontolja meg egy feltételes optimalizálási algoritmus használatát a megbízhatósági régióban (method=”trust-constr”) objektumként megadott megszorításokkal Bounds, LinearConstraint, NonlinearConstraint ;
2) Fontolja meg a szekvenciális programozást a legkisebb négyzetek módszerével (method = "SLSQP") szótár formájában megadott korlátozásokkal {'type', 'fun', 'jac', 'args'};
3) Elemezzen egy példát a gyártott termékek optimalizálására egy webstúdió példáján.
Feltételes optimalizálási módszer="trust-constr"
A módszer megvalósítása trust-constr alapján EQSQP az egyenlőség formájának korlátaival kapcsolatos problémákra és tovább TRIP az egyenlőtlenségek formájában jelentkező korlátokkal kapcsolatos problémákra. Mindkét módszert algoritmusok valósítják meg a megbízhatósági régióban lokális minimum meghatározására, és jól alkalmazhatók nagy léptékű problémák megoldására.
A minimum megtalálásának problémájának matematikai megfogalmazása általános formában:
Szigorú egyenlőségi megkötések esetén az alsó korlát egyenlő a felső korláttal .
Egyirányú kényszer esetén a felső vagy az alsó határ van beállítva np.inf a megfelelő jellel.
Legyen szükséges két változó ismert Rosenbrock-függvényének minimumát megtalálni:
Ebben az esetben a következő korlátozások vannak beállítva a definíciós tartományára vonatkozóan:
A mi esetünkben egyedi megoldás van a ponton , amelyre csak az első és a negyedik korlátozás érvényes.
Menjünk végig a korlátozásokon alulról felfelé, és nézzük meg, hogyan írhatjuk le őket scipy-ben.
Korlátozások и definiáljuk a Bounds objektum segítségével.
A Hess-mátrix kiszámításakor sok erőfeszítést igényel, használhat egy osztályt HessianUpdateStrategy. A következő stratégiák állnak rendelkezésre: BFGS и SR1.
A kényszerek Jacobi-mátrixa véges különbségek felhasználásával is kiszámítható. Ebben az esetben azonban a Hess-mátrix nem számítható véges különbségekkel. A Hessian-t függvényként vagy a HessianUpdateStrategy osztály használatával kell meghatározni.
Alternatív megoldásként az optimalizálandó függvény első és második deriváltja közelíthető. Például a Hessian a függvény segítségével közelíthető SR1 (kvázi-newtoni közelítés). A gradiens véges különbségekkel közelíthető.
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)
Feltételes optimalizálási módszer="SLSQP"
Az SLSQP módszert arra tervezték, hogy megoldja a függvény minimalizálásával kapcsolatos problémákat a következő formában:
ahol и — a korlátozásokat egyenlőségek vagy egyenlőtlenségek formájában leíró kifejezések indexei. — alsó és felső határok halmazai a függvény definíciós tartományához.
A lineáris és nemlineáris kényszerek leírása kulcsos szótárak formájában történik 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 ]
Optimalizálási példa
Az ötödik technológiai struktúrára való átállás kapcsán nézzük meg a termelésoptimalizálást egy webstúdió példáján, ami csekély, de stabil bevételt hoz nekünk. Képzeljük el magunkat egy háromféle terméket előállító gálya igazgatójának:
x0 - céloldalak értékesítése, 10 tr.
x1 - céges weboldalak, 20 tr.
x2 - webáruházak, 30 tr.
Barátságos csapatunkban négy junior, két középső és egy felső tagozatos. A havi munkaidő-alapjuk:
június: 4 * 150 = 600 чел * час,
középső: 2 * 150 = 300 чел * час,
Senor: 150 чел * час.
Töltsön az első rendelkezésre álló junior (0, 1, 2) órát egy (x10, x20, x30), középső - (7, 15, 20), idősebb - (5, 10, 15) típusú helyszín fejlesztésére és telepítésére. ) órái élete legjobb időszakából.
Mint minden rendes igazgató, mi is maximalizálni akarjuk a havi nyereséget. A siker első lépése a célfüggvény feljegyzése value az előállított termékekből származó bevétel havi összegeként:
És végül a legrózsásabb feltevés, hogy az alacsony ár és a magas minőség miatt folyamatosan elégedett vásárlók sora áll felénk. A havi gyártási mennyiségeket magunk választhatjuk meg, a kényszerű optimalizálási probléma megoldása alapján scipy.optimize:
Kerekítsünk lazán egész számokra, és számoljuk ki az evezősök havi terhelését optimális termékeloszlás mellett x = (8, 6, 3) :
június: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
középső: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
Senor: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.
Következtetés: ahhoz, hogy a rendező megkapja a jól megérdemelt maximumát, optimális havonta 8 landing oldalt, 6 közepes méretű oldalt és 3 üzletet létrehozni. Ebben az esetben a szeniornak úgy kell szántania, hogy nem néz fel a gépről, a középsők terhelése megközelítőleg 2/3, a juniorok kevesebb mint fele.
Következtetés
A cikk felvázolja a csomaggal való munka alapvető technikáit scipy.optimize, feltételes minimalizálási problémák megoldására szolgál. Személy szerint én használom scipy pusztán akadémiai céllal, ezért is olyan komikus jellegű a felhozott példa.
Sok elmélet és virtuális példa található például I. L. Akulich „Matematikai programozás példákban és problémákban” című könyvében. Több hardcore alkalmazás scipy.optimize 3D-s struktúra felépítése képek halmazából (cikk Habréról) -ben megtekinthető scipy-szakácskönyv.
A fő információforrás az docs.scipy.orgazoknak, akik ennek és a többi résznek a fordításában kívánnak közreműködni scipy Isten hozott a GitHub.
Köszönöm mefisztó a kiadvány elkészítésében való részvételért.