SciPy (dibaca sai pie) mangrupikeun pakét matematika dumasar-numpy anu ogé kalebet perpustakaan C sareng Fortran. SciPy ngarobih sési Python interaktif anjeun janten lingkungan élmu data lengkep sapertos MATLAB, IDL, Octave, R, atanapi SciLab.
Dina artikel ieu kami baris kasampak di téknik dasar programming matematik - ngarengsekeun masalah optimasi kondisional pikeun fungsi skalar sababaraha variabel ngagunakeun pakét scipy.optimize. Algoritma optimasi unconstrained geus dibahas dina tulisan panungtung. Pitulung anu langkung lengkep sareng up-to-date dina fungsi scipy tiasa didapet nganggo paréntah pitulung (), Shift + Tab atanapi di dokuméntasi resmi.
perkenalan
Antarbeungeut umum pikeun ngarengsekeun masalah optimasi kondisional sareng henteu terbatas dina pakét scipy.optimize disayogikeun ku fungsi. minimize(). Nanging, dipikanyaho yén teu aya metode universal pikeun ngarengsekeun sadaya masalah, janten pilihan metode anu nyukupan, sapertos biasa, tumiba dina taktak panalungtik.
Algoritma optimasi anu luyu ditunjukkeun nganggo argumen fungsi minimize(..., method="").
Pikeun optimasi kondisional hiji fungsi sababaraha variabel, palaksanaan sahiji metodeu di handap ieu sadia:
SLSQP - programming kuadrat sequential kalawan konstrain, métode Newtonian pikeun ngarengsekeun sistem Lagrange. Artikel Wiki.
TNC - Dipotong Newton Konstrain, jumlah kawates iterations, alus pikeun fungsi nonlinier kalawan jumlah badag variabel bebas. Artikel Wiki.
L-BFGS-B - métode ti tim Broyden-Fletcher-Goldfarb-Shanno, dilaksanakeun kalawan ngurangan konsumsi memori alatan loading parsial vektor ti matrix Hessian. Artikel Wiki, artikel ngeunaan Habré.
COBYLA - MARE Konstrain Optimasi Ku Linear Approximation, konstrain optimasi kalawan pendekatan linier (tanpa itungan gradién). Artikel Wiki.
Gumantung kana metode anu dipilih, kaayaan sareng larangan pikeun ngarengsekeun masalah diatur béda:
objék kelas Bounds pikeun métode L-BFGS-B, TNC, SLSQP, trust-constr;
daptar (min, max) pikeun métode sarua L-BFGS-B, TNC, SLSQP, trust-constr;
hiji obyék atawa daptar objék LinearConstraint, NonlinearConstraint pikeun COBYLA, SLSQP, métode trust-constr;
kamus atawa daptar kamus {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} pikeun COBYLA, métode SLSQP.
Outline artikel:
1) Pertimbangkeun pamakean algoritma optimasi kondisional di daérah amanah (metode = "trust-constr") kalayan konstrain anu ditetepkeun salaku objék Bounds, LinearConstraint, NonlinearConstraint ;
2) Pertimbangkeun program sequential nganggo metode kuadrat pangleutikna (metode = "SLSQP") kalayan larangan anu ditetepkeun dina bentuk kamus {'type', 'fun', 'jac', 'args'};
3) Nganalisis conto optimasi produk anu diproduksi nganggo conto studio wéb.
Conditional optimization method="trust-constr"
Palaksanaan métode trust-constr dumasarkeun kana EQSQP pikeun masalah jeung konstrain tina bentuk sarua jeung saterusna perjalanan pikeun masalah sareng konstrain dina bentuk kateusaruaan. Kadua metodeu dilaksanakeun ku algoritma pikeun milarian minimum lokal di daérah kapercayaan sareng cocog pikeun masalah skala ageung.
Rumusan matematik tina masalah milarian minimum dina bentuk umum:
Pikeun konstrain sarua ketat, wates handap diatur sarua jeung wates luhur .
Pikeun konstrain hiji arah, wates luhur atawa handap disetel np.inf kalawan tanda pakait.
Anggap perlu pikeun manggihan minimum hiji fungsi Rosenbrock dipikawanoh dua variabel:
Dina hal ieu, larangan di handap ieu diatur dina domain definisi na:
Dina kasus urang, aya solusi unik dina titik , anu ngan ukur larangan kahiji sareng kaopat anu valid.
Hayu urang ngaliwat larangan ti handap ka luhur sareng tingali kumaha urang tiasa nyeratna dina scipy.
larangan и hayu urang ngartikeun eta ngagunakeun obyék Bounds.
Matriks Jacobian pikeun konstrain ogé tiasa diitung nganggo bédana terbatas. Sanajan kitu, dina hal ieu matriks Hessian teu bisa diitung ngagunakeun béda terhingga. Hessian kedah dihartikeun salaku fungsi atanapi nganggo kelas HessianUpdateStrategy.
Alternatipna, turunan kahiji jeung kadua tina fungsi nu keur dioptimalkeun bisa diitung kira. Salaku conto, Hessian tiasa dideukeutan nganggo fungsina SR1 (perkiraan kuasi-Newtonian). Gradién tiasa dikira-kira ku bédana anu terbatas.
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)
Métode optimasi kondisional = "SLSQP"
Metodeu SLSQP dirancang pikeun ngajawab masalah ngaminimalkeun fungsi dina bentuk:
di mana и - susunan indéks ekspresi ngajéntrékeun larangan dina bentuk sarua atawa kateusaruaan. - susunan wates handap jeung luhur pikeun domain tina harti fungsi.
Konstrain linier jeung nonlinier digambarkeun dina wangun kamus kalawan konci 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])
}
Pilarian pikeun minimum dilaksanakeun sapertos kieu:
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Conto Optimasi
Dina sambungan jeung transisi ka struktur téhnologis kalima, hayu urang nempo optimasi produksi ngagunakeun conto hiji studio web, nu brings kami panghasilan leutik tapi stabil. Hayu urang ngabayangkeun diri urang salaku diréktur galley nu ngahasilkeun tilu jenis produk:
x0 - ngajual kaca badarat, ti 10 tr.
x1 - situs web perusahaan, ti 20 tr.
x2 - toko online, ti 30 tr.
Tim kerja ramah kami ngawengku opat juniors, dua middles sarta hiji senior. Dana waktos kerja bulanan maranéhna:
Juni: 4 * 150 = 600 чел * час,
tengah: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Hayu kahiji sadia junior méakkeun (0, 1, 2) jam dina ngembangkeun sarta deployment sahiji situs tina tipe (x10, x20, x30), tengah - (7, 15, 20), senior - (5, 10, 15). ) jam tina waktos pangalusna dina hirup anjeun.
Sapertos diréktur biasa, urang hoyong maksimalkeun kauntungan bulanan. Léngkah munggaran pikeun suksés nyaéta nuliskeun fungsi tujuan value sakumaha jumlah panghasilan tina produk dihasilkeun per bulan:
Sarta pamustunganana, asumsi paling rosy éta alatan harga low jeung kualitas luhur, antrian konsumén wareg terus baris pikeun urang. Urang bisa milih volume produksi bulanan sorangan, dumasar kana ngarengsekeun masalah optimasi konstrain jeung scipy.optimize:
Hayu urang buleud sacara bébas kana sakabeh angka jeung ngitung beban bulanan rowers kalawan distribusi optimal produk x = (8, 6, 3) :
Juni: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
tengah: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
senor: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.
Kacindekan: supados sutradara nampi maksimal anu pantes, optimal pikeun nyiptakeun 8 halaman badarat, 6 situs ukuran sedeng sareng 3 toko per bulan. Dina hal ieu, senior kudu bajak tanpa pilari ka luhur tina mesin, beban tina middles bakal kurang leuwih 2/3, juniors kirang ti satengah.
kacindekan
Tulisan éta ngajelaskeun téknik dasar pikeun damel sareng bungkusan scipy.optimize, dipaké pikeun ngajawab masalah minimization kondisional. Pribadi kuring nganggo scipy murni pikeun tujuan akademik, naha éta conto anu dipasihkeun sipatna humoris.
Seueur téori sareng conto maya tiasa dipendakan, contona, dina buku I.L. Akulich "Programming Matematika dina conto sareng masalah." Langkung aplikasi hardcore scipy.optimize ngawangun struktur 3D tina sakumpulan gambar (artikel ngeunaan Habré) tiasa ditingali dina scipy-buku masak.
Sumber utama inpormasi nyaéta docs.scipy.organu hoyong nyumbang kana tarjamahan ieu sareng bagian anu sanés scipy Wilujeng sumping di GitHub.
Спасибо méphistophées pikeun partisipasi dina persiapan publikasi.