Lewati ke konten utama

Optimasi dengan Pyomo: Panduan Lengkap Langkah demi Langkah

Pelajari cara memodelkan dan menyelesaikan masalah optimasi menggunakan Pyomo, pustaka Python yang andal. Jelajahi contoh praktis dari optimasi linear dan non-linear!
· 15 mnt Baca

Jelajahi bersama AI

Optimasi adalah alat mendasar yang digunakan di berbagai industri dan disiplin untuk membuat keputusan terbaik dalam batasan tertentu. Baik itu meminimalkan biaya dalam rantai pasok, memaksimalkan efisiensi dalam sistem energi, atau mencari parameter optimal dalam model machine learning, teknik optimasi sangat penting. 

Python, yang dikenal karena kesederhanaan dan fleksibilitasnya, menawarkan pustaka andal untuk masalah optimasi. Di antaranya, Pyomo menonjol sebagai pustaka komprehensif dan fleksibel yang memungkinkan pengguna mendefinisikan dan menyelesaikan model optimasi kompleks dengan mulus.

Dalam tutorial ini, kita akan mengeksplorasi Pyomo dari dasar. Kita akan membahas semuanya mulai dari instalasi dan penyiapan solver hingga perumusan dan penyelesaian berbagai masalah optimasi!

Visualisasi wilayah feasible, batasan, dan titik sudut dalam masalah optimasi pemrograman linear

Menjelajahi Solusi Feasible dalam Pemrograman Linear. Gambar oleh Penulis.

Apa itu Pyomo?

Pyomo adalah pustaka open-source untuk membangun dan menyelesaikan model optimasi menggunakan Python. Pyomo memungkinkan Anda mendefinisikan model optimasi dengan cara yang secara matematis ketat dan secara sintaksis intuitif bagi programmer Python. Pyomo mendukung berbagai jenis masalah, termasuk:

  1. Pemrograman linear (LP): LP melibatkan optimasi fungsi objektif linear dengan batasan kesetaraan dan ketidaksamaan linear. Banyak digunakan untuk masalah alokasi sumber daya, penjadwalan, dan perencanaan keuangan.
  2. Pemrograman non-linear (NLP): NLP berkaitan dengan optimasi fungsi objektif non-linear dengan batasan non-linear. Sering digunakan dalam teknik dan ekonomi untuk sistem yang lebih kompleks di mana hubungan tidak linear.
  3. Pemrograman bilangan bulat campuran (MIP): MIP melibatkan masalah optimasi di mana beberapa variabel dibatasi harus bernilai bilangan bulat sementara yang lain dapat kontinu. Ini berguna dalam skenario seperti desain rantai pasok atau penjadwalan proyek, di mana keputusan bisa bersifat diskrit (misalnya, hidup/mati).
  4. Pemrograman stokastik: Pemrograman stokastik menangani masalah optimasi di mana beberapa elemen tidak pasti dan dimodelkan sebagai variabel acak. Umum diterapkan dalam keuangan dan manajemen rantai pasok untuk mengoptimalkan keputusan dalam ketidakpastian.
  5. Optimasi dinamis: Optimasi dinamis fokus pada pengoptimalan variabel keputusan seiring waktu, biasanya melibatkan sistem yang berevolusi secara dinamis. Digunakan di bidang seperti kontrol proses, robotika, dan ekonomi untuk mengelola proses yang bergantung waktu.

Fitur Pyomo

Sekarang setelah kita memahami Pyomo lebih baik, mari tinjau beberapa fitur terpentingnya. 

Fleksibilitas dan kemampuan diperluas

Fleksibilitas Pyomo berasal dari kemampuannya memodelkan hubungan kompleks menggunakan konstruksi Python standar. Pyomo terintegrasi dengan berbagai solver open-source dan komersial, sehingga memudahkan penyelesaian banyak masalah optimasi. 

Sintaks Pythonic

Model Pyomo dibangun di atas Python dan ditulis menggunakan sintaks Python standar. Ini membuat kurva belajar menjadi ringan bagi mereka yang akrab dengan Python dan memungkinkan Anda menggunakan pustaka Python yang luas dalam model Anda.

Komunitas dan dokumentasi yang kuat

Pyomo memiliki komunitas pengguna yang tangguh dan dokumentasi komprehensif, termasuk contoh dan tutorial untuk membantu pengguna di semua tingkat.

Kasus penggunaan Pyomo

Pyomo memiliki berbagai aplikasi dunia nyata. Berikut beberapa di antaranya:

