SciPy (disebut sai pie) ialah pakej matematik berasaskan numpy yang turut merangkumi perpustakaan C dan Fortran. SciPy menukar sesi Python interaktif anda menjadi persekitaran sains data yang lengkap seperti MATLAB, IDL, Octave, R atau SciLab.
Dalam artikel ini, kita akan melihat teknik asas pengaturcaraan matematik - menyelesaikan masalah pengoptimuman bersyarat untuk fungsi skalar beberapa pembolehubah menggunakan pakej scipy.optimize. Algoritma pengoptimuman tanpa kekangan telah pun dibincangkan dalam artikel terakhir. Bantuan yang lebih terperinci dan terkini mengenai fungsi scipy sentiasa boleh diperoleh menggunakan arahan help(), Shift+Tab atau dalam dokumentasi rasmi.
Pengenalan
Antara muka biasa untuk menyelesaikan masalah pengoptimuman bersyarat dan tidak terhad dalam pakej scipy.optimize disediakan oleh fungsi minimize(). Walau bagaimanapun, diketahui bahawa tidak ada kaedah universal untuk menyelesaikan semua masalah, jadi pilihan kaedah yang mencukupi, seperti biasa, terletak di bahu penyelidik.
Algoritma pengoptimuman yang sesuai ditentukan menggunakan hujah fungsi minimize(..., method="").
Untuk pengoptimuman bersyarat bagi fungsi beberapa pembolehubah, pelaksanaan kaedah berikut tersedia:
SLSQP — pengaturcaraan kuadratik berjujukan dengan kekangan, kaedah Newtonian untuk menyelesaikan sistem Lagrange. Artikel Wiki.
TNC - Newton Terpenggal Terkekang, bilangan lelaran terhad, bagus untuk fungsi tak linear dengan bilangan pembolehubah bebas yang banyak. Artikel Wiki.
L-BFGS-B — kaedah daripada pasukan Broyden–Fletcher–Goldfarb–Shanno, dilaksanakan dengan pengurangan penggunaan ingatan disebabkan pemuatan separa vektor daripada matriks Hessian. Artikel Wiki, artikel tentang Habré.
COBYLA — Pengoptimuman Terkekang MARE Mengikut Penghampiran Linear, pengoptimuman terhad dengan anggaran linear (tanpa pengiraan kecerunan). Artikel Wiki.
Bergantung pada kaedah yang dipilih, syarat dan sekatan untuk menyelesaikan masalah ditetapkan secara berbeza:
objek kelas Bounds untuk kaedah L-BFGS-B, TNC, SLSQP, trust-constr;
senarai (min, max) untuk kaedah yang sama L-BFGS-B, TNC, SLSQP, trust-constr;
objek atau senarai objek LinearConstraint, NonlinearConstraint untuk kaedah COBYLA, SLSQP, kepercayaan-constr;
kamus atau senarai kamus {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} untuk kaedah COBYLA, SLSQP.
Pelan artikel:
1) Pertimbangkan penggunaan algoritma pengoptimuman bersyarat dalam wilayah amanah (method=”trust-constr”) dengan kekangan yang dinyatakan sebagai objek Bounds, LinearConstraint, NonlinearConstraint ;
2) Pertimbangkan pengaturcaraan berjujukan menggunakan kaedah kuasa dua terkecil (kaedah = "SLSQP") dengan sekatan yang dinyatakan dalam bentuk kamus {'type', 'fun', 'jac', 'args'};
3) Menganalisis contoh pengoptimuman produk perkilangan menggunakan contoh studio web.
Kaedah pengoptimuman bersyarat="trust-constr"
Pelaksanaan kaedah trust-constr berdasarkan EQSQP untuk masalah dengan kekangan bentuk persamaan dan seterusnya TRIP untuk masalah dengan kekangan dalam bentuk ketidaksamaan. Kedua-dua kaedah dilaksanakan oleh algoritma untuk mencari minimum tempatan di rantau keyakinan dan sangat sesuai untuk masalah berskala besar.
Rumusan matematik masalah mencari minimum dalam bentuk umum:
Untuk kekangan kesaksamaan yang ketat, sempadan bawah ditetapkan sama dengan sempadan atas .
Untuk kekangan sehala, had atas atau bawah ditetapkan np.inf dengan tanda yang sepadan.
Biarkan perlu untuk mencari minimum fungsi Rosenbrock yang diketahui bagi dua pembolehubah:
Dalam kes ini, sekatan berikut ditetapkan pada domain definisinya:
Dalam kes kami, terdapat penyelesaian unik pada titik itu , yang mana hanya sekatan pertama dan keempat yang sah.
Mari kita lalui sekatan dari bawah ke atas dan lihat bagaimana kita boleh menulisnya dalam scipy.
Sekatan и mari kita takrifkannya menggunakan objek Bounds.
Apabila mengira matriks Hessian memerlukan banyak usaha, anda boleh menggunakan kelas HessianUpdateStrategy. Strategi berikut boleh didapati: BFGS и SR1.
Matriks Jacobian untuk kekangan juga boleh dikira menggunakan perbezaan terhingga. Walau bagaimanapun, dalam kes ini matriks Hessian tidak boleh dikira menggunakan perbezaan terhingga. Hessian mesti ditakrifkan sebagai fungsi atau menggunakan kelas HessianUpdateStrategy.
Sebagai alternatif, derivatif pertama dan kedua bagi fungsi yang dioptimumkan boleh dianggarkan. Sebagai contoh, Hessian boleh dianggarkan menggunakan fungsi tersebut SR1 (penghampiran kuasi-Newtonian). Kecerunan boleh dianggarkan dengan perbezaan terhingga.
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)
Kaedah pengoptimuman bersyarat = "SLSQP"
Kaedah SLSQP direka untuk menyelesaikan masalah meminimumkan fungsi dalam bentuk:
Где и — set indeks ungkapan yang menerangkan sekatan dalam bentuk kesamaan atau ketaksamaan. — set sempadan bawah dan atas untuk domain takrifan fungsi.
Kekangan linear dan bukan linear diterangkan dalam bentuk kamus dengan kunci 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 ]
Contoh Pengoptimuman
Sehubungan dengan peralihan kepada struktur teknologi kelima, mari kita lihat pengoptimuman pengeluaran menggunakan contoh studio web, yang membawa kita pendapatan yang kecil tetapi stabil. Mari kita bayangkan diri kita sebagai pengarah sebuah kapal dapur yang menghasilkan tiga jenis produk:
x0 - menjual halaman pendaratan, dari 10 tr.
x1 - laman web korporat, dari 20 tr.
x2 - kedai dalam talian, dari 30 tr.
Pasukan kerja mesra kami termasuk empat junior, dua pertengahan dan seorang senior. Dana masa kerja bulanan mereka:
Jun: 4 * 150 = 600 чел * час,
pertengahan: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Biarkan junior pertama yang tersedia menghabiskan (0, 1, 2) jam pada pembangunan dan penggunaan satu tapak jenis (x10, x20, x30), tengah - (7, 15, 20), senior - (5, 10, 15 ) jam masa terbaik dalam hidup anda.
Seperti mana-mana pengarah biasa, kami mahu memaksimumkan keuntungan bulanan. Langkah pertama untuk berjaya ialah menulis fungsi objektif value sebagai jumlah pendapatan daripada produk yang dihasilkan sebulan:
Dan akhirnya, andaian yang paling cerah ialah kerana harga yang rendah dan kualiti yang tinggi, barisan pelanggan yang berpuas hati sentiasa beratur untuk kami. Kami boleh memilih sendiri volum pengeluaran bulanan, berdasarkan penyelesaian masalah pengoptimuman yang terhad scipy.optimize:
Kesimpulan: agar pengarah menerima maksimum yang sepatutnya, adalah optimum untuk membuat 8 halaman pendaratan, 6 tapak bersaiz sederhana dan 3 kedai setiap bulan. Dalam kes ini, senior mesti membajak tanpa melihat ke atas dari mesin, beban pertengahan akan menjadi lebih kurang 2/3, junior kurang daripada separuh.
Kesimpulan
Artikel itu menggariskan teknik asas untuk bekerja dengan pakej scipy.optimize, digunakan untuk menyelesaikan masalah pengecilan bersyarat. Secara peribadi saya gunakan scipy semata-mata untuk tujuan akademik, sebab itu contoh yang diberikan bersifat komik.
Banyak teori dan contoh maya boleh didapati, contohnya, dalam buku oleh I.L. Akulich "Pengaturcaraan matematik dalam contoh dan masalah." Aplikasi yang lebih tegar scipy.optimize untuk membina struktur 3D daripada set imej (artikel tentang Habré) boleh dilihat dalam scipy-buku masakan.
Sumber utama maklumat ialah docs.scipy.orgmereka yang ingin menyumbang kepada terjemahan bahagian ini dan bahagian lain scipy Selamat datang ke GitHub.
Terima kasih mephistophees untuk penyertaan dalam penyediaan penerbitan.