Lewati ke konten utama

Gurobi: Optimisasi Matematis untuk Masalah Kompleks

Kuasai optimisasi Gurobi dari penyiapan hingga aplikasi dunia nyata. Pelajari membangun model, mengonfigurasi penyelesai, dan menangani masalah linear, integer, dan nonlinier secara efisien.
Diperbarui 28 Sep 2026  · 14 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Penyelesai dasar dan metode coba-coba kewalahan saat jumlah variabel membesar. Gurobi menangani kompleksitas ini dengan cepat dan presisi, menyelesaikan masalah dalam hitungan detik yang sebaliknya bisa memakan waktu berjam-jam. Itulah bedanya antara sekadar berharap rencana Anda feasibel dan membuktikan secara matematis bahwa rencana tersebut optimal.

Tutorial ini membimbing Anda melalui penyelesai komersial yang kuat bernama Gurobi. Saya akan menunjukkan cara menginstal pustaka Python, memformulasikan model pertama Anda, dan meningkatkan skala ke masalah lanjutan seperti pemrograman campuran-bulat (mixed-integer programming).

Memahami Optimisasi Matematis dan Peran Gurobi

Sebelum menulis kode, ada baiknya memahami apa sebenarnya makna optimisasi. Konteks ini menunjukkan kapan harus menggunakan Gurobi alih-alih pendekatan pemrograman standar.

Apa itu optimisasi matematis?

Optimisasi matematis mencari solusi terbaik dari semua solusi yang mungkin. Anda mendefinisikan apa yang dimaksud dengan "terbaik" (meminimalkan biaya, memaksimalkan laba, meminimalkan waktu), apa yang Anda kendalikan (variabel keputusan), dan batasan yang dihadapi (kendala). Optimizer menelusuri solusi feasibel untuk menemukan yang optimal.

Ini berbeda dari pemrograman tradisional, di mana Anda menentukan langkah-langkah secara eksplisit. Dengan optimisasi, Anda mendeskripsikan masalahnya secara matematis dan membiarkan penyelesai mencari cara menyelesaikannya. Anda tidak menulis logika "jika ini maka itu"; Anda mendefinisikan hubungan dan membiarkan algoritme menemukan nilai terbaik.

Signifikansi Gurobi dalam optimisasi

Mengapa Gurobi menonjol

Gurobi secara konsisten menempati peringkat sebagai salah satu optimizer komersial tercepat. Benchmark sering menunjukkan kinerjanya jauh melampaui alternatif open-source pada masalah skala besar. Kecepatan ini penting saat Anda menjalankan optimisasi per jam atau membutuhkan hasil dalam batas waktu ketat.

Adopsi industri

Perusahaan di bidang logistik, keuangan, energi, dan kesehatan menggunakan Gurobi untuk sistem produksi. FedEx mengoptimalkan rute pengiriman, sementara perusahaan keuangan mengalokasikan miliaran dalam portofolio. Perusahaan energi menjadwalkan pembangkitan listrik. Ini bukan latihan akademis; ini adalah sistem yang menangani uang nyata dan kendala nyata.

Kapabilitas penyelesai

Gurobi menangani linear programming (LP), mixed-integer programming (MIP), quadratic programming (QP), dan lainnya. Ia menyertakan algoritme mutakhir seperti optimisasi konkuren, di mana beberapa metode solusi berjalan paralel dan yang tercepat menang. Anda mendapat keandalan dan kecepatan tanpa memilih algoritme secara manual.

Menyiapkan Gurobi

Menginstal Gurobi hanya beberapa langkah. Setelah dikonfigurasi, ia bekerja mulus dengan Python.

Instalasi dan penyiapan

Unduh dan instal

Kunjungi situs Gurobi dan unduh installer untuk OS Anda. Paket ini mencakup optimizer, antarmuka gurobipy , dan dokumentasi. Jalankan installer dengan pengaturan default kecuali Anda memerlukan path khusus.

Setelah instalasi, verifikasi bahwa semuanya berhasil:

import gurobipy as gp
print(f"Gurobi version: {gp.__version__}")

Di sini, kita memverifikasi instalasi dengan mencetak nomor versi. Jika tercetak dengan sukses, lingkungan Anda siap digunakan.

Sel Jupyter Notebook menampilkan kode Python untuk mengimpor gurobipy dan mencetak versi terinstal, menghasilkan keluaran Gurobi version 13.0.0.

Opsi lisensi