1. Optimasi rantai pasok

Optimasi rantai pasok melibatkan peningkatan logistik, pengelolaan tingkat persediaan, dan pembuatan jadwal produksi yang efisien. 

Ini dapat mencakup meminimalkan biaya transportasi, mengoptimalkan lokasi gudang, atau menyeimbangkan penawaran dan permintaan. 

Sebagai contoh, sebuah perusahaan mungkin perlu memenuhi permintaan pelanggan di beberapa wilayah sambil meminimalkan biaya pengiriman dan menjaga tingkat stok di setiap pusat distribusi.

2. Pemodelan keuangan

Dalam pemodelan keuangan, optimasi membantu mengalokasikan sumber daya, seperti modal, untuk memaksimalkan imbal hasil sambil meminimalkan risiko. 

Ini dapat melibatkan optimasi portofolio, di mana investor menyeimbangkan risiko dan imbal hasil dengan memilih kombinasi aset yang tunduk pada batasan seperti batas anggaran, persyaratan regulasi, atau toleransi risiko. 

Pemodelan keuangan memastikan strategi keuangan selaras dengan tujuan jangka panjang sambil mengurangi potensi risiko.

3. Sistem energi

Optimasi dalam sistem energi berfokus pada memaksimalkan efisiensi pembangkitan, distribusi, dan konsumsi energi.

Ini dapat melibatkan penentuan campuran sumber energi yang optimal (misalnya, terbarukan vs. non-terbarukan) sambil meminimalkan biaya bahan bakar, memenuhi batas emisi, dan beradaptasi dengan permintaan yang berfluktuasi. 

Jenis optimasi ini berperan sentral dalam pengelolaan jaringan, operasi pembangkit listrik, dan pengurangan dampak lingkungan.

4. Machine learning dan data science

Optimasi merupakan inti dari banyak tugas machine learning dan data science, seperti penalaan hyperparameter dan seleksi fitur. 

Dalam penalaan hyperparameter, algoritma optimasi membantu menemukan konfigurasi model terbaik untuk meningkatkan kinerja prediktif. 

Seleksi fitur, tugas penting lainnya, melibatkan identifikasi fitur paling penting yang berkontribusi pada akurasi model, membantu mengurangi kompleksitas dan meningkatkan efisiensi.

Sekarang konteksnya sudah jelas, mari kita langsung praktik dan mulai menerapkan Pyomo pada beberapa contoh masalah pemodelan!

Menyiapkan Pyomo

Sebelum masuk ke pemodelan, kita perlu menyiapkan lingkungan dengan menginstal Pyomo dan memilih solver yang sesuai.

1. Prasyarat

Untuk menggunakan pyomo, Anda harus memiliki Python 3.6 atau lebih tinggi. Pyomo dapat diinstal melalui pip.

pip install pyomo

Tutorial ini dibuat menggunakan pyomo versi 6.8.0.

import pyomo
print(pyomo.__version__)

Keluaran:

>>> 6.8.0

2. Memilih dan menginstal solver yang tepat

Dalam optimasi, solver sangat penting karena merupakan algoritma yang menemukan solusi optimal untuk masalah yang Anda definisikan. Solver yang berbeda lebih cocok tergantung pada jenis masalah (misalnya, linear, non-linear, bilangan bulat). Pyomo adalah alat pemodelan yang mengandalkan solver eksternal untuk melakukan komputasi aktual.

Mari tinjau beberapa solver yang paling umum.

Solver open-source

1. GLPK (GNU Linear Programming Kit)

GLPK adalah alat populer untuk menyelesaikan masalah pemrograman linear (LP) dan pemrograman bilangan bulat campuran (MIP). 

Pilihan yang sangat baik untuk tugas optimasi linear dasar dan banyak digunakan dalam aplikasi akademik dan industri.

Instalasi

brew install glpk
  • Linux: 
sudo apt-get install glpk-utils
2. CBC (Coin-or Branch and Cut)

CBC adalah solver open-source untuk masalah LP dan MIP. 

Dalam beberapa kasus, ia menawarkan fitur lanjutan dan kinerja lebih baik dibanding GLPK, menjadikannya opsi kuat untuk tugas optimasi yang lebih kompleks. 

CBC dapat diinstal melalui manajer paket conda.

conda install -c conda-forge coincbc
3. IPOPT (Interior Point OPTimizer)

IPOPT adalah solver andal yang dirancang untuk masalah pemrograman non-linear (NLP) skala besar. 

