Last chance! 50% off DataCamp Premium
Sale ends in
Temel çözücüler ve deneme-yanılma yöntemleri, değişkenler büyüdüğünde zorlanır. Gurobi bu karmaşıklıkları hız ve hassasiyetle yönetir; saatler sürebilecek problemleri saniyeler içinde çözer. Bu, uygulanabilir bir plan ummakla, en iyisini elde ettiğinizi matematiksel olarak kanıtlamak arasındaki farktır.
Bu eğitim, güçlü ticari çözücü Gurobi’ye rehberlik eder. Python kütüphanesini nasıl kuracağınızı, ilk modelinizi nasıl formüle edeceğinizi ve karma tamsayılı programlama gibi ileri problemler için nasıl ölçekleyeceğinizi göstereceğim.
Koda yazmaya başlamadan önce, optimizasyonun gerçekte ne anlama geldiğini anlamak faydalıdır. Bu bağlam, standart programlama yaklaşımları yerine ne zaman Gurobi kullanmanız gerektiğini gösterir.
Matematiksel optimizasyon, tüm olası çözümler arasından en iyi çözümü bulur. "En iyi"nin ne olduğunu siz tanımlarsınız (maliyeti en aza indirmek, kârı en çoklamak, zamanı en aza indirmek), neyi kontrol ettiğinizi (karar değişkenleri) ve hangi sınırlara sahip olduğunuzu (kısıtlar). Çözücü, uygulanabilir çözümler arasında en iyisini arar ve bulur.
Bu, tam adımları belirlediğiniz geleneksel programlamadan farklıdır. Optimizasyonda, problemi matematiksel olarak tanımlarsınız ve çözmeyi çözücüye bırakırsınız. "Şu olursa bunu yap" mantığı yazmak yerine ilişkileri tanımlarsınız ve algoritmaların en iyi değerleri bulmasına izin verirsiniz.
Gurobi, mevcut en hızlı ticari çözücülerden biri olarak sürekli üst sıralarda yer alır. Kıyaslamalar, büyük ölçekli problemler üzerinde açık kaynak alternatifleri önemli ölçüde geride bıraktığını sıklıkla gösterir. Saatlik optimizasyon çalıştırdığınızda veya sıkı zaman limitleri içinde sonuçlara ihtiyaç duyduğunuzda bu hız önemlidir.
Lojistik, finans, enerji ve sağlık gibi sektörlerde şirketler Gurobi’yi üretim sistemlerinde kullanır. FedEx teslimat rotalarını optimize ederken, finans kuruluşları milyarlarca doları portföylerde tahsis eder. Enerji şirketleri elektrik üretimini planlar. Bunlar akademik alıştırmalar değil; gerçek para ve gerçek kısıtlarla çalışan sistemlerdir.
Gurobi doğrusal programlama (LP), karma tamsayılı programlama (MIP), kuadratik programlama (QP) ve daha fazlasını destekler. Aynı anda birden fazla çözüm yönteminin paralel çalıştırıldığı ve en hızlısının kazandığı eşzamanlı optimizasyon gibi son teknoloji algoritmalar içerir. Algoritmaları elle seçmeden güvenilirlik ve hız elde edersiniz.
Gurobi'yi kurmak sadece birkaç adım sürer. Yapılandırıldıktan sonra Python ile sorunsuz çalışır.
Gidin: Gurobi'nin web sitesi ve işletim sisteminiz için yükleyiciyi indirin. Yükleyici; çözücüyü, gurobipy arayüzünü ve dokümantasyonu içerir. Özel bir yola ihtiyacınız yoksa yükleyiciyi varsayılan ayarlarla çalıştırın.
Kurulumdan sonra, çalıştığını doğrulayın:
import gurobipy as gp
print(f"Gurobi version: {gp.__version__}")
Burada, sürüm numarasını yazdırarak kurulumu doğruluyoruz. Başarılı bir yazdırma, ortamınızın hazır olduğunu gösterir.