Gurobi memerlukan lisensi untuk penggunaan di luar masalah uji kecil. Opsi Anda:

  • Lisensi uji coba gratis: evaluasi 30 hari. Minta dari situs Gurobi dengan email kerja Anda.
  • Lisensi akademik: Gratis untuk dosen dan mahasiswa. Verifikasi email akademik Anda untuk akses tanpa batas, ideal untuk belajar.
  • Lisensi komersial: Diperlukan untuk bisnis. Harga bervariasi menurut skala. Lisensi pengguna bernama cocok untuk data scientist individual, sedangkan lisensi floating memungkinkan tim berbagi kapasitas.
  • Lisensi cloud: Bayar sesuai penggunaan. Tidak ada biaya di muka, cukup bayar yang Anda gunakan. Berguna untuk tugas optimisasi sesekali.

Saya menggunakan lisensi akademik untuk belajar dan lisensi komersial untuk produksi. Uji coba memberi Anda cukup waktu untuk mengeksplorasi sebelum berkomitmen.

Konfigurasi lingkungan

Penyiapan Python

Gurobi bekerja dengan Python 3.7+. Saya menyarankan menggunakan virtual environment untuk menghindari konflik:

python -m venv gurobi_env
gurobi_env\Scripts\activate
source gurobi_env/bin/activate
pip install gurobipy

Perintah ini menyiapkan ruang kerja yang bersih dan mengunduh pustakanya.

Integrasi Jupyter Notebook

Untuk pengembangan interaktif, notebook sangat cocok dengan Gurobi:

pip install jupyter
jupyter notebook
import gurobipy as gp
print("Gurobi ready!")

Cuplikan ini memasang Jupyter, menyalakan server, dan menjalankan cek cepat untuk memastikan Gurobi dapat dimuat dengan benar di dalam notebook.

Kapan TIDAK menggunakan Gurobi

Gurobi sangat kuat, tetapi tidak selalu menjadi pilihan yang tepat.

  • Masalah sederhana: Jika Anda punya 50 variabel dan kendala linear dasar, penyelesai gratis seperti scipy.optimize.linprog atau Excel Solver cukup memadai.

  • Biaya: Lisensi komersial mahal. Untuk alat internal yang tidak kritis, opsi open-source seperti CBC atau GLPK (melalui PuLP) mungkin cukup.

  • Heuristik: Jika Anda butuh jawaban "cukup baik" dalam milidetik untuk gim waktu nyata, heuristik (seperti algoritme genetik) sering lebih unggul daripada penyelesai eksak.

Gunakan Gurobi saat masalahnya besar (10 ribu+ variabel) atau Anda butuh fitur lanjutan seperti kendala kuadratik.

Kompatibilitas platform

Gurobi berjalan di Windows, macOS, dan Linux. Lingkungan cloud seperti AWS, Azure, dan Google Cloud mendukung Gurobi melalui marketplace mereka. Saya telah menerapkan model Gurobi di tiga cloud besar tanpa masalah spesifik platform.

Membangun Model Optimisasi

Dengan Gurobi terpasang, mari bangun model pertama Anda. Konsep inti ini berlaku untuk setiap masalah yang akan Anda selesaikan.

Komponen utama model optimisasi

Setiap model memiliki tiga bagian esensial:

Variabel keputusan

Inilah pilihan yang dibuat optimizer. Dalam perencanaan produksi, ini bisa berupa "unit Produk A" dan "unit Produk B." Anda mendefinisikan variabelnya; Gurobi menetapkan nilainya.

Fungsi objektif

Ini adalah tujuan Anda, apa yang ingin dimaksimalkan atau diminimalkan. Memaksimalkan laba (3*product_a + 5*product_b) atau meminimalkan biaya. Anda mendapatkan satu tujuan per model.

Kendala

Inilah batasan Anda. Anda tidak bisa memproduksi melebihi kapasitas pabrik atau membelanjakan melebihi anggaran. Kendala menentukan solusi mana yang benar-benar mungkin.

Praktik terbaik formulasi

Gunakan nama variabel yang jelas. Alih-alih x[1], gunakan produce_product_a. Ini menghemat jam debugging di kemudian hari, seperti yang akan saya jelaskan di bagian pemecahan masalah.

Jaga kendala tetap sederhana. Memecah logika kompleks menjadi kendala yang lebih kecil dan sederhana membuat model Anda lebih mudah dibaca dan di-debug.

Gurobi modern: Matrix API

Jika Anda berlatar data science, pemodelan berbasis loop mungkin terasa lambat. Gurobi 13.0+ menawarkan Matrix API yang menggunakan array NumPy, membuat pembangunan model 10–50x lebih cepat.

Berikut tampilan model bakery menggunakan vektor:

import gurobipy as gp
import numpy as np

# Data
prices = np.array([2.0, 5.0])
resources = np.array([[0.5, 2.0], [1.0, 1.0]])
limits = np.array([100.0, 80.0])

model = gp.Model("bakery_matrix")
x = model.addMVar(shape=2, name="x")

model.setObjective(prices @ x, gp.GRB.MAXIMIZE)
model.addConstr(resources @ x <= limits, name="constraints")

model.optimize()