Sangat cocok untuk menangani model non-linear yang kompleks, sehingga menjadi pilihan tepat untuk masalah di luar optimasi linear. 

IPOPT dapat diinstal melalui manajer paket conda.

!conda install -c conda-forge ipopt

Solver komersial

1. CPLEX

CPLEX adalah solver optimasi mutakhir yang efisien menangani masalah LP, MIP, dan pemrograman kuadratik (QP). 

Memerlukan lisensi dari IBM namun tersedia gratis untuk pengguna akademik, sehingga sangat cocok untuk penelitian dan tujuan pendidikan.

2. Gurobi

Gurobi adalah solver komersial terkemuka yang dikenal akan kecepatan dan efisiensinya dalam menyelesaikan masalah LP, MIP, QP, dan pemrograman non-linear (NLP). 

Seperti CPLEX, memerlukan lisensi namun menawarkan akses gratis untuk pengguna akademik. Dengan demikian, ini adalah alat standar industri untuk optimasi tingkat lanjut.

Open-source vs. solver komersial

Solver open-source seperti GLPK dan CBC gratis dan memadai untuk sebagian besar kebutuhan optimasi dasar. Mereka merupakan pilihan sangat baik untuk proyek skala kecil dan tujuan pendidikan. 

Namun, solver komersial seperti CPLEX dan Gurobi umumnya menawarkan kinerja unggul, terutama untuk masalah yang lebih besar dan kompleks. Solver ini memiliki fitur lanjutan, termasuk dukungan pemrograman kuadratik dan non-linear yang ditingkatkan, serta dioptimalkan untuk aplikasi industri skala besar.

Walaupun solver open-source dapat menangani banyak tugas optimasi rutin, solver komersial sering kali menjadi pilihan lebih baik saat menangani kebutuhan yang lebih kompleks dan berperforma tinggi. 

Perlu diingat bahwa solver komersial memerlukan lisensi, meski tersedia gratis bagi pengguna akademik.

Sekarang, mari lihat cara mengonfigurasi solver di Pyomo. Saya akan menggunakan GLPK dalam kasus ini. 

3. Mengonfigurasi solver di Pyomo

Pertama, pastikan executable solver ada di PATH sistem Anda setelah instalasi. 

Kemudian, buat skrip Python dan tambahkan berikut ini:

from pyomo.environ import SolverFactory
solver = SolverFactory('glpk')

Untuk memastikan Pyomo dan solver Anda terpasang dengan benar, mari selesaikan masalah uji sederhana.

Masalah uji: program linear sederhana

Objektif: Minimalkan Z=x+y

Dengan syarat:

  • x + 2y ≥ 4
  • x - y ≤ 1
  • x ≥ 0
  • y ≥ 0

Masalah ini tentang mencari nilai sekecil mungkin dari Z, yaitu jumlah dari dua variabel, x dan y. Namun, x dan y harus memenuhi kondisi tertentu. 

Pertama, ketika Anda menjumlahkan x dan dua kali y, hasilnya harus setidaknya 4. Kedua, x dikurangi y harus kurang dari atau sama dengan 1. Terakhir, baik x maupun y harus bernilai nol atau positif (tidak boleh negatif). 

Tujuannya adalah menemukan nilai x dan y yang memenuhi kondisi ini sambil membuat Z sekecil mungkin.

Implementasi menggunakan Pyomo:

import pyomo.environ as pyo
# Create a model
model = pyo.ConcreteModel()
# Define variables
model.x = pyo.Var(within=pyo.NonNegativeReals)
model.y = pyo.Var(within=pyo.NonNegativeReals)
# Define objective
model.obj = pyo.Objective(expr=model.x + model.y, sense=pyo.minimize)
# Define constraints
model.con1 = pyo.Constraint(expr=model.x + 2 * model.y >= 4)
model.con2 = pyo.Constraint(expr=model.x - model.y <= 1)
# Select solver
solver = pyo.SolverFactory('glpk')
# Solve the problem
result = solver.solve(model)
# Display results
print('Status:', result.solver.status)
print('Termination Condition:', result.solver.termination_condition)
print('Optimal x:', pyo.value(model.x))
print('Optimal y:', pyo.value(model.y))
print('Optimal Objective:', pyo.value(model.obj))

Jika semuanya berfungsi dengan benar, keluaran yang diharapkan adalah:

Status: ok
Termination Condition: optimal
Optimal x: 0.0
Optimal y: 2.0
Optimal Objective: 2.0

