Traffine I/O

Bahasa Indonesia

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}
  • c_{ij} sebagai biaya pengiriman satu unit produk dari pabrik i ke toko j
  • x_{ij} sebagai jumlah unit yang akan dikirim dari pabrik i ke toko j
  • C_i sebagai kapasitas pabrik i
  • D_j sebagai permintaan toko j

Masalah ini dapat dirumuskan sebagai program linier berikut:

Minimalkan:

Z = \sum_{i \in F} \sum_{j \in S} c_{ij}x_{ij} \\

Dengan batasan:

\textrm{For each } i \in F: \sum_{j \in S} x_{ij} \leq C_i (\textrm{Capacity constraint}) \\ \textrm{For each } j \in S: \sum_{i \in F} x_{ij} \geq D_j (\textrm{Demand constraint}) \\ \textrm{For all } i,j: x_{ij} \geq 0 (\textrm{Non-negativity constraint})

Representasi Data

Misalnya, kita memiliki pabrik-pabrik dan toko-toko berikut:

python
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:

python
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:

python
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().

python
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

https://coin-or.github.io/pulp/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!