Gurobi, küçük test problemlerinin ötesindeki her şey için lisans gerektirir. Seçenekleriniz:
Öğrenme için akademik lisansı, üretimde ise ticari olanı kullanıyorum. Deneme süresi, karar vermeden önce keşfetmek için fazlasıyla zaman tanır.
Gurobi, Python 3.7+ ile çalışır. Çakışmalardan kaçınmak için sanal ortam kullanmanızı öneririm:
python -m venv gurobi_env
gurobi_env\Scripts\activate
source gurobi_env/bin/activate
pip install gurobipy
Bu komutlar temiz bir çalışma alanı oluşturur ve kütüphaneyi kurar.
Etkileşimli geliştirme için notebooklar Gurobi ile harika çalışır:
pip install jupyter
jupyter notebook
import gurobipy as gp
print("Gurobi ready!")
Bu kod parçası Jupyter’ı kurar, sunucuyu başlatır ve Gurobi’nin notebook içinde doğru şekilde yüklendiğini hızlıca kontrol eder.
Gurobi güçlüdür, ancak her zaman doğru seçim değildir.
Basit problemler: 50 değişken ve temel doğrusal kısıtlara sahipseniz, ücretsiz çözücüler olan scipy.optimize.linprog veya Excel Solver yeterli olur.
Maliyet: Ticari lisanslar pahalıdır. Kritik olmayan dahili araçlar için PuLP aracılığıyla CBC veya GLPK gibi açık kaynak seçenekler yeterli olabilir.
Sezgisel yöntemler: Gerçek zamanlı bir oyun için milisaniyeler içinde "yeterince iyi" bir cevap gerekiyorsa, genetik algoritmalar gibi sezgisel yöntemler çoğu zaman tam çözücülerden daha iyidir.
Problemler büyük olduğunda (10 bin+ değişken) veya kuadratik kısıtlar gibi gelişmiş özelliklere ihtiyaç duyduğunuzda Gurobi’yi kullanın.
Gurobi Windows, macOS ve Linux üzerinde çalışır. AWS, Azure ve Google Cloud gibi bulut ortamları, pazar yerleri üzerinden Gurobi’yi destekler. Üç büyük bulutta da platforma özgü sorunlar yaşamadan Gurobi modelleri dağıttım.
Gurobi kurulu olduğuna göre ilk modelinizi oluşturalım. Bu temel kavramlar çözeceğiniz her problem için geçerlidir.
Her modelin üç temel parçası vardır:
Bunlar, çözücünün değer atadığı seçimlerdir. Üretim planlamasında bu, "Ürün A adedi" ve "Ürün B adedi" olabilir. Değişkenleri siz tanımlarsınız; Gurobi değerleri atar.
Bu, en çoklamak veya en aza indirmek istediğiniz hedeftir. Kârı en çoklamak (3*product_a + 5*product_b) veya maliyeti en aza indirmek gibi. Model başına bir amaç vardır.
Bunlar sınırlarınızdır. Fabrika kapasitesinden fazlasını üretemez veya bütçenizden fazlasını harcayamazsınız. Kısıtlar, hangi çözümlerin gerçekten mümkün olduğunu tanımlar.
Açık değişken adları kullanın. x[1] yerine produce_product_a kullanın. Sorun giderme bölümünde açıklayacağım gibi bu, ileride saatlerce hata ayıklamaktan kurtarır.
Kısıtları sade tutun. Karmaşık mantığı daha küçük ve basit kısıtlara bölmek, modelinizi okumayı ve hata ayıklamayı kolaylaştırır.
Veri bilimi geçmişinden geliyorsanız, döngü tabanlı modelleme yavaş gelebilir. Gurobi 13.0+ NumPy dizilerini kullanan bir Matris API sunar ve model kurmayı 10-50 kat hızlandırır.
Bir fırın modeli, vektörler kullanılarak şu şekilde görünür:
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()
Bu A @ x <= b söz dizimi daha temizdir ve üretim sistemleri için standarttır.
Pratik bir problemi çözelim: Bir fırının kârı maksimize etmek için kaç ekmek ve kaç pasta pişireceğine karar vermesi.
Problem kurulumu:
- Ekmek kârı: $2 | Un: 0,5 kg
- Pasta kârı: $5 | Un: 2 kg
- Mevcut un: 100 kg
- Fırın kapasitesi: 80 ürün
Model şöyle:
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")
Bu kod, modeli başlatır, değişkenleri tanımlar ve kâr amacını belirler. Yukarıda tanımladığımız kısıtları uygular ve en iyi planı çözer.
model.optimize() çalıştırdığınızda, Gurobi bir günlük basar. Bunu böyle okuyun:
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
Günlüğü izlemek, bir modelin "takılıp kalıp kalmadığını" veya sadece yoğun çalıştığını görmenize yardımcı olur.
Buradaki kavramlar doğrudan ölçeklenir. 10 değişkeniniz de olsa 10.000 de olsa, desen aynıdır.
Doğrusal programlama sadece başlangıçtır. Gurobi, sürüm 13.0’daki yeni Dışbükey Olmayan MINLP yetenekleri de dahil olmak üzere gerçek dünya ayrıntılarını yakalayan karmaşık türleri destekler.
Karma tamsayılı programlama (MIP), değişkenlerin tamsayı olmasına izin verir. 0,7 fabrika inşa edemezsiniz; bu nedenle tamsayı çözümlere ihtiyaç vardır.
Tesis yeri: Şehir A’da bir depo aç? Evet (1) veya Hayır (0).
Üretim çizelgeleme: Parti büyüklükleri çoğu zaman tam sayı olmalıdır.
Ağ tasarımı: Yönlendirme kararları genellikle ikilidir. Trafik bir bağlantıdan geçer ya da geçmez.
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}")
Burada, bir depoyu açıp açmamaya karar vermek için ikili değişkenler kullanıyoruz. Model, en az iki tesisin açık kalmasını sağlarken sabit maliyetleri en aza indirir.
Amaç fonksiyonunuz kare terimler veya değişken çarpımları içerdiğinde QP’niz vardır. Portföy optimizasyonu klasik bir örnektir, çünkü risk (varyans) kuadratiktir.
Kısıtlar da kuadratik olabilir. Daireler veya eğri sınırlar içeren problemleri düşünün.
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}%")
Bu kurulum, portföy optimizasyonunu ele alır. Toplam riski (varyans) kuadratik kısıtlarla sıkı bir şekilde sınırlandırırken getirileri maksimize eder.
Koni veya dairesel sınır tanımlamak gibi geometrik kısıtlar içeren problemler bu kategoriye girer. Sağlam optimizasyon ve mühendislik tasarımında yaygındır.
Tamsayı değişkenleri, kuadratik amaçlar veya kısıtlarla birleştirir. Doğrusal olmayan ilişkilerin olduğu ayrık optimizasyonda kullanışlıdır.
Gurobi bu türlerin tümünü yerel olarak destekler. Problemleri belirli bir çözücüye uydurmak için yeniden formüle etmeniz gerekmez; Gurobi problem türünü otomatik olarak algılar ve uygun algoritmaları uygular.

