SciPy (diucapkan sai pie) adalah paket matematika berbasis numpy yang juga mencakup perpustakaan C dan Fortran. SciPy mengubah sesi Python interaktif Anda menjadi lingkungan ilmu data yang lengkap seperti MATLAB, IDL, Octave, R, atau SciLab.
Pada artikel ini, kita akan melihat teknik dasar pemrograman matematika - menyelesaikan masalah optimasi bersyarat untuk fungsi skalar beberapa variabel menggunakan paket scipy.optimize. Algoritme pengoptimalan tanpa batasan telah dibahas di artikel terakhir. Bantuan yang lebih detail dan terkini tentang fungsi scipy selalu dapat diperoleh dengan menggunakan perintah help(), Shift+Tab, atau di dokumentasi resmi.
pengenalan
Antarmuka umum untuk memecahkan masalah optimasi bersyarat dan tidak dibatasi dalam paket scipy.optimize disediakan oleh fungsi minimize(). Namun, diketahui bahwa tidak ada metode universal untuk menyelesaikan semua masalah, sehingga pilihan metode yang memadai, seperti biasa, berada di pundak peneliti.
Algoritme optimasi yang sesuai ditentukan menggunakan argumen fungsi minimize(..., method="").
Untuk optimasi bersyarat dari fungsi beberapa variabel, tersedia implementasi metode berikut:
SLSQP — Pemrograman kuadrat sekuensial dengan batasan, metode Newton untuk menyelesaikan sistem Lagrange. artikel Wiki.
TNC - Newton Terpotong Terkendala, jumlah iterasi terbatas, baik untuk fungsi nonlinier dengan jumlah variabel independen yang banyak. artikel Wiki.
L-BFGS-B — metode dari tim Broyden–Fletcher–Goldfarb–Shanno, diimplementasikan dengan pengurangan konsumsi memori karena pemuatan sebagian vektor dari matriks Hessian. artikel Wiki, artikel tentang Habré.
COBYLA — MARE Constrained Optimization By Linear Approximation, optimasi terbatas dengan pendekatan linier (tanpa perhitungan gradien). artikel Wiki.
Bergantung pada metode yang dipilih, kondisi dan batasan untuk menyelesaikan masalah ditetapkan secara berbeda:
objek kelas Bounds untuk metode L-BFGS-B, TNC, SLSQP, trust-constr;
Daftar (min, max) untuk metode yang sama L-BFGS-B, TNC, SLSQP, trust-constr;
suatu objek atau daftar objek LinearConstraint, NonlinearConstraint untuk metode COBYLA, SLSQP, trust-constr;
kamus atau daftar kamus {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} untuk COBYLA, metode SLSQP.
Garis besar artikel:
1) Pertimbangkan penggunaan algoritma optimasi bersyarat di wilayah kepercayaan (method=”trust-constr”) dengan batasan yang ditentukan sebagai objek Bounds, LinearConstraint, NonlinearConstraint ;
2) Pertimbangkan pemrograman sekuensial menggunakan metode kuadrat terkecil (method = "SLSQP") dengan batasan yang ditentukan dalam bentuk kamus {'type', 'fun', 'jac', 'args'};
3) Menganalisis contoh optimasi produk manufaktur menggunakan contoh web studio.
Metode pengoptimalan bersyarat="trust-constr"
Implementasi metode trust-constr berdasarkan EQSQP untuk masalah dengan kendala berupa persamaan dan seterusnya TRIP untuk permasalahan yang mempunyai kendala berupa kesenjangan. Kedua metode ini diimplementasikan oleh algoritma untuk menemukan nilai minimum lokal di wilayah kepercayaan dan sangat cocok untuk masalah skala besar.
Rumusan matematis masalah mencari minimum dalam bentuk umum:
Untuk batasan kesetaraan yang ketat, batas bawah ditetapkan sama dengan batas atas .
Untuk batasan satu arah, batas atas atau batas bawah ditetapkan np.inf dengan tanda yang sesuai.
Misalkan kita perlu mencari fungsi minimum Rosenbrock yang diketahui dari dua variabel:
Dalam hal ini, batasan berikut ditetapkan pada domain definisinya:
Dalam kasus kami, ada solusi unik pada saat itu , yang hanya berlaku pada batasan pertama dan keempat.
Mari kita lihat batasannya dari bawah ke atas dan lihat bagaimana kita bisa menulisnya dalam scipy.
Pembatasan и mari kita definisikan menggunakan objek Bounds.
Matriks Jacobian untuk batasan juga dapat dihitung menggunakan perbedaan hingga. Namun dalam hal ini matriks Hessian tidak dapat dihitung dengan menggunakan beda hingga. Hessian harus didefinisikan sebagai fungsi atau menggunakan kelas HessianUpdateStrategy.
Alternatifnya, turunan pertama dan kedua dari fungsi yang sedang dioptimalkan dapat diperkirakan. Misalnya, Hessian dapat didekati menggunakan fungsi tersebut SR1 (perkiraan kuasi-Newtonian). Gradien dapat diperkirakan dengan perbedaan hingga.
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)
Metode optimasi bersyarat="SLSQP"
Metode SLSQP dirancang untuk menyelesaikan masalah minimalisasi suatu fungsi berupa:
Где и — kumpulan indeks ekspresi yang menggambarkan pembatasan dalam bentuk persamaan atau ketidaksetaraan. — himpunan batas bawah dan atas untuk domain definisi fungsi.
Batasan linier dan nonlinier dijelaskan 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 Optimasi
Sehubungan dengan transisi ke struktur teknologi kelima, mari kita lihat optimasi produksi menggunakan contoh studio web, yang memberi kita pendapatan kecil namun stabil. Bayangkan diri kita sebagai direktur sebuah dapur yang menghasilkan tiga jenis produk:
x0 - menjual halaman arahan, mulai 10 tr.
x1 - situs web perusahaan, mulai 20 tr.
x2 - toko online, mulai 30 tr.
Tim kerja kami yang ramah terdiri dari empat junior, dua menengah, dan satu senior. Dana waktu kerja bulanan mereka:
Juni: 4 * 150 = 600 чел * час,
tengah: 2 * 150 = 300 чел * час,
senor: 150 чел * час.
Biarkan junior pertama yang tersedia menghabiskan (0, 1, 2) jam untuk pengembangan dan penerapan satu situs tipe (x10, x20, x30), menengah - (7, 15, 20), senior - (5, 10, 15 ) jam waktu terbaik dalam hidup Anda.
Seperti direktur pada umumnya, kami ingin memaksimalkan keuntungan bulanan. Langkah pertama menuju sukses adalah menuliskan fungsi tujuan value sebagai jumlah pendapatan dari produk yang dihasilkan per bulan:
Dan terakhir, asumsi yang paling menggembirakan adalah karena harga yang murah dan kualitas yang tinggi, antrean pelanggan yang puas terus mengantre untuk kami. Kami dapat memilih sendiri volume produksi bulanan, berdasarkan penyelesaian masalah pengoptimalan yang dibatasi scipy.optimize:
Mari kita bulatkan ke bilangan bulat dan hitung beban bulanan pendayung dengan distribusi produk yang optimal 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 чел * час.
Kesimpulan: agar direktur mendapatkan hasil maksimal yang layak, optimal untuk membuat 8 halaman arahan, 6 situs berukuran sedang, dan 3 toko per bulan. Dalam hal ini, yang senior harus membajak tanpa mengangkat muka dari mesin, beban yang di tengah kira-kira 2/3, yang junior kurang dari setengahnya.
Kesimpulan
Artikel ini menguraikan teknik dasar untuk bekerja dengan paket tersebut scipy.optimize, digunakan untuk menyelesaikan masalah minimisasi bersyarat. Secara pribadi saya menggunakan scipy semata-mata untuk tujuan akademis, itulah sebabnya contoh yang diberikan bersifat lucu.
Banyak sekali teori dan contoh virtual yang dapat ditemukan, misalnya dalam buku karya I.L. Akulich “Pemrograman Matematika dalam Contoh dan Masalah”. Aplikasi yang lebih hardcore scipy.optimize untuk membangun struktur 3D dari sekumpulan gambar (artikel tentang Habré) dapat dilihat di buku masak scipy.
Sumber informasi utama adalah docs.scipy.orgmereka yang ingin berkontribusi pada terjemahan bagian ini dan bagian lainnya scipy Selamat Datang di GitHub.
Terima kasih mephistophees untuk partisipasi dalam persiapan publikasi.