Mari ulas kode di atas: Pertama, kode mendefinisikan dua variabel, x dan y, yang hanya dapat bernilai non-negatif. Objektif model adalah meminimalkan jumlah x dan y (x + y). Kode mendefinisikan solver glpk untuk menemukan nilai optimal x dan y yang memenuhi batasan sambil meminimalkan objektif.

Setelah menjalankan kode, kita menemukan bahwa nilai optimal untuk variabel adalah x = 0.0 dan y = 2.0, yang meminimalkan fungsi objektif Z = x + y. Oleh karena itu, nilai minimum fungsi objektif adalah 2.0, yang memenuhi batasan yang diberikan.

Dasar-Dasar Pemodelan dengan Pyomo

Memahami cara mendefinisikan komponen dasar dari sebuah model optimasi di Pyomo diperlukan untuk menyiapkan dan menyelesaikan masalah optimasi secara efektif.

1. Mendefinisikan variabel

Variabel mewakili keputusan yang perlu dibuat dalam masalah optimasi. Di Pyomo, variabel adalah kuantitas yang akan disesuaikan solver untuk mengoptimalkan fungsi objektif sambil memenuhi semua batasan.

Variabel skalar

Variabel skalar adalah satu variabel yang tidak diindeks pada himpunan apa pun. Untuk mendefinisikan variabel skalar di Pyomo, Anda menggunakan kelas Var dari modul pyomo.environ.

from pyomo.environ import Var
model.x = Var()

Kita terlebih dahulu mengimpor Var dan membuat variabel x menggunakan Var(). Variabel ini tidak memiliki batas yang ditentukan, artinya dapat mengambil nilai riil apa pun kecuali dibatasi sebaliknya dalam model.

Menambahkan batas (bounds)

Anda dapat membatasi nilai yang dapat diambil variabel dengan menentukan bounds. Bounds didefinisikan sebagai tuple (lower_bound, upper_bound):

from pyomo.environ import Var
model.x = Var(bounds=(0, None))

Menentukan domain

Pyomo menyediakan domain pradefinisi yang dapat Anda gunakan untuk menentukan jenis nilai yang dapat diambil variabel, seperti NonNegativeReals, Integers, atau Binary: 

from pyomo.environ import Var, NonNegativeReals
model.x = Var(domain=NonNegativeReals)

Variabel terindeks

Saat berurusan dengan banyak variabel yang serupa sifatnya, seperti variabel yang merepresentasikan periode waktu atau item berbeda, efisien menggunakan variabel terindeks. Variabel terindeks adalah variabel yang didefinisikan di atas sebuah himpunan.

import pyomo.environ as pyo
model.I = pyo.Set(initialize=[1, 2, 3])
model.y = pyo.Var(model.I, domain=pyo.NonNegativeReals)

Misalkan Anda memodelkan kuantitas produksi untuk tiga produk. Anda dapat mendefinisikan:

model.Products = pyo.Set(initialize=['A', 'B', 'C'])
model.production = pyo.Var(model.Products, domain=pyo.NonNegativeReals)

Sekarang, model.production['A'], model.production['B'], dan model.production['C'] merepresentasikan kuantitas produksi untuk produk A, B, dan C masing-masing.

2. Mendefinisikan objektif

Fungsi objektif adalah apa yang kita coba optimalkan (minimalkan atau maksimalkan). Fungsi ini mendefinisikan tujuan model, seperti meminimalkan biaya atau memaksimalkan laba, dan biasanya diekspresikan sebagai persamaan matematis yang melibatkan variabel keputusan. 

Objektif didefinisikan menggunakan kelas Objective:

from pyomo.environ import ConcreteModel, Var, Objective, minimize, maximize, NonNegativeReals
# Create a model
model = ConcreteModel()
# Define variables
model.x = Var(within=NonNegativeReals)
model.y = Var(within=NonNegativeReals)
# Minimization (cost)
model.cost = Objective(expr=2 * model.x + 3 * model.y, sense=minimize)
# When Maximization profit - (can have one objective at a time)
# model.profit = Objective(expr=5 * model.x + 4 * model.y, sense=maximize)

3. Menambahkan batasan

Batasan mendefinisikan keterbatasan atau persyaratan dari masalah:

from pyomo.environ import Constraint
model.con1 = Constraint(expr=model.x + model.y >= 10)

Contoh di atas mendefinisikan batasan dalam model Pyomo menggunakan kelas Constraint. Batasan model.con1 menyatakan bahwa jumlah variabel x dan y harus lebih besar atau sama dengan 10.

