SciPy (talaffuzi sai pie) - bu C va Fortran kutubxonalarini o'z ichiga olgan numpy asosidagi matematika to'plami. SciPy interaktiv Python seansingizni MATLAB, IDL, Octave, R yoki SciLab kabi to'liq ma'lumot faniga aylantiradi.
Ushbu maqolada biz matematik dasturlashning asosiy usullarini ko'rib chiqamiz - scipy.optimize paketi yordamida bir nechta o'zgaruvchilarning skalyar funksiyasi uchun shartli optimallashtirish masalalarini hal qilish. Cheklanmagan optimallashtirish algoritmlari allaqachon muhokama qilingan oxirgi maqola. Scipy funktsiyalari bo'yicha batafsil va dolzarb yordamni har doim help() buyrug'i, Shift+Tab yoki ichidan olish mumkin. rasmiy hujjatlar.
kirish
Scipy.optimize paketidagi shartli va cheklanmagan optimallashtirish muammolarini hal qilish uchun umumiy interfeys funksiya tomonidan taqdim etiladi. minimize(). Biroq, ma'lumki, barcha muammolarni hal qilishning universal usuli yo'q, shuning uchun adekvat usulni tanlash, har doimgidek, tadqiqotchining yelkasiga tushadi.
Tegishli optimallashtirish algoritmi funktsiya argumenti yordamida belgilanadi minimize(..., method="").
Bir nechta o'zgaruvchilar funksiyasini shartli optimallashtirish uchun quyidagi usullarni qo'llash mumkin:
SLSQP — cheklovlar bilan ketma-ket kvadratik dasturlash, Lagranj tizimini yechishning Nyuton usuli. Wiki maqola.
TNC - Kesilgan Nyuton Cheklangan, takrorlanishlar soni cheklangan, ko'p sonli mustaqil o'zgaruvchilarga ega chiziqli bo'lmagan funksiyalar uchun yaxshi. Wiki maqola.
L-BFGS-B - Broyden-Fletcher-Goldfarb-Shanno jamoasining usuli, Hessian matritsasidan vektorlarning qisman yuklanishi tufayli xotira sarfini kamaytirish bilan amalga oshirildi. Wiki maqola, Habré haqidagi maqola.
COBYLA — Lineer yaqinlashish orqali MARE cheklangan optimallashtirish, chiziqli yaqinlashish bilan cheklangan optimallashtirish (gradient hisobisiz). Wiki maqola.
Tanlangan usulga qarab, muammoni hal qilish uchun shartlar va cheklovlar boshqacha o'rnatiladi:
sinf ob'ekti Bounds usullari uchun L-BFGS-B, TNC, SLSQP, trust-constr;
ro'yxati (min, max) bir xil usullar uchun L-BFGS-B, TNC, SLSQP, trust-constr;
Maqola tavsifi:
1) Ob'ektlar sifatida belgilangan cheklovlar bilan ishonchli mintaqada shartli optimallashtirish algoritmidan foydalanishni ko'rib chiqing (metod="trust-constr"). Bounds, LinearConstraint, NonlinearConstraint ;
2) Lug'at shaklida ko'rsatilgan cheklovlar bilan eng kichik kvadratlar usuli (metod = "SLSQP") yordamida ketma-ket dasturlashni ko'rib chiqing. {'type', 'fun', 'jac', 'args'};
3) Veb-studiya misolida ishlab chiqarilgan mahsulotlarni optimallashtirish misolini tahlil qiling.
Shartli optimallashtirish usuli = "trust-constr"
Usulni amalga oshirish trust-constr asoslangan EQSQP tenglik shaklidagi cheklovlar bilan bog'liq muammolar uchun va boshqalar TRIP tengsizliklar ko'rinishidagi cheklovlar bilan bog'liq muammolar uchun. Ikkala usul ham ishonchli mintaqada mahalliy minimumni topish algoritmlari bilan amalga oshiriladi va keng ko'lamli muammolar uchun juda mos keladi.
Minimumni topish masalasini umumiy shaklda matematik shakllantirish:
Qattiq tenglik cheklovlari uchun pastki chegara yuqori chegaraga tenglashtiriladi .
Bir tomonlama cheklov uchun yuqori yoki pastki chegara o'rnatiladi np.inf tegishli belgi bilan.
Ikki o'zgaruvchining ma'lum Rosenbrok funktsiyasining minimalini topish kerak bo'lsin:
Bunday holda, uning ta'rif sohasiga quyidagi cheklovlar qo'yiladi:
Bizning holatda, nuqtada o'ziga xos yechim mavjud , ular uchun faqat birinchi va to'rtinchi cheklovlar amal qiladi.
Keling, cheklovlarni pastdan yuqoriga qarab ko'rib chiqamiz va ularni scipy-da qanday yozishni ko'rib chiqamiz.
Cheklovlar и uni Bounds obyekti yordamida aniqlaymiz.
Hessian matritsasini hisoblashda ko'p harakat talab qiladi, siz sinfdan foydalanishingiz mumkin HessianUpdateStrategy. Quyidagi strategiyalar mavjud: BFGS и SR1.
Cheklovlar uchun Yakobiy matritsasi cheklangan farqlar yordamida ham hisoblanishi mumkin. Biroq, bu holda Hessian matritsasi cheklangan farqlar yordamida hisoblab bo'lmaydi. Hessian funksiya sifatida aniqlanishi yoki HessianUpdateStrategy sinfidan foydalanishi kerak.
Shu bilan bir qatorda optimallashtirilayotgan funksiyaning birinchi va ikkinchi hosilalarini taxminan hisoblash mumkin. Masalan, Hessian funksiyasi yordamida taxminiy hisoblanishi mumkin SR1 (kvazi-Nyuton yaqinlashuvi). Gradientni chekli farqlar bilan taxmin qilish mumkin.
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)
Shartli optimallashtirish usuli = "SLSQP"
SLSQP usuli funktsiyani quyidagi shaklda minimallashtirish muammolarini hal qilish uchun mo'ljallangan:
Qaerda и — tenglik yoki tengsizlik koʻrinishidagi cheklovlarni tavsiflovchi iboralar koʻrsatkichlari toʻplami. — funksiyani aniqlash sohasi uchun pastki va yuqori chegaralar to‘plami.
Chiziqli va chiziqli bo'lmagan cheklovlar kalitli lug'atlar ko'rinishida tasvirlangan 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 ]
Optimallashtirish misoli
Beshinchi texnologik tuzilmaga o'tish munosabati bilan, bizga kichik, ammo barqaror daromad keltiradigan veb-studiya misolida ishlab chiqarishni optimallashtirishni ko'rib chiqaylik. Keling, o'zimizni uchta turdagi mahsulotlarni ishlab chiqaradigan oshxona direktori sifatida tasavvur qilaylik:
x0 - ochilish sahifalarini sotish, 10 tr dan.
x1 - korporativ veb-saytlar, 20 tr dan.
x2 - onlayn-do'konlar, 30 tr dan.
Bizning do'stona ishchi jamoamiz to'rtta kichik, ikkita o'rta va bitta katta yoshlilardan iborat. Ularning oylik ish vaqti fondi:
Iyun: 4 * 150 = 600 чел * час,
o'rtalari: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Birinchi mavjud bo'lgan o'smirlar (x0, x1, x2), o'rta - (10, 20, 30), kattalar - (7, 15, 20) turdagi saytlarni ishlab chiqish va joylashtirishga (5, 10, 15) soat sarflashlariga ruxsat bering. ) hayotingizdagi eng yaxshi vaqt soatlari.
Har qanday oddiy direktor singari, biz oylik daromadni maksimal darajada oshirishni xohlaymiz. Muvaffaqiyatga erishish uchun birinchi qadam maqsad funktsiyasini yozishdir value oyiga ishlab chiqarilgan mahsulotdan olingan daromad miqdori sifatida:
Va nihoyat, eng qizg'in taxmin shuki, past narx va yuqori sifat tufayli biz uchun qoniqarli mijozlar navbati doimiy ravishda paydo bo'ladi. Biz cheklangan optimallashtirish muammosini hal qilish asosida oylik ishlab chiqarish hajmlarini o'zimiz tanlashimiz mumkin scipy.optimize:
Xulosa: direktor o'zining munosib maksimalini olishi uchun oyiga 8 ta ochilish sahifasi, 6 ta o'rta o'lchamli sayt va 3 ta do'kon yaratish maqbuldir. Bunday holda, kattalar mashinadan bosh ko'tarmasdan haydashlari kerak, o'rtalarning yuki taxminan 2/3, kichiklar esa yarmidan kam bo'ladi.
xulosa
Maqolada paket bilan ishlashning asosiy usullari ko'rsatilgan scipy.optimize, shartli minimallashtirish masalalarini hal qilish uchun ishlatiladi. Shaxsan men foydalanaman scipy faqat ilmiy maqsadlar uchun, shuning uchun berilgan misol juda kulgili xususiyatga ega.
Ko'pgina nazariya va virtual misollarni, masalan, I.L.Akulichning "Matematik dasturlash misollar va muammolarda" kitobida topish mumkin. Ko'proq qattiq dastur scipy.optimize tasvirlar to'plamidan 3D tuzilmani qurish (Habré haqidagi maqola) ichida ko'rish mumkin scipy-oshpaz kitobi.
Asosiy ma'lumot manbai docs.scipy.orgushbu va boshqa bo'limlarni tarjima qilishga hissa qo'shishni xohlovchilar scipy Ga Xush kelibsiz GitHub.
Rahmat mefistofelar nashrni tayyorlashda ishtirok etgani uchun.