Sintaks A @ x <= b ini lebih bersih dan standar untuk sistem produksi.

Membuat model linear programming sederhana

Mari selesaikan masalah praktis: sebuah bakery memutuskan berapa banyak roti dan kue yang harus dipanggang untuk memaksimalkan laba.

Susunan masalah:

- Laba roti: $2 | Tepung: 0,5 kg

- Laba kue: $5 | Tepung: 2 kg

- Tepung tersedia: 100 kg

- Kapasitas oven: 80 item

Berikut modelnya:

import gurobipy as gp
from gurobipy import GRB

model = gp.Model("bakery_optimization")

bread = model.addVar(name="bread", vtype=GRB.CONTINUOUS, lb=0)
cake = model.addVar(name="cake", vtype=GRB.CONTINUOUS, lb=0)

model.setObjective(2 * bread + 5 * cake, GRB.MAXIMIZE)

model.addConstr(0.5 * bread + 2 * cake <= 100, name="flour_limit")
model.addConstr(bread + cake <= 80, name="oven_capacity")

model.optimize()

if model.status == GRB.OPTIMAL:
    print(f"Optimal profit: ${model.objVal:.2f}")
    print(f"Bake {bread.X:.2f} loaves of bread")
    print(f"Bake {cake.X:.2f} cakes")
else:
    print("No optimal solution found")

Kode ini menginisialisasi model, mendefinisikan variabel, dan menetapkan objektif laba. Ia menerapkan kendala yang kita definisikan di atas dan menyelesaikan rencana optimalnya.

Memahami log penyelesai

Saat Anda menjalankan model.optimize(), Gurobi mencetak log. Begini cara membacanya:

Gurobi Optimizer version 13.0.0...
Presolve removed 0 rows and 0 columns
...
Explored 0 nodes (2 simplex iterations) in 0.01 seconds
Optimal objective  2.800000000e+02
  • Presolve: Gurobi menyederhanakan masalah Anda sebelum menyelesaikan. "Removed rows" berarti ia menemukan kendala yang berlebih.
  • Iterasi Simplex: Berapa banyak langkah yang diambil algoritme. Angka tinggi pada masalah kecil bisa mengindikasikan isu formulasi.
  • Optimal objective: Hasil akhir Anda (mis., laba $280).
  • Gap: Untuk masalah integer, ini menunjukkan selisih antara solusi terbaik yang ditemukan sejauh ini dan yang terbaik secara teoretis.

Memantau log membantu Anda melihat apakah model "macet" atau memang sedang bekerja keras.

Konsep di sini langsung dapat diskalakan. Entah Anda punya 10 variabel atau 10.000, polanya tetap sama.

Tipe Masalah Lanjutan yang Didukung Gurobi

Linear programming hanyalah permulaan. Gurobi menangani tipe kompleks yang menangkap nuansa dunia nyata, termasuk kapabilitas Non-Convex MINLP baru di versi 13.0.

Mixed-integer linear programming

Apa yang membuatnya berbeda

Mixed-integer programming (MIP) memungkinkan variabel bernilai bilangan bulat. Anda tidak bisa membangun 0,7 pabrik, jadi Anda perlu solusi integer.

Aplikasi dunia nyata

Lokasi fasilitas: Buka gudang di Kota A? Ya (1) atau Tidak (0).

Penjadwalan produksi: Ukuran batch sering harus bilangan bulat.

Desain jaringan: Keputusan rute biasanya biner. Lalu lintas mengalir melalui tautan atau tidak.

Contoh: lokasi fasilitas

import gurobipy as gp
from gurobipy import GRB

model = gp.Model("facility_location")

cities = ['CityA', 'CityB', 'CityC']
fixed_costs = {'CityA': 10000, 'CityB': 8000, 'CityC': 12000}

open_warehouse = model.addVars(cities, vtype=GRB.BINARY, name="open")

model.setObjective(
    gp.quicksum(fixed_costs[city] * open_warehouse[city] for city in cities),
    GRB.MINIMIZE
)

model.addConstr(gp.quicksum(open_warehouse[city] for city in cities) >= 2)

model.optimize()

print("Open warehouses in:")
for city in cities:
    if open_warehouse[city].X > 0.5:
        print(f"  {city}")

Di sini, kita menggunakan variabel biner untuk memutuskan apakah akan membuka gudang. Model meminimalkan biaya tetap sambil memastikan setidaknya dua fasilitas tetap buka.

Pemrograman kuadratik dan nonlinier

Quadratic programming (QP)

Saat objektif Anda mencakup suku kuadrat atau hasil kali variabel, itu adalah QP. Optimisasi portofolio adalah contoh klasik karena risiko (varians) bersifat kuadratik.

Quadratically constrained programming (QCP)

Kendala juga bisa kuadratik. Pikirkan masalah yang melibatkan lingkaran atau batasan melengkung.

