What is PuLP
PuLP is a popular Python library for linear programming and mixed-integer linear programming problems. It provides a high-level interface for the mathematical programming language that allows users to create and solve optimization problems using Python's natural, expressive syntax.
With PuLP, you can create decision variables, construct objective functions, and formulate constraints for optimization problems. After defining the problem, you can use PuLP to call various solvers, such as GLPK, COIN CLP/CBC, CPLEX, and GUROBI, to find an optimal solution.
In the realm of optimization, PuLP is often compared to libraries like SciPy and CVXPY, but PuLP differentiates itself by focusing specifically on linear programming and mixed integer linear programming problems. Additionally, its ability to interact with various third-party solvers, both free and commercial, adds to its flexibility and wide usage.
Apa itu PuLP
PuLP adalah sebuah pustaka Python yang populer untuk pemrograman linier dan pemrograman mixed-integer. Pustaka ini menyediakan antarmuka tingkat tinggi untuk bahasa pemrograman matematika yang memungkinkan pengguna untuk membuat dan menyelesaikan masalah optimisasi menggunakan sintaks yang alami dan ekspresif dalam Python.
Dengan PuLP, Anda dapat membuat variabel keputusan, membangun fungsi tujuan, dan merumuskan batasan untuk masalah optimisasi. Setelah masalah didefinisikan, Anda dapat menggunakan PuLP untuk memanggil berbagai solver, seperti GLPK, COIN CLP/CBC, CPLEX, dan GUROBI, untuk mencari solusi optimal.
Dalam bidang optimisasi, PuLP sering dibandingkan dengan pustaka-pustaka seperti SciPy dan CVXPY, tetapi PuLP memiliki keunikan dengan fokus khusus pada pemrograman linier dan pemrograman mixed integer linear. Selain itu, kemampuannya untuk berinteraksi dengan berbagai solver pihak ketiga, baik yang gratis maupun komersial, menambah fleksibilitas dan penggunaannya yang luas.
Fitur Utama PuLP
Pustaka PuLP memiliki fitur-fitur berikut:
-
Antarmuka Tingkat Tinggi
PuLP menyediakan antarmuka tingkat tinggi dalam bahasa Python untuk membangun masalah optimisasi. Hal ini membuatnya menjadi pilihan yang intuitif bagi pengembang Python dan menyederhanakan proses perumusan masalah. PuLP mengabstraksi representasi matematika yang mendasarinya dan memungkinkan pengguna untuk fokus pada perumusan logis masalah. -
Fleksibilitas Solver
PuLP dapat berinteraksi dengan berbagai solver, termasuk solver sumber terbuka seperti COIN-OR's CBC dan GLPK, serta solver komersial seperti GUROBI dan CPLEX. Ini memberikan fleksibilitas kepada pengguna untuk memilih solver yang paling sesuai dengan kebutuhan khusus mereka dan resource komputasi yang tersedia. -
Kemampuan Pemodelan
Dengan PuLP, Anda dapat mendefinisikan fungsi tujuan dan batasan yang kompleks, sehingga memungkinkan pemodelan yang kuat untuk skenario optimisasi dunia nyata. Anda dapat menambahkan, memodifikasi, dan menghapus batasan, sehingga model menjadi sangat fleksibel dan dapat disesuaikan.
Jenis Masalah Optimisasi yang Dapat Diselesaikan oleh PuLP
PuLP merupakan alat yang ampuh untuk menangani beberapa kelas masalah optimisasi. Ini termasuk:
- Pemrograman Linier (LP)
- Integer Programming (IP)
- Mixed-Integer Linear Programming (MILP)
- Binary Integer Programming
Studi Kasus - Optimisasi Rantai Pasokan dengan PuLP
Misalkan ada sebuah perusahaan yang perlu mendistribusikan produk-produknya dari beberapa pabrik ke berbagai toko. Setiap pabrik memiliki kapasitas produksi maksimum, dan setiap toko memiliki permintaan tertentu. Selain itu, terdapat biaya yang terkait dengan pengiriman dari setiap pabrik ke setiap toko. Tujuan dari optimisasi ini adalah untuk meminimalkan total biaya distribusi sambil memenuhi permintaan dari semua toko.
Skenario ini adalah sebuah masalah transportasi klasik, yaitu jenis masalah pemrograman linier, dan dapat diselesaikan menggunakan PuLP.
Perumusan Masalah
Mari kita menunjukkan:
- Pabrik-pabrik sebagai himpunan
F = {f_1, f_2, \ldots, f_n} - Toko-toko sebagai himpunan
S = {s_1, s_2, \ldots, s_m} sebagai biaya pengiriman satu unit produk dari pabrikc_{ij} ke tokoi j sebagai jumlah unit yang akan dikirim dari pabrikx_{ij} ke tokoi j sebagai kapasitas pabrikC_i i sebagai permintaan tokoD_j j
Masalah ini dapat dirumuskan sebagai program linier berikut:
Minimalkan:
Dengan batasan:
Representasi Data
Misalnya, kita memiliki pabrik-pabrik dan toko-toko berikut:
capacity = {
'Factory1': 1000,
'Factory2': 4000
}
costs = {
'Factory1': {'Store1': 2, 'Store2': 3},
'Factory2': {'Store1': 4, 'Store2': 1}
}
demand = {
'Store1': 500,
'Store2': 4500
}
Kode PuLP
Berikut adalah kode PuLP yang merumuskan dan menyelesaikan masalah:
from pulp import *
# Create the 'prob' variable to contain the problem data
prob = LpProblem("Supply_Chain_Optimization", LpMinimize)
# Decision variables
x = LpVariable.dicts("shipments", [(i,j) for i in capacity.keys() for j in demand.keys()], lowBound=0, cat='Continuous')
# Objective function
prob += lpSum([costs[i][j]*x[(i, j)] for i in capacity.keys() for j in demand.keys()])
# Constraints
for j in demand.keys():
prob += lpSum([x[(i, j)] for i in capacity.keys()]) >= demand[j]
for i in capacity.keys():
prob += lpSum([x[(i, j)] for j in demand.keys()]) <= capacity[i]
# Solve the problem
prob.solve()
Hasil
Setelah masalah diselesaikan, jumlah optimal unit yang akan dikirim dari setiap pabrik ke setiap toko dapat diambil dengan menggunakan:
for v in prob.variables():
print(v.name, "=", v.varValue)
shipments_('Factory1',_'Store1') = 500.0
shipments_('Factory1',_'Store2') = 500.0
shipments_('Factory2',_'Store1') = 0.0
shipments_('Factory2',_'Store2') = 4000.0
Kode ini akan mencetak solusi optimal, yaitu jumlah unit yang akan dikirim dari setiap pabrik ke setiap toko, dan total biaya optimal dapat diambil dengan prob.objective.value()
.
print("Total Cost of Transportation =", value(prob.objective))
Total Cost of Transportation = 6500.0
Baris kode di atas akan mencetak total biaya distribusi minimal yang mungkin untuk memenuhi semua permintaan tanpa melebihi kapasitas pabrik manapun.
Referensi