Gurobi'nin desteklediği optimizasyon problem türleri. Görsel: Yazar.
Gurobi algoritmaları otomatik seçer, ancak seçenekleri bilmek yavaş çözümleri giderirken yardımcı olur.
Yöntem değerleri:
-1 (varsayılan): Kararı Gurobi'ye bırak
0: Birincil simplex (çoğu LP için iyi)
1: İkili simplex (başlangıçta uygulanamaz olduğunda iyi)
2: Bariyer (çok büyük modeller veya QP için en iyisi)
3: Eşzamanlı (birden fazla yöntemi çalıştırır, en hızlıyı seçer)
4: Deterministik Eşzamanlı
5: Deterministik Eşzamanlı Simplex
PDHG (Birinci Dereceden Yöntem): Gurobi 13.0 ayrıca, GPU’larda çalışmaya uygun, devasa LP’ler için ideal gradyan tabanlı PDHG’yi içerir.
Hangi yöntemin çalıştığını, çözücü günlüğüne bakarak kontrol edin (ör. "Barrier solved model...").
Ne zaman geçersiz kılınır: Varsayılan saatler sürerse, çok büyük modeller için Barrier’ı veya öngörülemez problemler için Eşzamanlı’yı deneyin.
model.Params.Method = 2
model.Params.BarConvTol = 1e-8
Bu, özellikle çok büyük veya hassas veri kümeleriyle uğraşırken yardımcı olan Bariyer yöntemini açıkça seçer ve toleransı sıkılaştırır.
Temelleri öğrendikten sonra, Gurobi kurumsal ölçekli problemler için güçlü araçlar sunar.
Tek bir makinede çok uzun süren devasa modeller için işi bölebilirsiniz. Gurobi’nin dağıtık optimizasyonu, tek bir problemi daha hızlı çözmek için birden fazla bilgisayar kullanır.
Bir makineyi "yönetici", diğerlerini "işçi" olarak atarsınız. Yönetici, arama ağacının kısımlarını işçilere gönderir; işçiler bunları paralel çözer. Küçük modeller için aşırıdır; ancak küresel tedarik zinciri veya havayolu çizelgeleme problemleri için gereklidir.
Gerçek hayatta nadiren tek bir hedef vardır. Kârı maksimize ederken çevresel etkiyi en aza indirmek isteyebilirsiniz.
Gurobi bunu öncelikler belirlemenize izin vererek ele alır. "Önce kârı maksimize et, sonra kârı %10’dan fazla azaltmadan atığı minimize et" diyebilirsiniz. Alternatif olarak ağırlıklandırabilirsiniz: 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")
Bazen Gurobi çözüm ararken müdahale etmek istersiniz. Geri çağrılar, örneğin her yeni çözüm bulunduğunda, belirli noktalarda özel kod çalıştırmanıza olanak tanır.
Ben geri çağrıları, bir çözüm "yeterince iyi" olduğunda erken durdurmak veya verime özel işe yaradığını bildiğim özel sezgisel yöntemleri eklemek için kullanıyorum.
Geliştirme için dizüstünüzde optimizasyon çalıştırmak iyidir; ancak üretimde çoğu zaman daha fazla güce ihtiyaç vardır. Gurobi Cloud, ağır işi AWS, Azure veya Gurobi’nin kendi Instant Cloud’una devretmenize olanak tanır. Yalnızca çözüm süresi için ödeme yaparsınız; düzensiz, ağır iş yükleri için idealdir.
Verimli modeller yazmak strateji gerektirir. İşte kodunuzu temiz ve hızlı tutmak için ipuçları.
İlk günden 50 kısıtlı bir model kurmayın. Çekirdek mantıkla başlayın, doğrulayın, sonra iyileştirin. Çoğu zaman karmaşık modellerde saatler harcayıp hatanın temelde olduğunu gördüm.
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"
)
Farkı fark edin: ikinci blok iş mantığını açıkça betimler. Daha önce belirttiğim gibi, bu, hata ayıklama baş ağrılarını azaltır.
Modellemeden önce verinizi doğrulayın. Eksik değerler veya imkansız kısıtlar var mı kontrol edin. 3 saatlik bir çözümden sonra veri hatası bulmak can yakar.
Gurobi sayısal hassasiyeti iyi yönetir, ancak aşırı değerler sorun çıkarır. Maliyetler milyonlarla, miktarlar binde birlerle ölçülüyse, benzer büyüklüklere ölçekleyin:
# Instead of cost = 10000000 and quantity = 0.0001
# Scale to cost = 10 (in millions) and quantity = 100 (in 1/1000 units)
Sayısal sorunlar iyi ölçeklenmiş modellerde nadir, kötü ölçeklenmişlerde yaygındır.
Gurobi, sonsuz olmayan kayan noktalı aritmetik kullanır. Kısıtınız x <= 1000000000 ve toleransınız 1e-6 ise, garip sonuçlar alabilirsiniz.
Şu tür "Büyük M" kısıtlarından kaçının: if y=0 then x <= 1,000,000,000. Bunun yerine, mümkün olan en küçük üst sınırı seçin (ör. toplam pazar büyüklüğü). Daha sıkı sınırlar daha hızlı ve daha kararlı çözümler demektir.
Bir problemi nadiren sadece bir kez çözersiniz. Genellikle yeni veriler gelir (ör. güncellenmiş talep).
Modeli sıfırdan yeniden kurmak yerine sıcak başlangıç kullanın. Gurobi’ye önceki çözümü başlangıç noktası olarak verirsiniz. Dünkü en iyi plan muhtemelen bugünkü plana yakın olduğundan, Gurobi aramanın büyük kısmını atlayabilir.
# Warm start example
bread.Start = 40 # Start search assuming we bake 40 loaves
gurobipy kullandık çünkü Pythonik. Operatör taşmasını destekler (x + y <= 5) ve pandas ile NumPy ile doğrudan entegre olur. Veri bilimi için Gurobi’yi kullanmanın en popüler yoludur.
Üretim sistemleri genellikle hız için C++, Java veya .NET üzerinde çalışır. Gurobi bunların hepsini destekler. Kavramlar (Değişkenler, Kısıtlar, Amaçlar) aynıdır; yalnızca söz dizimi değişir.
Diller arası iş akışlarında, sık sık Python’da prototip (hızlı kodlama) yapar ve C++’ta dağıtırım (hızlı yürütme); arada Gurobi’nin dosya formatlarını (.mps veya .lp) kullanırım.
Gurobi, AMPL ve GAMS gibi özel modelleme dillerine, hatta Excel’e de bağlanır.
- AMPL/GAMS: Yazılım kodu yazmak istemeyen, tamamen matematiksel çalışan araştırmacılar için harikadır.
- Excel: Hızlı prototipler veya iş paydaşlarına Python kurmadan dokunabilecekleri bir model göstermek için kullanışlıdır.
Rastgele ayar yapmayın. Bu süreci izleyin:
Temeli ölçün: Varsayılanlarla çalıştırın, çözüm süresini not edin.
Önce sert sınırlar koyun: Üretim sistemleri TimeLimit gerektirir.
Hızı doğrulukla değiş tokuş edin: Yalnızca işletme tolere ediyorsa MIPGap’i gevşetin.
İş parçacığı ölçeklemeyi test edin: Daha fazla iş parçacığı ≠ daha hızlı (4-8’den sonra azalan getiri).
# 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
Kıyaslamalar, Gurobi’nin zor MIP problemlerinde açık kaynak çözücüleri katbekat geride bıraktığını gösterir. scipy küçük LP’leri gayet iyi işlerken, karmaşıklık arttığında Gurobi parıldar. Çözücü performansını bağımsız olarak takip eden Hans Mittelmann web sitesinde karşılaştırmalı kıyaslamaları bulabilirsiniz.
Gurobi "Model is infeasible" bildirdiğinde, kısıtlarınız çakışıyor demektir. Hiçbir çözüm hepsini aynı anda sağlayamıyor.
Çakışan kısıtları bulun:
model.computeIIS()
model.write("infeasible.ilp")
print("Conflicting constraints:")
for c in model.getConstrs():
if c.IISConstr:
print(f" {c.ConstrName}: {c.ConstrExpr}")
Bu, Asgari Tutarsız Alt Sistem (IIS) hesaplamasını yapar ve tam olarak hangi kısıtların birbirleriyle çatıştığını yazdırır.
Sınırsız bir model, amacın sonsuza dek iyileştirilebileceği anlamına gelir. Genellikle eksik kısıtları işaret eder.
Kontrol edin:
- Tüm değişkenleri sınırladınız mı? addVar(lb=0, ub=1000)
- Kısıtlar doğru formüle edildi mi?
- Amaç fonksiyonu doğru mu?
Gurobi’nin ne yaptığını görmek için ayrıntılı günlüğü etkinleştirin:
model.Params.OutputFlag = 1
model.Params.LogToConsole = 1
model.Params.LogFile = "gurobi.log"
Bu, ayrıntılı çıktıyı etkinleştirir ve yerel bir dosyaya kopyasını kaydeder; çözüm sürecinin ayrıntılı bir geçmişini sağlar.
Gerçek uygulamalarda veriler dosyalardan gelir, kod içine gömülü listelerden değil.
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")
Bu desen, Yükle-Doğrula-Modelle, sessiz hataları önler.
Teori harika, fakat endüstriler bunu gerçekte nasıl kullanıyor bir bakalım.
FedEx, UPS ve Amazon, teslimat garantilerini karşılarken maliyetleri en aza indirmek için Python ile Tedarik Zinciri Analitiği dersindeki kavramları kullanır.
Bu örnekte ölçeği verimli şekilde ele almak için Matris API’yi kullanacağız.
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}")
Bu vektörleştirilmiş yaklaşım (addMVar, sum(axis=1)) binlerce değişkeni anında işler ve yavaş Python döngülerinden kaçınır.