4. Parameterisasi model

Parameter adalah nilai tetap yang digunakan dalam model untuk merepresentasikan kuantitas atau konstanta yang diketahui dan tidak berubah selama proses optimasi. 

Parameter membantu mendefinisikan hubungan antara variabel dan batasan, memberikan struktur pada model dengan memasukkan data atau asumsi dunia nyata:

from pyomo.environ import Param
model.p = Param(initialize=5)

Kode di atas mendefinisikan parameter p dalam model Pyomo menggunakan kelas Param dan menginisialisasinya dengan nilai tetap 5. Parameter p kini dapat digunakan dalam model untuk merepresentasikan nilai konstan yang tidak berubah selama proses optimasi.

Sekarang, mari kerjakan masalah optimasi end-to-end!

Contoh Pyomo End-to-End

Mari lihat contoh end-to-end untuk menyelesaikan masalah optimasi menggunakan Pyomo. Kita akan memodelkan skenario dunia nyata di mana sebuah pabrik memproduksi dua produk, dan tujuannya adalah memaksimalkan laba dengan mempertimbangkan batasan waktu mesin. 

1. Pernyataan masalah

Sebuah pabrik memproduksi dua produk, P1 dan P2. Laba per unit adalah:

  • P1: $40
  • P2: $50

Waktu mesin yang tersedia:

  • Mesin A: 100 jam
  • Mesin B: 80 jam
  • Mesin C: 90 jam

Waktu yang dibutuhkan per unit:

Produk

Mesin A (jam)

Mesin B (jam)

Mesin C (jam)

P1

1

2

0

P2

2

1

3

Objektif: Memaksimalkan laba.

Variabel keputusan:

  • x₁: Unit P1 yang akan diproduksi.
  • x₂: Unit P2 yang akan diproduksi.

2. Formulasi matematis

Fungsi objektif:

Maksimalkan Z = 40x₁ + 50x₂

Batasan:

  1. Kapasitas Mesin A: 1x₁ + 2x₂ ≤ 100
  2. Kapasitas Mesin B: 2x₁ + 1x₂ ≤ 80
  3. Kapasitas Mesin C: 3x₂ ≤ 90
  4. Non-negativitas: x₁, x₂ ≥ 0

3. Implementasi

Berdasarkan objektif dan batasan masalah, berikut kode Python untuk memodelkannya, kembali menggunakan GLPK.

# Step 1: Import Libraries
import pyomo.environ as pyo
# Step 2: Create a Concrete Model
model = pyo.ConcreteModel()
# Step 3: Define Decision Variables (Units of P1 and P2 to produce)
model.x1 = pyo.Var(within=pyo.NonNegativeReals)
model.x2 = pyo.Var(within=pyo.NonNegativeReals)
# Step 4: Define the Objective Function (Maximize profit)
model.profit = pyo.Objective(expr=40 * model.x1 + 50 * model.x2, sense=pyo.maximize)
# Step 5: Define Constraints
# Machine A capacity constraint: 1x1 + 2x2 <= 100
model.machine_a = pyo.Constraint(expr=1 * model.x1 + 2 * model.x2 <= 100)
# Machine B capacity constraint: 2x1 + 1x2 <= 80
model.machine_b = pyo.Constraint(expr=2 * model.x1 + 1 * model.x2 <= 80)
# Machine C capacity constraint: 3x2 <= 90
model.machine_c = pyo.Constraint(expr=3 * model.x2 <= 90)
# Step 6: Solve the Model using GLPK solver
solver = pyo.SolverFactory('glpk')
result = solver.solve(model)
# Step 7: Analyze Results
# Display Solver Status and Termination Condition
print('Solver Status:', result.solver.status)
print('Termination Condition:', result.solver.termination_condition)
# Get and display the optimal values for x1, x2, and the maximum profit
x1_opt = pyo.value(model.x1)
x2_opt = pyo.value(model.x2)
profit_opt = pyo.value(model.profit)
print(f'Optimal production of P1 (x1): {x1_opt}')
print(f'Optimal production of P2 (x2): {x2_opt}')
print(f'Maximum Profit: ${profit_opt}')

Keluaran:

>>> Solver Status: ok
>>> Termination Condition: optimal
>>> Optimal production of P1 (x1): 25.0
>>> Optimal production of P2 (x2): 30.0
>>> Maximum Profit: $2500.0