Contoh: optimisasi portofolio

import gurobipy as gp
from gurobipy import GRB
import numpy as np

model = gp.Model("portfolio")

assets = ['StockA', 'StockB', 'StockC']
expected_returns = [0.12, 0.18, 0.10]

covariance = np.array([
    [0.04, 0.01, 0.02],
    [0.01, 0.09, 0.03],
    [0.02, 0.03, 0.05]
])

weights = model.addVars(len(assets), name="weight", lb=0, ub=1)

model.setObjective(
    gp.quicksum(expected_returns[i] * weights[i] for i in range(len(assets))),
    GRB.MAXIMIZE
)

model.addConstr(gp.quicksum(weights[i] for i in range(len(assets))) == 1)

risk_expr = gp.quicksum(
    covariance[i][j] * weights[i] * weights[j]
    for i in range(len(assets))
    for j in range(len(assets))
)
model.addConstr(risk_expr <= 0.05, name="risk_limit")

model.optimize()

print("Optimal portfolio allocation:")
for i, asset in enumerate(assets):
    print(f"{asset}: {weights[i].X * 100:.1f}%")

Pengaturan ini menangani optimisasi portofolio. Ia memaksimalkan imbal hasil sambil membatasi ketat total risiko (varians) menggunakan kendala kuadratik.

Tipe masalah tambahan yang didukung

Second-order cone programming (SOCP)

Masalah yang melibatkan kendala geometris, seperti mendefinisikan kerucut atau batas melingkar, masuk kategori ini. Umum dalam optimisasi robust dan desain rekayasa.

Mixed-integer quadratic programming (MIQP)

Menggabungkan variabel integer dengan objektif atau kendala kuadratik. Berguna dalam optimisasi diskret dengan hubungan nonlinier.

Gurobi mendukung semua tipe ini secara native. Anda tidak perlu memformulasi ulang masalah agar sesuai penyelesai tertentu; Gurobi mendeteksi tipe masalah secara otomatis dan menerapkan algoritme yang sesuai.

Bagan alur tipe optimisasi Gurobi: Linear (LP), Integer (MIP), dan Non-Linear (QP, MINLP).

Tipe masalah optimisasi yang didukung Gurobi. Gambar oleh Penulis.

Algoritme Gurobi dan Penerapannya

Pemilihan algoritme

Gurobi memilih algoritme secara otomatis, tetapi mengetahui opsinya membantu saat menelusuri penyelesaian yang lambat.