Tedarik zinciri ağ grafiği. Görsel: Yazar.
Sipariş, elde tutma ve yoksatma maliyetlerini dengelemek zordur. Talebin belirsiz olduğu durumlarda bu, Gurobi’nin senaryo modelleme yoluyla ele aldığı stokastik optimizasyona dönüşür.
Hastaneler ve çağrı merkezleri, personel ihtiyaçlarına, iş kanunlarına ve tercihlere saygı gösterirken çalışanları planlamak zorundadır.
Bu, saf karma tamsayılı programlamadır. Her atama ikili bir tercihtir. 100 hemşire ve 50 vardiyası olan bir hastanenin yönetmesi gereken 5.000 değişkeni vardır.
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)}")
Bu, vardiya planlamasını ikili değişkenlerle modeller. Toplam vardiya sayısını en aza indirirken personel gereksinimlerine, maksimum saatlere ve zorunlu dinlenme sürelerine uyar.
Portföy optimizasyonu, beklenen getirileri riskle dengeler. Klasik Markowitz modeli:
Bu, kuadratik programlamadır. Getiri, portföy ağırlıklarında doğrusaldır; ancak varyans kuadratiktir (ağırlıkların çarpımlarını içerir).
Gerçek portföy optimizasyonu şunları içerir:
Varlık yöneticileri bu optimizasyonları günlük olarak çalıştırır ve milyarları yönetir. Model çözüm süresi, alım satım stratejisinin uygulanmasını doğrudan etkiler.
Kurulumdan Gurobi ile karmaşık tedarik zinciri modelleri kurmaya kadar çok şey ele aldık.
Artık toplantı odasında fikir tartışmak yerine kodu ekrana koyabilirsiniz. "İşte matematiksel olarak en iyi plan." Bu, konuşmayı değiştirir. Tahmin etmeyi bırakır, kanıtlamaya başlarsınız.
Gidin ve bir sonraki karmaşık probleminizde, ertelediğiniz o çizelgeleme çatışması veya bütçe sıkışıklığında deneyin. Mükemmel cevabın verilerinizde saklandığını keşfedebilirsiniz.
Ve optimizasyon becerilerinizi daha da keskinleştirmek isterseniz, öğrenmeye devam etmek için Doğrusal Programlamaya Giriş eğitimimize ve Python ile Optimizasyona Giriş kurslarımıza göz atın.
Veri hatları, bulut ve YZ araçları üzerinde çalışan; aynı zamanda DataCamp ve gelişmekte olan geliştiriciler için pratik, yüksek etkili eğiticiler yazan bir veri mühendisi ve topluluk inşacısıyım.
Gurobi Optimizer, matematik problemlerini çözen hesaplama motorudur. gurobipy ise modeller kurmak ve bu motorla iletişim kurmak için kullandığınız Python kütüphanesidir. Kodu gurobipy içinde yazarsınız ve problem çözüm için Optimizer’a gönderilir.
Çok da değil. Temel cebiri (örneğin 2x + y <= 10) anlıyorsanız, çoğu problem için hazırsınız. Araç, karmaşık algoritmaları sizin için halleder. Sizin yapmanız gereken, probleminizi mantıksal olarak tanımlayabilmektir.
Evet! Python veri bilimi için en popüler seçenek olsa da, Gurobi’nin C++, Java, .NET ve MATLAB için de sağlam API’leri vardır. İstatistiksel analiz iş akışları için R ile bile entegre olur.
Her zaman "mükemmel" cevaba ihtiyacınız yok. Çözücü, optimumun %1 veya %5 yakınına bir çözüm bulduğunda durması için bir "MIPGap" belirleyebilirsiniz. Gerçek dünyadaki kararlar için, şimdi iyi bir cevap, yarın mükemmel bir cevaptan çoğu zaman daha iyidir.
Aslında oldukça kararlıdır. Esas zorluk yazılım değil, veridir. Girdi verinizin formatı değişirse veya hatalar içerirse, modeliniz bozulabilir. İyi veri doğrulama hatları, Gurobi kodunun kendisinden daha kritiktir.
Gurobi sayılar üretir; ancak Python ile bu kadar iyi entegre olduğu için sonuçları doğrudan Matplotlib, Seaborn veya Plotly gibi kütüphanelere aktarabilirsiniz. Optimizasyon sonuçlarınızı birkaç satır kodla Gantt grafiklerine veya ağ haritalarına dönüştürebilirsiniz.
DataCamp ile Öğrenin
Kurs
Kurs
Kurs
blog
Dario Radečić
15 dk.

blog
Abid Ali Awan
14 dk.
Eğitim
Adel Nehme
Eğitim
Kurtis Pykes
8 dk.