Dalam kode di atas, kita mendefinisikan model optimasi linear untuk memaksimalkan laba dari produksi dua produk (P1 dan P2). Fungsi objektif ditetapkan untuk memaksimalkan laba, dengan setiap unit P1 berkontribusi $40 dan setiap unit P2 berkontribusi $50.

Kita memberlakukan tiga batasan yang merepresentasikan batas waktu mesin untuk Mesin A, B, dan C. 

Terakhir, kita menggunakan solver GLPK untuk menyelesaikan masalah. 

Jawaban akhirnya adalah memproduksi 25 unit P1 dan 30 unit P2 di mana laba maksimum kita adalah $2.500.

Fitur Lanjutan di Pyomo

Pada bagian sebelumnya, kita melihat betapa mudahnya mengimplementasikan masalah optimasi end-to-end dengan Pyomo. Namun, sebagian besar masalah dunia nyata tidak mudah untuk diselesaikan.

Pada bagian ini, saya menyajikan beberapa fitur lanjutan yang dapat Anda gunakan untuk menyelesaikan skenario yang lebih kompleks.

1. Optimasi non-linear

Optimasi non-linear meminimalkan atau memaksimalkan fungsi objektif non-linear dengan batasan non-linear. Mari lihat contoh di mana kita meminimalkan jumlah selisih kuadrat dengan batasan lingkaran.

Pernyataan masalah

Minimalkan objektif: Z = (x - 1)² + (y - 2)²

Dengan syarat:

  • x² + y² ≤ 4
  • x, y ≥ 0

Di Pyomo, kita dapat mendefinisikan variabel keputusan x dan y dengan batas bawah 0 untuk memastikan non-negativitas. Fungsi objektif ditulis sebagai jumlah selisih kuadrat dari titik tertentu, dan batasan memastikan solusi berada dalam lingkaran berjari-jari 2.

Dalam kasus ini, solver IPOPT cocok karena kemampuannya menyelesaikan masalah optimasi non-linear:

import pyomo.environ as pyo
model = pyo.ConcreteModel()
# Define variables with lower bounds
model.x = pyo.Var(bounds=(0, None))
model.y = pyo.Var(bounds=(0, None))
# Objective function: minimize (x - 1)² + (y - 2)²
model.obj = pyo.Objective(expr=(model.x - 1)**2 + (model.y - 2)**2, sense=pyo.minimize)
# Constraint: x² + y² ≤ 4 (circle of radius 2)
model.circle = pyo.Constraint(expr=model.x**2 + model.y**2 <= 4)
solver = pyo.SolverFactory('ipopt')
result = solver.solve(model)
print('Optimal x:', pyo.value(model.x))
print('Optimal y:', pyo.value(model.y))
print('Minimum Z:', pyo.value(model.obj))

2. Pemrograman bilangan bulat campuran (MIP)

Pemrograman bilangan bulat campuran digunakan ketika beberapa variabel keputusan adalah bilangan bulat (sering kali biner) sementara yang lain kontinu. Ini berharga untuk masalah pengambilan keputusan seperti lokasi fasilitas dan perencanaan produksi.

Pernyataan masalah

Sebuah perusahaan harus memutuskan apakah akan membuka gudang di lokasi A, B, dan C. Tujuannya adalah meminimalkan total biaya, yang mencakup biaya tetap pembukaan gudang dan biaya transportasi.

Kita mulai dengan menginisialisasi data, termasuk biaya tetap pembukaan gudang, biaya transportasi, batas kapasitas, dan total permintaan: 

locations = ['A', 'B', 'C']
FixedCost = {'A': 1000, 'B': 1200, 'C': 1500}
TransportCost = {'A': 5, 'B': 4, 'C': 6}
Capacity = {'A': 100, 'B': 80, 'C': 90}
Demand = 150
model = pyo.ConcreteModel()
# Binary variable: 1 if warehouse is open, 0 otherwise
model.y = pyo.Var(locations, domain=pyo.Binary)
# Continuous variable: amount of goods transported
model.x = pyo.Var(locations, domain=pyo.NonNegativeReals)
model.cost = pyo.Objective(
    expr=sum(FixedCost[i] * model.y[i] + TransportCost[i] * model.x[i] for i in locations),
    sense=pyo.minimize
)
# Demand constraint
model.demand = pyo.Constraint(expr=sum(model.x[i] for i in locations) >= Demand)
# Capacity constraints
def capacity_rule(model, i):
    return model.x[i] <= Capacity[i] * model.y[i]