Nilai metode:

  • -1 (default): Biarkan Gurobi memutuskan

  • 0: Primal simplex (bagus untuk sebagian besar LP)

  • 1: Dual simplex (bagus saat mulai dari infeasible)

  • 2: Barrier (terbaik untuk model masif atau QP)

  • 3: Concurrent (menjalankan beberapa metode, memilih yang tercepat)

  • 4: Deterministic Concurrent

  • 5: Deterministic Concurrent Simplex

  • PDHG (Metode Orde Pertama: Gurobi 13.0 juga menyertakan PDHG, metode berbasis gradien yang ideal untuk LP masif dan dapat berjalan di GPU.

Periksa metode yang berjalan dengan melihat log penyelesai (mis., "Barrier solved model...").

Kapan menimpa default: Jika default memakan waktu berjam-jam, coba Barrier untuk model besar atau Concurrent untuk masalah yang tidak terduga.

model.Params.Method = 2
model.Params.BarConvTol = 1e-8

Ini secara eksplisit memilih metode Barrier dan memperketat toleransi, yang membantu saat menangani dataset yang masif atau sensitif.

Memanfaatkan Fitur Lanjutan Gurobi

Setelah menguasai dasar-dasar, Gurobi menawarkan alat yang kuat untuk masalah berskala perusahaan.

Optimisasi terdistribusi

Untuk model yang sangat besar yang terlalu lama di satu mesin, Anda dapat membagi pekerjaan. Optimisasi terdistribusi Gurobi menggunakan banyak komputer untuk menyelesaikan satu masalah lebih cepat.

Anda menetapkan satu mesin sebagai "manajer" dan lainnya sebagai "pekerja." Manajer mengirim bagian pohon pencarian ke pekerja, yang menyelesaikannya secara paralel. Ini berlebihan untuk model kecil tetapi esensial untuk masalah rantai pasok global atau penjadwalan maskapai.

Optimisasi multi-objektif

Kehidupan nyata jarang hanya punya satu tujuan. Anda mungkin ingin memaksimalkan laba dan meminimalkan dampak lingkungan.

Gurobi menanganinya dengan membiarkan Anda menetapkan prioritas. Anda bisa mengatakan "maksimalkan laba dulu, lalu minimalkan limbah tanpa mengurangi laba lebih dari 10%." Atau, Anda bisa memberi bobot: Objective = 0.7 * Profit - 0.3 * Waste.

# Multi-objective example
model.setObjectiveN(profit_expr, index=0, priority=2, name="Profit")
model.setObjectiveN(waste_expr, index=1, priority=1, name="Waste")

Interaksi waktu nyata dan callback

Kadang Anda ingin campur tangan saat Gurobi sedang menyelesaikan. Callback memungkinkan Anda menjalankan kode kustom pada titik tertentu, misalnya setiap kali solusi baru ditemukan.

Saya menggunakan callback untuk berhenti lebih awal jika solusi sudah "cukup baik" atau menyuntikkan heuristik kustom yang saya tahu bekerja untuk data saya.

Kapabilitas cloud

Menjalankan optimisasi di laptop Anda baik untuk pengembangan, tetapi produksi sering butuh daya lebih. Gurobi Cloud memungkinkan Anda memindahkan komputasi berat ke AWS, Azure, atau Instant Cloud milik Gurobi. Anda hanya membayar waktu penyelesaian, cocok untuk beban kerja berat yang sporadis.

Praktik Terbaik Pemodelan yang Praktis

Menulis model yang efisien memerlukan strategi. Berikut kiat untuk menjaga kode Anda bersih dan cepat.

Strategi formulasi model

Mulai sederhana, tambah kompleksitas secara bertahap

Jangan membangun model dengan 50 kendala di hari pertama. Mulailah dari logika inti, verifikasi, lalu perbaiki. Saya terlalu sering menghabiskan waktu men-debug model kompleks hanya untuk menemukan kesalahan ada pada hal dasar.

Gunakan nama variabel dan kendala yang bermakna

x1 = model.addVar(name="x1")
model.addConstr(x1 + x2 <= 100, name="c1")

units_produced = model.addVar(name="units_produced")
model.addConstr(
    units_produced + units_stored <= warehouse_capacity,
    name="warehouse_capacity_limit"
)

Perhatikan bedanya: blok kedua jelas menggambarkan logika bisnis. Seperti saya sebutkan sebelumnya, ini menghemat sakit kepala saat debugging.

Pra-proses data

Validasi data Anda sebelum memodelkan. Periksa nilai hilang atau kendala yang tidak mungkin. Menemukan kesalahan data setelah penyelesaian 3 jam itu menyakitkan.

Skalakan data Anda dengan tepat

Gurobi menangani presisi numerik dengan baik, tetapi nilai ekstrem menyebabkan masalah. Jika biaya dalam jutaan dan kuantitas dalam seperseribu, skalakan ke magnitudo serupa:

# Alih-alih cost = 10000000 dan quantity = 0.0001
# Skala ke cost = 10 (dalam jutaan) dan quantity = 100 (dalam satuan 1/1000)

Masalah numerik jarang terjadi pada model yang diskalakan dengan baik, dan umum pada model yang diskalakan buruk.

Pertimbangan stabilitas numerik

Gurobi menggunakan aritmetika floating-point, yang tidak tak terhingga. Jika kendala Anda mengatakan x <= 1000000000 dan toleransi Anda 1e-6, Anda bisa mendapat hasil yang aneh.

Hindari kendala "Big M" seperti if y=0 then x <= 1,000,000,000. Sebagai gantinya, pilih batas atas terkecil yang valid (mis., ukuran pasar total). Batas yang lebih ketat berarti penyelesaian lebih cepat dan lebih stabil.

Warm start dan modifikasi model

Anda jarang menyelesaikan masalah hanya sekali. Biasanya, data baru datang (mis., permintaan diperbarui).

Alih-alih membangun ulang model dari nol, gunakan warm start. Anda memberikan Gurobi solusi sebelumnya sebagai titik awal. Karena rencana optimal kemarin kemungkinan dekat dengan hari ini, Gurobi bisa melewati banyak pekerjaan pencarian.

# Warm start example
bread.Start = 40  # Mulai pencarian dengan asumsi memanggang 40 roti

Antarmuka Pemrograman dan Integrasi

Python API Gurobi

Kita menggunakan gurobipy karena bersifat Pythonic. Ia mendukung operator overloading (x + y <= 5) dan terintegrasi langsung dengan pandas dan NumPy. Ini adalah cara paling populer menggunakan Gurobi untuk data science.

Integrasi dengan bahasa lain

Sistem produksi sering berjalan di C++, Java, atau .NET untuk kecepatan. Gurobi mendukung semuanya. Konsepnya (Variabel, Kendala, Objektif) identik; hanya sintaksnya yang berubah.

Untuk alur kerja lintas bahasa, saya sering membuat prototipe di Python (coding cepat) dan melakukan deploy di C++ (eksekusi cepat), menggunakan format file Gurobi (.mps atau .lp) untuk memindahkan model di antara keduanya.

Dukungan bahasa pemodelan

Gurobi juga terhubung ke bahasa pemodelan khusus seperti AMPL dan GAMS, atau bahkan Excel.

- AMPL/GAMS: Cocok untuk peneliti matematis murni yang tidak ingin menulis kode perangkat lunak.

- Excel: Berguna untuk prototipe cepat atau menunjukkan model kepada pemangku kepentingan bisnis tanpa memasang Python.

Optimisasi Performa dan Tuning

Alur kerja tuning

Jangan melakukan tuning secara acak. Ikuti proses ini:

  1. Ukur baseline: Jalankan dengan default, catat waktu penyelesaian.

  2. Tetapkan batas keras terlebih dahulu: Sistem produksi membutuhkan TimeLimit.

  3. Tukar akurasi dengan kecepatan: Hanya longgarkan MIPGap jika bisnis mentoleransinya.

  4. Uji skala thread: Lebih banyak thread ≠ lebih cepat (imbal hasil menurun setelah 4–8).

# Example: Production deployment
model.Params.TimeLimit = 300  # Hard 5-min cutoff for API response
baseline_time = model.Runtime

if baseline_time > 240:  # If cutting it close
    model.Params.MIPGap = 0.02  # Accept 2% suboptimality
    # Business rationale: 2% cost increase < late delivery penalty

Benchmark performa

Benchmark menunjukkan Gurobi secara konsisten melampaui penyelesai open-source dengan selisih besar pada masalah MIP yang sulit. Sementara scipy menangani LP kecil dengan baik, Gurobi bersinar saat kompleksitas meningkat. Anda dapat menemukan benchmark perbandingan di situs Hans Mittelmann, yang melacak performa penyelesai secara independen.

Debugging dan pemecahan masalah

Ketidaklayakan model

Saat Gurobi melaporkan "Model is infeasible," kendala Anda saling bertentangan. Tidak ada solusi yang memenuhi semuanya sekaligus.

Temukan kendala yang bertentangan:

model.computeIIS()
model.write("infeasible.ilp")

print("Conflicting constraints:")
for c in model.getConstrs():
    if c.IISConstr:
        print(f"  {c.ConstrName}: {c.ConstrExpr}")

Ini menghitung Irreducible Inconsistent Subsystem (IIS) dan mencetak secara tepat kendala mana yang saling bertabrakan.

Model tak berbatas

Model tak berbatas berarti objektif dapat ditingkatkan tanpa batas. Biasanya mengindikasikan kendala yang hilang.

Periksa:

- Apakah Anda membatasi semua variabel? addVar(lb=0, ub=1000)

- Apakah kendalanya terformulasi dengan benar?

- Apakah fungsi objektifnya benar?

Menggunakan log penyelesai

Aktifkan logging terperinci untuk melihat apa yang dilakukan Gurobi:

model.Params.OutputFlag = 1
model.Params.LogToConsole = 1
model.Params.LogFile = "gurobi.log"

Ini mengaktifkan keluaran verbose dan menyimpan salinannya ke file lokal, memberi Anda riwayat rinci proses penyelesaian.

Menangani data

Dalam aplikasi nyata, data berasal dari berkas, bukan daftar hardcode.

import pandas as pd

# Load data
df = pd.read_csv("facility_costs.csv")
fixed_costs = dict(zip(df['city'], df['fixed_cost']))

# Validate BEFORE modeling
if any(c < 0 for c in fixed_costs.values()):
    raise ValueError("Costs cannot be negative")

Pola ini, Muat-Validasi-Model, mencegah kesalahan sunyi.

Aplikasi Dunia Nyata Gurobi

Teori itu bagus, tetapi mari lihat bagaimana industri benar-benar menggunakannya.

Optimisasi rantai pasok

Desain jaringan distribusi

FedEx, UPS, dan Amazon menggunakan konsep dari kursus Supply Chain Analytics in Python untuk meminimalkan biaya sambil memenuhi jaminan pengiriman.

Kita akan menggunakan Matrix API untuk contoh ini agar efisien menangani skala.

import gurobipy as gp
from gurobipy import GRB
import numpy as np

# 1. Data Generation
factories = ["F1", "F2"]
warehouses = ["W1", "W2", "W3"]
customers = ["C1", "C2", "C3", "C4"]

# Cost matrices (Factory->Warehouse, Warehouse->Customer)
transport_fw = np.array([[2.0, 4.0, 5.0], [3.0, 1.0, 6.0]])
transport_wc = np.array([
    [1.5, 2.0, 3.0, 4.0],
    [3.0, 1.0, 2.0, 2.5],
    [5.0, 4.0, 1.0, 1.5]
])

# Capacity and Demand
factory_cap = np.array([1000, 1000])
demand = np.array([300, 500, 400, 600])

try:
    with gp.Model("SupplyChain_Matrix") as model:
        # 2. Variables (Matrix Form)
        # Flow F->W and W->C
        flow_fw = model.addMVar((len(factories), len(warehouses)), name="fw")
        flow_wc = model.addMVar((len(warehouses), len(customers)), name="wc")
        
        # Binary decision: Open warehouse?
        open_w = model.addMVar(len(warehouses), vtype=GRB.BINARY, name="open")

        # 3. Objective: Minimize Transport + Fixed Costs
        fixed_cost = 5000
        obj = (transport_fw * flow_fw).sum() + \
              (transport_wc * flow_wc).sum() + \
              (fixed_cost * open_w).sum()
        model.setObjective(obj, GRB.MINIMIZE)

        # 4. Constraints
        # Factory capacity (sum rows of flow_fw <= cap)
        model.addConstr(flow_fw.sum(axis=1) <= factory_cap, name="Cap")

        # Customer demand (sum cols of flow_wc >= demand)
        model.addConstr(flow_wc.sum(axis=0) >= demand, name="Demand")

        # Flow balance: Inflow to W == Outflow from W
        model.addConstr(flow_fw.sum(axis=0) == flow_wc.sum(axis=1), name="Balance")

        # Warehouse capacity linking: Flow out <= BigM * OpenBinary
        model.addConstr(flow_wc.sum(axis=1) <= 2000 * open_w, name="Link")

        model.optimize()

        if model.Status == GRB.OPTIMAL:
            print(f"Optimal Cost: ${model.ObjVal:,.2f}")
            print(f"Open Warehouses: {open_w.X}")

except gp.GurobiError as e:
    print(f"Error: {e}")

Pendekatan vektorisasi ini (addMVar, sum(axis=1)) menangani ribuan variabel seketika, menghindari loop Python yang lambat.

Graf jaringan menampilkan model optimisasi rantai pasok dengan aliran yang menghubungkan Pabrik (merah) ke Pusat Distribusi (biru) lalu ke Pelanggan (hijau).

Graf jaringan rantai pasok. Gambar oleh Penulis.

Optimisasi persediaan

Menyeimbangkan biaya pemesanan, penyimpanan, dan kekurangan itu rumit. Dengan permintaan yang tidak pasti, ini menjadi optimisasi stokastik, yang ditangani Gurobi melalui pemodelan skenario.

Penjadwalan tenaga kerja

Perencanaan shift

Rumah sakit dan pusat panggilan harus menjadwalkan pekerja sambil menghormati kebutuhan staf, aturan ketenagakerjaan, dan preferensi.

Ini murni mixed-integer programming. Setiap penugasan adalah pilihan biner. Sebuah rumah sakit dengan 100 perawat dan 50 shift memiliki 5.000 variabel untuk diatur.

Contoh: penjadwalan perawat

import gurobipy as gp
from gurobipy import GRB

model = gp.Model("nurse_scheduling")

nurses = ['Alice', 'Bob', 'Carol', 'Dave']
shifts = ['Mon_Day', 'Mon_Night', 'Tue_Day', 'Tue_Night']
min_required = {'Mon_Day': 2, 'Mon_Night': 1, 'Tue_Day': 2, 'Tue_Night': 1}

schedule = model.addVars(nurses, shifts, vtype=GRB.BINARY, name="schedule")

model.setObjective(
    gp.quicksum(schedule[n, s] for n in nurses for s in shifts),
    GRB.MINIMIZE
)

for shift in shifts:
    model.addConstr(
        gp.quicksum(schedule[n, shift] for n in nurses) >= min_required[shift],
        name=f"min_staff_{shift}"
    )

for nurse in nurses:
    model.addConstr(
        gp.quicksum(schedule[nurse, s] for s in shifts) <= 3,
        name=f"max_shifts_{nurse}"
    )

for nurse in nurses:
    # Labor rule: 8-hour rest required between shifts
    model.addConstr(
        schedule[nurse, 'Mon_Day'] + schedule[nurse, 'Mon_Night'] <= 1,
        name=f"no_double_{nurse}_Mon"
    )
    model.addConstr(
        schedule[nurse, 'Tue_Day'] + schedule[nurse, 'Tue_Night'] <= 1,
        name=f"no_double_{nurse}_Tue"
    )

model.optimize()

print("Optimal schedule:")
for nurse in nurses:
    assigned = [s for s in shifts if schedule[nurse, s].X > 0.5]
    print(f"{nurse}: {', '.join(assigned)}")

Ini memodelkan masalah penjadwalan menggunakan variabel biner. Ia meminimalkan total shift sambil memenuhi kebutuhan staf, jam maksimal, dan periode istirahat wajib.

Optimisasi portofolio keuangan

Pertukaran risiko-imbal hasil

Optimisasi portofolio menyeimbangkan ekspektasi imbal hasil terhadap risiko. Model Markowitz klasik:

  • Maksimalkan: Imbal hasil yang diharapkan
  • Dengan syarat: Risiko (varians) di bawah ambang
  • Kendala: Kendala anggaran, persyaratan diversifikasi, batas regulasi

Ini adalah pemrograman kuadratik. Imbal hasil linear terhadap bobot portofolio, tetapi varians kuadratik (melibatkan hasil kali bobot).

Pertimbangan praktis

Optimisasi portofolio nyata mencakup:

  • Biaya transaksi (beli/jual menimbulkan biaya)
  • Kendala integer (tidak bisa membeli pecahan saham untuk beberapa aset)
  • Persyaratan regulasi (tidak boleh melebihi 10% di satu sekuritas)
  • Kendala rebalancing (jangan mengubah portofolio yang ada terlalu drastis)

Manajer aset menjalankan optimisasi ini setiap hari, mengelola miliaran modal. Waktu penyelesaian model berdampak langsung pada eksekusi strategi perdagangan.

Kesimpulan

Kita telah membahas banyak hal, dari menginstal Gurobi hingga membangun model rantai pasok yang kompleks.

Sekarang, alih-alih berdebat opini di ruang rapat, Anda bisa menampilkan kode di layar. "Inilah rencana yang optimal secara matematis." Itu mengubah percakapan. Anda berhenti menebak dan mulai membuktikan.

Silakan coba pada masalah berantakan berikutnya, konflik jadwal atau himpitan anggaran yang Anda hindari. Bisa jadi jawaban sempurna selama ini tersembunyi di data Anda.

Dan jika Anda ingin mempertajam keterampilan optimisasi lebih jauh, lihat tutorial Pengantar Linear Programming dan kursus Introduction to Optimization in Python untuk terus membangun kemampuan.


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

Saya seorang data engineer dan pembangun komunitas yang bekerja lintas pipeline data, cloud, dan perkakas AI sambil menulis tutorial praktis dan berdampak tinggi untuk DataCamp dan pengembang yang sedang berkembang.

Gurobi FAQs

Apa perbedaan antara Gurobi Optimizer dan gurobipy?

Gurobi Optimizer adalah mesin komputasi yang menyelesaikan masalah matematika. gurobipy adalah pustaka Python yang Anda gunakan untuk membangun model dan berkomunikasi dengan mesin tersebut. Anda menulis kode di gurobipy, dan ia mengirim masalah ke Optimizer untuk menemukan solusi.

Apakah saya perlu matematika lanjutan untuk menggunakan Gurobi secara efektif?

Tidak juga. Jika Anda memahami aljabar dasar (seperti 2x + y <= 10), Anda sudah siap untuk sebagian besar masalah. Alatnya yang menangani algoritme kompleks untuk Anda. Anda hanya perlu mampu mendeskripsikan masalah Anda secara logis.

Bisakah saya menggunakan Gurobi dengan bahasa lain selain Python?

Ya! Meskipun Python adalah pilihan paling populer untuk data science, Gurobi juga memiliki API yang kuat untuk C++, Java, .NET, dan MATLAB. Ia bahkan terintegrasi dengan R untuk alur kerja analisis statistik.

Apa yang terjadi jika model saya terlalu lama diselesaikan?

Anda tidak selalu membutuhkan jawaban yang "sempurna". Anda bisa menetapkan "MIPGap" untuk menghentikan penyelesai begitu ia menemukan solusi dalam 1% atau 5% dari optimal. Untuk keputusan dunia nyata, jawaban yang baik sekarang sering lebih baik daripada jawaban sempurna besok.

Apakah Gurobi sulit dipelihara di produksi?

Sebenarnya cukup stabil. Tantangan utamanya bukan pada perangkat lunak, melainkan data. Jika data masukan Anda berubah format atau mengandung kesalahan, model Anda bisa rusak. Pipeline validasi data yang baik lebih krusial daripada kode Gurobi itu sendiri.

Bisakah saya memvisualisasikan hasilnya dengan mudah?

Gurobi menghasilkan angka, tetapi karena sangat terintegrasi dengan Python, Anda bisa menyalurkan hasil tersebut langsung ke pustaka seperti Matplotlib, Seaborn, atau Plotly. Anda dapat mengubah hasil optimisasi menjadi bagan Gantt atau peta jaringan hanya dalam beberapa baris kode.

Topik
Analisis Data
Python

Belajar bersama DataCamp

{count, plural, one {Kursus} other {Kursus}}

Pengantar Optimasi di Python

{hours} jam
5.6K
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

{count, plural, one {blog} other {blogs}}

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

{count, plural, one {blog} other {blogs}}

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

{count, plural, one {blog} other {blogs}}

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

{count, plural, one {blog} other {blogs}}

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

Lihat SelengkapnyaLihat Selengkapnya