SciPy (lausutaan sai pie) on numpy-pohjainen matematiikkapaketti, joka sisältää myös C- ja Fortran-kirjastot. SciPy muuttaa interaktiivisen Python-istunnon täydelliseksi datatieteen ympäristöksi, kuten MATLAB, IDL, Octave, R tai SciLab.
Tässä artikkelissa tarkastellaan matemaattisen ohjelmoinnin perustekniikoita - useiden muuttujien skalaarifunktion ehdollisten optimointiongelmien ratkaisemista scipy.optimize-paketin avulla. Rajoittamattomista optimointialgoritmeista on jo keskusteltu viimeinen artikkeli. Tarkempia ja ajantasaisia ohjeita scipy-funktioista saat aina help()-komennolla, Shift+Tab tai virallinen dokumentaatio.
Esittely
Toiminto tarjoaa yhteisen käyttöliittymän sekä ehdollisten että rajoittamattomien optimointiongelmien ratkaisemiseen scipy.optimize-paketissa minimize(). Tiedetään kuitenkin, että kaikkien ongelmien ratkaisemiseen ei ole olemassa universaalia menetelmää, joten sopivan menetelmän valinta on, kuten aina, tutkijan harteilla.
Sopiva optimointialgoritmi määritetään käyttämällä funktioargumenttia minimize(..., method="").
Useiden muuttujien funktion ehdolliseen optimointiin on käytettävissä seuraavat menetelmät:
TNC - Typistetty Newton Rajoitettu, rajoitettu määrä iteraatioita, hyvä epälineaarisille funktioille, joissa on suuri määrä riippumattomia muuttujia. Wiki artikkeli.
L-BFGS-B — Broyden–Fletcher–Goldfarb–Shanno-tiimin menetelmä, joka on toteutettu pienemmällä muistinkulutuksella, koska vektorit on ladattu osittain Hessenin matriisista. Wiki artikkeli, artikkeli Habresta.
COBYLA — MARE rajoitettu optimointi lineaarisella approksimaatiolla, rajoitettu optimointi lineaarisella approksimaatiolla (ilman gradienttilaskentaa). Wiki artikkeli.
Valitusta menetelmästä riippuen ongelman ratkaisemisen ehdot ja rajoitukset asetetaan eri tavalla:
luokan objekti Bounds menetelmille L-BFGS-B, TNC, SLSQP, trust-constr;
lista (min, max) samoilla menetelmillä L-BFGS-B, TNC, SLSQP, trust-constr;
objekti tai objektiluettelo LinearConstraint, NonlinearConstraint COBYLA-, SLSQP-, trust-constr-menetelmille;
sanakirja tai sanakirjaluettelo {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} COBYLA-, SLSQP-menetelmille.
Artikkelin pääpiirteet:
1) Harkitse ehdollisen optimointialgoritmin käyttöä luottamusalueella (method=”trust-constr”) objekteiksi määritettyjen rajoitusten kanssa Bounds, LinearConstraint, NonlinearConstraint ;
2) Harkitse peräkkäistä ohjelmointia pienimmän neliösumman menetelmällä (method = "SLSQP") rajoituksin, jotka on määritelty sanakirjan muodossa {'type', 'fun', 'jac', 'args'};
3) Analysoi esimerkki valmistettujen tuotteiden optimoinnista web-studion esimerkillä.
Ehdollinen optimointimenetelmä="trust-constr"
Menetelmän toteutus trust-constr perustuen EQSQP tasa-arvon muotoon liittyviin ongelmiin ja muihin TRIP ongelmiin, jotka liittyvät eriarvoisuuden muodossa oleviin rajoituksiin. Molemmat menetelmät on toteutettu algoritmeilla paikallisen minimin löytämiseksi luottamusalueelta ja ne sopivat hyvin suuriin ongelmiin.
Tiukkoja tasa-arvorajoituksia varten alaraja asetetaan yhtä suureksi kuin yläraja .
Yksisuuntaiselle rajoitukselle asetetaan ylä- tai alaraja np.inf vastaavalla merkillä.
Olkoon tarpeen löytää tunnetun Rosenbrock-funktion minimi kahdesta muuttujasta:
Tässä tapauksessa sen määritelmäalueelle asetetaan seuraavat rajoitukset:
Meidän tapauksessamme on olemassa ainutlaatuinen ratkaisu , joille vain ensimmäinen ja neljäs rajoitus ovat voimassa.
Käydään rajoitukset läpi alhaalta ylös ja katsotaan kuinka voimme kirjoittaa ne scipy-kielellä.
Rajoitukset и määritellään se käyttämällä Bounds-objektia.
Jakobilainen matriisi rajoituksille voidaan myös laskea käyttämällä äärellisiä eroja. Tässä tapauksessa Hessen-matriisia ei kuitenkaan voida laskea äärellisillä eroilla. Hessian on määritettävä funktiona tai käyttämällä HessianUpdateStrategy-luokkaa.
Vaihtoehtoisesti optimoitavan funktion ensimmäinen ja toinen derivaatta voidaan approksimoida. Esimerkiksi Hessian voidaan approksimoida funktiolla SR1 (quasi-Newtonin approksimaatio). Gradientti voidaan arvioida äärellisillä eroilla.
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)
Ehdollinen optimointimenetelmä="SLSQP"
SLSQP-menetelmä on suunniteltu ratkaisemaan funktion minimointiongelmia muodossa:
jossa и — lausekkeiden indeksit, jotka kuvaavat rajoituksia yhtäläisyyksien tai eriarvoisuuksien muodossa. — funktion määrittelyalueen ala- ja ylärajojen joukot.
Lineaariset ja epälineaariset rajoitukset on kuvattu avaimilla varustettujen sanakirjojen muodossa 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 ]
Esimerkki optimoinnista
Viidenteen teknologiseen rakenteeseen siirtymisen yhteydessä tarkastellaan tuotannon optimointia web-studion esimerkillä, joka tuo meille pienen mutta vakaan tulon. Kuvittelemme itseämme keittiön johtajana, joka tuottaa kolmenlaisia tuotteita:
x0 - aloitussivujen myynti, alkaen 10 tr.
x1 - yritysten verkkosivut, alkaen 20 tr.
x2 - verkkokaupat, alkaen 30 tr.
Ystävälliseen työporukkaamme kuuluu neljä junioria, kaksi keskimmäistä ja yksi seniori. Heidän kuukausittainen työaikarahastonsa:
Kesäkuu: 4 * 150 = 600 чел * час,
keskikohdat: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Anna ensimmäisen käytettävissä olevan juniorin käyttää (0, 1, 2) tuntia yhden tyypin (x10, x20, x30), keskitason (7, 15, 20), senior - (5, 10, 15) sivuston kehittämiseen ja käyttöönottoon. ) tuntia elämäsi parasta aikaa.
Kuten kaikki normaalit johtajat, haluamme maksimoida kuukausittaiset voitot. Ensimmäinen askel menestykseen on tavoitefunktion kirjoittaminen value tuotettujen tuotteiden tulona kuukaudessa:
Ja lopuksi, ruusuisin oletus on, että alhaisen hinnan ja korkean laadun vuoksi jono tyytyväisiä asiakkaita odottaa jatkuvasti meitä. Voimme valita itse kuukausittaiset tuotantomäärät, perustuen rajoittuneen optimointiongelman ratkaisuun scipy.optimize:
Johtopäätös: jotta ohjaaja saisi ansaitun maksiminsa, on optimaalista luoda 8 aloitussivua, 6 keskikokoista sivustoa ja 3 kauppaa kuukaudessa. Tällöin seniorin tulee kyntää koneesta katsomatta, keskiosien kuormitus on noin 2/3, juniorien alle puolet.
Johtopäätös
Artikkelissa kuvataan perustekniikat paketin kanssa työskentelyyn scipy.optimize, jota käytetään ratkaisemaan ehdollisia minimointiongelmia. Henkilökohtaisesti käytän scipy puhtaasti akateemisiin tarkoituksiin, minkä vuoksi annettu esimerkki on luonteeltaan niin koominen.
Paljon teoriaa ja virtuaalisia esimerkkejä löytyy esimerkiksi I.L. Akulichin kirjasta "Mathematical programming in examples and problems". Lisää hardcore-sovelluksia scipy.optimize rakentaa 3D-rakenne joukosta kuvia (artikkeli Habresta) voi katsoa scipy-keittokirja.
Pääasiallinen tiedonlähde on docs.scipy.orgjotka haluavat osallistua tämän ja muiden osien kääntämiseen scipy Tervetuloa GitHub.
Kiitos mefistofeet osallistumisesta julkaisun valmisteluun.