model.capacity = pyo.Constraint(locations, rule=capacity_rule)
solver = pyo.SolverFactory('cbc')
result = solver.solve(model)
for i in locations:
    print(f"Warehouse {i}: Open={pyo.value(model.y[i])}, Transported={pyo.value(model.x[i])}")
print('Minimum Total Cost:', pyo.value(model.cost))

Model ini mencakup dua jenis variabel keputusan: variabel biner y yang merepresentasikan apakah sebuah gudang dibuka (1 jika dibuka, 0 jika tidak), dan variabel kontinu x yang merepresentasikan jumlah barang yang diangkut dari setiap gudang. 

Fungsi objektif menjumlahkan biaya tetap dan biaya transportasi setiap gudang serta meminimalkan totalnya. Batasan memastikan total barang yang diangkut memenuhi permintaan dan kapasitas setiap gudang tidak terlampaui jika dibuka. 

3. Menangani banyak objektif

Terkadang, masalah optimasi melibatkan banyak objektif yang mungkin saling bertentangan, seperti memaksimalkan laba sambil meminimalkan dampak lingkungan. Pendekatan umum adalah metode bobot terimbang (weighted sum), di mana setiap objektif diberi bobot untuk menyeimbangkan pentingnya.

Pernyataan masalah

Kita bertujuan memaksimalkan laba sambil meminimalkan dampak lingkungan:

  • Laba: Z₁ = 3x + 5y
  • Dampak lingkungan: Z₂ = 2x + y

Kita dapat menggabungkan objektif ini menggunakan bobot w1=0.6, w2=0.4, di mana objektif total menjadi jumlah berbobot:

w1 = 0.6
w2 = 0.4
model.obj = pyo.Objective(
    expr=w1 * (3 * model.x + 5 * model.y) - w2 * (2 * model.x + model.y),
    sense=pyo.maximize
)

Dalam objektif gabungan ini, kita memaksimalkan laba sambil meminimalkan dampak lingkungan dengan menyesuaikan bobot.

4. Menggunakan sumber data eksternal

Saat menangani dataset besar, sering kali berguna untuk mengimpor data dari sumber eksternal seperti file CSV. Pyomo bekerja baik dengan Pandas untuk membaca dan menggunakan data eksternal.

Kita dapat membaca file CSV menggunakan Pandas dan menggunakan data untuk menginisialisasi himpunan dan parameter dalam model:

import pandas as pd
data = pd.read_csv('parameters.csv')
# Define set from CSV data
model.I = pyo.Set(initialize=data['index'].unique())
# Define parameter initialized from CSV data
param_dict = data.set_index('index')['value'].to_dict()
model.param = pyo.Param(model.I, initialize=param_dict)

Tips dan Praktik Terbaik Menggunakan Pyomo

Saat bekerja dengan Pyomo, penting untuk menjaga model Anda efisien, terdokumentasi dengan baik, dan mudah ditelusuri masalahnya. 

1. Debugging dan troubleshooting

Saat membangun model optimasi di Pyomo, umum menemui masalah seperti solusi tidak feasible, kegagalan solver, atau hasil yang tidak benar. Berikut beberapa praktik terbaik untuk debugging:

  • Periksa batasan: Tinjau batasan Anda jika model tidak menghasilkan solusi feasible. Batasan yang terlalu ketat dapat membuat masalah menjadi tidak feasible. Gunakan metode .display() Pyomo untuk mencetak nilai variabel dan batasan guna memverifikasi bahwa mereka berperilaku seperti yang diharapkan.
  • Keluaran solver: Aktifkan log solver terperinci dengan meneruskan tee=True saat memanggil metode solve(). Ini dapat memberi wawasan di mana solver mungkin mengalami kesulitan, seperti variabel tak berbatas atau infeasibilitas.
  • Uji model sederhana terlebih dahulu: Saat menangani model kompleks, uji versi yang disederhanakan. Ini dapat membantu mengisolasi potensi masalah tanpa beban model yang sepenuhnya dispesifikasi.

Troubleshooting jauh lebih mudah jika Anda mendekatinya secara sistematis, menganalisis batasan, fungsi objektif, dan umpan balik solver.

2. Efisiensi pemodelan

Masalah optimasi dapat menjadi mahal secara komputasi seiring ukuran model meningkat. Untuk memastikan pemodelan yang efisien, pertimbangkan tips berikut:

  • Manfaatkan sparsitas: Hindari melakukan loop atas indeks yang tidak perlu saat mendefinisikan batasan atau objektif. Memanfaatkan sparsitas dalam masalah Anda mengurangi waktu komputasi.
  • Variabel biner vs. kontinu: Jika memungkinkan, kurangi jumlah variabel biner atau bilangan bulat. Variabel kontinu lebih mudah ditangani solver, menghasilkan solusi lebih cepat.
  • Perumusan batasan: Jaga batasan sesederhana mungkin, baik dalam bentuk matematis maupun implementasi. Hindari non-linearitas yang tidak perlu dan pecah batasan kompleks menjadi bagian yang lebih kecil dan mudah dikelola.

Model yang efisien lebih cepat diselesaikan dan lebih mudah di-debug serta dipelihara.

3. Dokumentasi dan pemeliharaan

Memelihara model Pyomo yang terdokumentasi dengan baik adalah praktik yang baik untuk penggunaan jangka panjang dan kolaborasi. Dokumentasi yang baik juga memudahkan untuk meninjau kembali dan memperbarui model seiring waktu:

  • Gunakan komentar inline: Selalu tambahkan komentar untuk menjelaskan tujuan variabel, batasan, dan fungsi objektif. Ini sangat penting dalam model optimasi di mana logika mungkin tidak langsung terlihat jelas.
  • Modularisasi kode Anda: Pecah model Anda menjadi bagian-bagian logis atau bahkan fungsi terpisah. Pendekatan modular ini dapat meningkatkan keterbacaan dan memudahkan debug serta modifikasi bagian tertentu dari model.
  • Lacak perubahan model: Simpan riwayat versi model Anda, terutama jika terus berkembang. Gunakan alat kontrol versi seperti Git untuk melacak perubahan dan memastikan setiap pembaruan atau perbaikan dapat ditelusuri kembali.

Dokumentasi yang baik dan kode terstruktur akan membuat model Pyomo Anda lebih mudah diakses oleh kolaborator di masa depan dan lebih mudah untuk diskalakan atau dimodifikasi seiring berkembangnya kebutuhan Anda.

Kesimpulan

Pyomo adalah alat yang kuat dan fleksibel untuk membangun dan menyelesaikan model optimasi di Python. Sepanjang tutorial ini, kita mengeksplorasi bagaimana Pyomo memungkinkan pengguna memodelkan berbagai masalah optimasi, dari pemrograman linear hingga non-linear dan pemrograman bilangan bulat campuran. 

Dengan sintaks yang ramah pengguna dan integrasi dengan solver, Pyomo membuat perumusan dan penyelesaian masalah optimasi dunia nyata dapat diakses baik oleh pemula maupun pengguna tingkat lanjut.

Jika Anda tertarik untuk mempelajari lebih lanjut tentang penyelesaian masalah dunia nyata dengan optimasi, lihat kursus gratis Introduction to Optimization in Python di DataCamp!

FAQs

Untuk apa Pyomo digunakan?

Pyomo adalah pustaka Python open-source yang digunakan untuk mendefinisikan dan menyelesaikan masalah optimasi kompleks, termasuk pemrograman linear, non-linear, dan bilangan bulat campuran.

Bagaimana cara menginstal Pyomo dan solvernya?

Anda dapat menginstal Pyomo menggunakan pip install pyomo. Solver seperti GLPK dan CBC dapat diinstal melalui manajer paket seperti Homebrew, apt-get, atau Conda.

Jenis masalah optimasi apa yang dapat diselesaikan Pyomo?

 Pyomo mendukung beragam masalah optimasi, termasuk Pemrograman Linear (LP), Pemrograman Non-Linear (NLP), Pemrograman Bilangan Bulat Campuran (MIP), dan Pemrograman Stokastik.

Dapatkah saya menggunakan Pyomo untuk aplikasi dunia nyata seperti optimasi rantai pasok?

Ya, Pyomo banyak digunakan untuk aplikasi dunia nyata seperti optimasi rantai pasok, pemodelan keuangan, optimasi sistem energi, dan tugas machine learning.

Apa perbedaan antara solver open-source dan komersial di Pyomo?

Solver open-source seperti GLPK dan CBC gratis dan memadai untuk banyak masalah, sementara solver komersial seperti Gurobi dan CPLEX menawarkan kinerja yang ditingkatkan dan fitur lanjutan untuk tugas optimasi yang lebih kompleks dan skala besar.

Moez Ali

Penulis

Moez Ali

Data Scientist, Pendiri & Kreator PyCaret

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026