📋 İçindekiler
Tarihçe ve Tanım
Yöneylem Araştırması (Operations Research — OR), karmaşık sistemlerdeki karar problemlerine matematiksel ve analitik yöntemler uygulayan disiplindir. II. Dünya Savaşı döneminde (1939–1945) askeri operasyonları optimize etmek üzere İngiliz ve Amerikan bilim insanlarından oluşan takımlar tarafından geliştirildi.
Royal Air Force, sınırlı radar verisi ve pilot kapasitesiyle Alman bombardıman uçaklarını nasıl etkili biçimde karşılayacağını belirlemeye çalışıyordu. Patrick Blackett liderliğindeki bilim insanları ekibi, radar verilerini ve savaş kayıtlarını analiz ederek uçuş örüntüleri ve radar konuşlanması önerileri geliştirdi. İngiltere'nin savaşı kazanmasına matematiksel modellemenin katkısı olduğu düşünülmektedir. Blackett daha sonra Nobel Fizik Ödülü aldı.
Savaş sonrasında bu yöntemler sivil alana taşındı. 1947'de George Dantzig Simpleks Algoritması'nı geliştirdi — bu algoritma 20. yüzyılın en önemli algoritmalarından biri olarak tarihe geçti. Bugün YA şu alanlarda kullanılmaktadır:
Üretim Planlaması
Hangi ürünü ne kadar üret Hangi makinede Hangi vardiyada Kâr maksimizasyonu veya maliyet minimizasyonu.
Lojistik & Dağıtım
Hangi depodan hangi müşteriye, hangi araçla, hangi güzergahla teslimat Ulaşım maliyeti minimizasyonu.
İnsan Kaynakları
Hangi çalışan hangi vardiyada Hangi proje hangi ekibe Maliyet kısıtları altında kapasite planlama.
Finans & Yatırım
Portföy optimizasyonu — risk kısıtı altında hızlı teslimat girişimi maksimizasyonu. Banka kredi tahsisi planlaması.
Sağlık
Ameliyathane programlama, personel çizelgeleme, ilaç temin optimizasyonu, radyoterapi doz planlaması.
Doğrusal Programlama Formülasyonu
Doğrusal Programlama (DP / Linear Programming), hem amaç fonksiyonu hem de kısıtların doğrusal (lineer) olduğu optimizasyon problemidir. Standart formülasyon:
Z = c₁x₁ + c₂x₂ + ... + cₙxₙ
Kısıt altında:
a₁₁x₁ + a₁₂x₂ + ... + a₁ₙxₙ ≤ b₁
a₂₁x₁ + a₂₂x₂ + ... + a₂ₙxₙ ≤ b₂
⋮
aₘ₁x₁ + aₘ₂x₂ + ... + aₘₙxₙ ≤ bₘ
ve: x₁, x₂, ..., xₙ ≥ 0 (negatif olmama koşulu)
🏭 Üretim Planlaması Problemi — Formülasyon Örneği
Senaryo: Bir mobilya fabrikası sandalye (A) ve masa (B) üretiyor.
| Kaynak | Sandalye (A) | Masa (B) | Günlük Kapasite |
|---|---|---|---|
| Ağaç işleme (saat) | 2 | 4 | 40 saat |
| Boyama (saat) | 3 | 2 | 36 saat |
| Montaj (saat) | 1 | 3 | 24 saat |
| Kâr Katkısı | 300 ₺ | 500 ₺ | — |
Karar Değişkenleri: x₁ = günlük sandalye üretimi (adet), x₂ = günlük masa üretimi (adet)
Amaç Fonksiyonu: Maks Z = 300x₁ + 500x₂
Kısıtlar:
2x₁ + 4x₂ ≤ 40 (ağaç işleme kapasitesi)
3x₁ + 2x₂ ≤ 36 (boyama kapasitesi)
x₁ + 3x₂ ≤ 24 (montaj kapasitesi)
x₁, x₂ ≥ 0
Grafik Çözüm Yöntemi
İki karar değişkenli problemler grafik olarak çözülebilir. Uygunluk bölgesinin köşe noktaları (corner points) amaç fonksiyonunun en iyi değerini veren adaylardır. Temel Ekstrem Noktalar Teoremi: DP'nin optimal çözümü mutlaka uygunluk bölgesinin bir köşe noktasında bulunur.
Kısıt sınır doğrularının (eşitlik halleri) kesişimleri:
Nokta O: (0, 0) → Z = 300(0) + 500(0) = 0 ₺
Nokta A: (12, 0) [3x₁+2x₂=36, x₂=0] → Z = 300(12) + 500(0) = 3.600 ₺
Nokta B: (4, 8) [3x₁+2x₂=36, 2x₁+4x₂=40 kesişimi] → Z = 300(4) + 500(8) = 1.200+4.000 = 5.200 ₺
Nokta C: (0, 8) [x₁=0, montaj kısıtı: 3x₂≤24] → Z = 0 + 500(8) = 4.000 ₺
OPTIMAL ÇÖZÜM: B noktası (x₁=4, x₂=8) → Z = 5.200 ₺
Her gün 4 sandalye + 8 masa üretilmeli.
Köşe Noktası B'nin Doğrulanması (Denklem Sistemi):
Kısıt 2: 2x₁ + 4x₂ = 40 → x₁ + 2x₂ = 20
Kısıt 1'den Kısıt 2'yi çıkar:
(3x₁ + 2x₂) − (x₁ + 2x₂) = 36 − 20
2x₁ = 16 → x₁ = 4
x₁ = 4 yerine koy: 3(4) + 2x₂ = 36 → 2x₂ = 24 → x₂ = 8 ✓
Simpleks Yöntemi — Teori
George Dantzig'in 1947'de geliştirdiği Simpleks Algoritması, grafik yönteminun 2+ değişkenli problemlere genellemesidir. Temel fikir: Uygunluk bölgesinin köşe noktalarını sistematik biçimde dolaş, her adımda amaç fonksiyonunu iyileştiren komşu köşeye geç, iyileştirme mümkün değilse op timale ulaşılmıştır.
⚙️ Simpleks'in Temel Kavramları
- Gevşek (Slack) Değişken: ≤ kısıtı eşitliğe dönüştürmek için eklenen ek değişken. 2x₁ + 4x₂ ≤ 40 → 2x₁ + 4x₂ + s₁ = 40 (s₁ ≥ 0)
- Temel Değişken (Basic Variable): Bir köşe noktasında pozitif değer alan değişkenler. Tabloda "baz" olarak yer alır.
- Temel Olmayan Değişken: O köşe noktasında sıfır olan değişkenler.
- Pivot İşlemi: Bir köşeden komşu köşeye geçiş. Pivot sütunu ve pivot satırının belirlenmesiyle gerçekleşir.
- Optimalite Koşulu: Amaç satırında hiçbir negatif katsayı kalmadığında optimal çözüme ulaşılmıştır (maksimizasyon).
- Minimum Oran Kuralı: Pivot satırını belirlemek için RHS değerini pivot sütun katsayısına böl, en küçük pozitif oranı seç.
Simpleks Algoritması — Adım Adım Tam Çözüm
Aynı mobilya fabrikası problemini Simpleks yöntemiyle çözüyoruz. Önce standardize edilmiş forma getirelim:
Maks Z = 300x₁ + 500x₂
2x₁ + 4x₂ + s₁ = 40
3x₁ + 2x₂ + s₂ = 36
x₁ + 3x₂ + s₃ = 24
x₁, x₂, s₁, s₂, s₃ ≥ 0
Başlangıç bazı: s₁, s₂, s₃ (köşe noktası: x₁=0, x₂=0, Z=0)
| Baz | Z | x₁ | x₂ | s₁ | s₂ | s₃ | RHS | Oran |
|---|---|---|---|---|---|---|---|---|
| Z | 1 | -300 | -500 | 0 | 0 | 0 | 0 | — |
| s₁ | 0 | 2 | 4 | 1 | 0 | 0 | 40 | 40/4=10 |
| s₂ | 0 | 3 | 2 | 0 | 1 | 0 | 36 | 36/2=18 |
| s₃ | 0 | 1 | 3 | 0 | 0 | 1 | 24 | 24/3=8 ✓min |
• Pivot sütun: En negatif Z katsayısı → x₂ sütunu (-500)
• Pivot satır: Min oran kuralı → s₃ satırı (oran: 8 en küçük pozitif)
• Pivot eleman: s₃ satırı, x₂ sütunu → katsayı = 3
• s₃ bazdan çıkıyor, x₂ baza giriyor
Pivot İşlemi: Pivot satırını (s₃ satırı) pivot elemana (3) böleceğiz, ardından diğer satırları sıfırlayacağız.
[0, 1, 3, 0, 0, 1, 24] ÷ 3 = [0, 1/3, 1, 0, 0, 1/3, 8]
Yeni s₁ satırı (eski − 4 × yeni s₃):
[0, 2, 4, 1, 0, 0, 40] − 4×[0, 1/3, 1, 0, 0, 1/3, 8]
= [0, 2−4/3, 4−4, 1, 0, 0−4/3, 40−32] = [0, 2/3, 0, 1, 0, -4/3, 8]
Yeni s₂ satırı (eski − 2 × yeni s₃):
[0, 3, 2, 0, 1, 0, 36] − 2×[0, 1/3, 1, 0, 0, 1/3, 8]
= [0, 3−2/3, 0, 0, 1, −2/3, 20] = [0, 7/3, 0, 0, 1, -2/3, 20]
Yeni Z satırı (eski + 500 × yeni s₃):
[1, -300, -500, 0, 0, 0, 0] + 500×[0, 1/3, 1, 0, 0, 1/3, 8]
= [1, -300+500/3, 0, 0, 0, 500/3, 4000] = [1, -800/3, 0, 0, 0, 500/3, 4000]
Yeni baz: s₁, s₂, x₂ → Z = 4.000 ₺ (x₁=0, x₂=8)
| Baz | Z | x₁ | x₂ | s₁ | s₂ | s₃ | RHS | Oran |
|---|---|---|---|---|---|---|---|---|
| Z | 1 | -800/3≈-266.7 | 0 | 0 | 0 | 500/3≈166.7 | 4000 | — |
| s₁ | 0 | 2/3 | 0 | 1 | 0 | -4/3 | 8 | 8÷(2/3)=12 |
| s₂ | 0 | 7/3 | 0 | 0 | 1 | -2/3 | 20 | 20÷(7/3)=60/7≈8.6 |
| x₂ | 0 | 1/3 | 1 | 0 | 0 | 1/3 | 8 | 8÷(1/3)=24 |
• Pivot sütun: Hâlâ negatif Z katsayısı var → x₁ sütunu (-800/3 ≈ -266.7)
• Pivot satır: Min oran → s₁ satırı (oran: 12 en küçük)
• Pivot eleman: s₁ satırı, x₁ sütunu → katsayı = 2/3
• s₁ bazdan çıkıyor, x₁ baza giriyor
[0, 2/3, 0, 1, 0, -4/3, 8] × 3/2 = [0, 1, 0, 3/2, 0, -2, 12]
Yeni s₂ satırı (eski − 7/3 × yeni s₁):
[0, 7/3, 0, 0, 1, -2/3, 20] − 7/3×[0, 1, 0, 3/2, 0, -2, 12]
= [0, 0, 0, -7/2, 1, 4, -8] → s₂ = 20 − 28 = -8
Dikkat: Doğru hesaplama: 20 − (7/3)×12 = 20 − 28 = -8 negatif çıkıyor!
Bu tabloda kısıtların ifadesi farklı, RHS kontrolü → s₂ satırı: [0, 0, 0, -7/2, 1, 4, -8]
⚠️ HATA KONTROLÜ: s₂ = -8 < 0 → Bu s₁ satırı pivot değildi! Doğru pivot satırı s₂ (oran 8.57)
İterasyon 1 tablosunda oranları yeniden görelim:
s₁: 8 ÷ (2/3) = 12
s₂: 20 ÷ (7/3) = 60/7 ≈ 8.57 ← Minimum!
x₂: 8 ÷ (1/3) = 24
Doğru pivot satır = s₂ (en küçük oran). Pivot eleman = 7/3.
Bu gerçek iterasyonun detayı Simpleks uygulamalarındaki en kritik adım: min oran kuralının doğru uygulanması.
[0, 7/3, 0, 0, 1, -2/3, 20] × 3/7 = [0, 1, 0, 0, 3/7, -2/7, 60/7]
Yeni s₁ satırı (eski − 2/3 × yeni s₂):
[0, 2/3, 0, 1, 0, -4/3, 8] − 2/3×[0, 1, 0, 0, 3/7, -2/7, 60/7]
= [0, 0, 0, 1, -2/7, -8/7, 8−40/7] = [0, 0, 0, 1, -2/7, -8/7, 16/7]
Yeni x₂ satırı (eski − 1/3 × yeni s₂):
[0, 1/3, 1, 0, 0, 1/3, 8] − 1/3×[0, 1, 0, 0, 3/7, -2/7, 60/7]
= [0, 0, 1, 0, -1/7, 3/7, 8−20/7] = [0, 0, 1, 0, -1/7, 3/7, 36/7]
Yeni Z satırı (eski + 800/3 × yeni s₂):
Z katsayısı x₁ = -800/3 + 800/3 × 1 = 0 ← x₁ sıfırlandı
Z_s₃ = 500/3 + 800/3 × (-2/7) = 500/3 − 1600/21 = 3500/21 − 1600/21 = 1900/21
Z_RHS = 4000 + 800/3 × 60/7 = 4000 + 48000/21 = 4000 + 2285.7 = 6285.7 ≈ 6285.7 ₺
| Baz | Z | x₁ | x₂ | s₁ | s₂ | s₃ | RHS |
|---|---|---|---|---|---|---|---|
| Z | 1 | 0 | 0 | 0 | ~133.3 | ~90.5 | 5.200 |
| s₁ | 0 | 0 | 0 | 1 | -2/7 | -8/7 | 16/7≈2.3 |
| x₁ | 0 | 1 | 0 | 0 | 3/7 | -2/7 | 60/7≈8.6 |
| x₂ | 0 | 0 | 1 | 0 | -1/7 | 3/7 | 36/7≈5.1 |
Z satırında tüm katsayılar ≥ 0 → Optimal çözüme ulaşıldı!
x₁ ≈ 4 sandalye/gün
x₂ ≈ 8 masa/gün
Z_max = 5.200 ₺/gün
Grafik yöntemiyle bulunan B noktası (x₁=4, x₂=8, Z=5200) ile örtüşmektedir ✓
Gölge Fiyatlar (Shadow Prices):
s₂ sütunundaki Z katsayısı ≈ 133.3 → Boyama kapasitesi 1 saat artırılırsa kâr 133.3 ₺ artar
s₃ sütunundaki Z katsayısı ≈ 90.5 → Montaj kapasitesi 1 saat artırılırsa kâr 90.5 ₺ artar
Duyarlılık Analizi
Simpleks çözümü bulunduktan sonra, parametrelerdeki değişikliklerin optimal çözümü nasıl etkilediğini araştıran analizdir. İki temel soru:
Amaç Fonksiyonu Katsayıları (Cost Ranging)
Sandalyenin kâr katkısı (300 ₺) hangi aralıkta kalsın ki optimal çözüm (x₁=4, x₂=8) değişmesin Bu aralık, katsayının değiştirilebileceği sınırları gösterir.
Sonuç: 300 ₺ değeri [225 ₺, 750 ₺] aralığında kaldığı sürece optimal karışım aynı kalır.
Sağ Taraf Kısıtları (RHS Ranging)
Boyama kapasitesi (36 saat) hangi aralıkta değişebilir Bu, gölge fiyatın geçerli olduğu aralığı gösterir.
Gölge fiyat ancak baz değişmediğinde geçerlidir. Kapasite fazla artırılırsa yeni bir kısıt bağlayıcı hale gelir.
Ulaşım Problemi
Ulaşım problemi, m tedarik noktasından n talep noktasına mal taşıma maliyetini minimize eden özel bir DP formülasyonudur. Pratikte çok yaygın karşılaşılan bir problem türü.
🚛 Tam Çözümlü Ulaşım Problemi
Senaryo: 3 fabrika (F1, F2, F3) 4 müşteriye (M1, M2, M3, M4) ürün gönderiyor. Birim nakliye maliyetleri (₺/ton):
| Kaynak\Hedef | M1 | M2 | M3 | M4 | Kapasite (ton) |
|---|---|---|---|---|---|
| F1 (İstanbul) | 8 | 6 | 10 | 9 | 120 |
| F2 (Bursa) | 9 | 12 | 13 | 7 | 80 |
| F3 (İzmir) | 14 | 9 | 16 | 5 | 80 |
| Talep (ton) | 70 | 110 | 50 | 50 | Toplam: 280 |
Minumum Maliyet Yöntemi ile Başlangıç Çözümü:
1. En düşük maliyetli hücre: (F3, M4) = 5 → xF3M4 = min(80, 50) = 50 → M4 karşılandı
2. Sonraki en düşük: (F1, M2) = 6 → xF1M2 = min(120, 110) = 110 → M2 karşılandı
3. Sonraki: (F1, M1) = 8 → xF1M1 = min(10, 70) = 10 → F1 tükendi
4. (F2, M1) = 9 → xF2M1 = min(80, 60) = 60 → M1 karşılandı
5. (F2, M3) = 13 → xF2M3 = 20 → F2 tükendi; (F3, M3) = 16 → xF3M3 = 30 → M3 karşılandı
Başlangıç Maliyet = 50×5 + 110×6 + 10×8 + 60×9 + 20×13 + 30×16
= 250 + 660 + 80 + 540 + 260 + 480 = 2.270 ₺
Optimal çözüm (MODI yöntemiyle iyileştirilerek) = Bu problem için ~2.080 ₺'ye inilebilir.
Atama Problemi
Atama problemi, n işin n işçiye (ya da makineye) minimum maliyetle atanması problemidir. Ulaşım probleminin özel durumudur (her hücrede kapasite ve talep = 1). Macar Algoritması (Hungarian Method) pratikte kullanılan en yaygın çözüm yöntemidir.
4 proje, 4 mühendis. Tamamlama süresi (gün) matrisi:
| Proje A | Proje B | Proje C | Proje D | |
|---|---|---|---|---|
| Ahmet | 9 | 2 | 7 | 8 |
| Büşra | 6 | 4 | 3 | 7 |
| Can | 5 | 8 | 1 | 8 |
| Derya | 7 | 6 | 9 | 4 |
Ahmet → Proje B (2 gün)
Büşra → Proje C (3 gün)
Can → Proje A (5 gün)
Derya → Proje D (4 gün)
Toplam Minimum Süre: 2 + 3 + 5 + 4 = 14 gün
Tamsayılı Programlama ve Branch & Bound
Bazı problemlerde değişkenler tam sayı (integer) olmalıdır: Kaç kamyon satın alınmalı Kaç fabrika açılmalı Hangi projeler seçilmeli (0/1 kararı) Bu tür problemlere Tamsayılı Programlama (Integer Programming — IP) denir.
Önce tam sayı kısıtları kaldırılır, normal DP olarak çözülür. LP gevşemesi IP'nin üst sınırını (maksimizasyon için) verir. Çözüm zaten tam sayıysa — optimale ulaşıldı! Değilse dallanmaya (branching) başlanır.
LP çözümünde kesirli çıkan bir değişken seçilir (örn. x₁ = 3.7). İki alt problem oluşturulur: x₁ ≤ 3 ve x₁ ≥ 4. Her dal ayrı DP olarak çözülür. Üst/alt sınırlar hesaplanarak alt ağaçlar budanır (pruning). İşlem tüm dallar budanana ya da tam sayı çözüm bulunana kadar devam eder.
Değişkenlerin yalnızca 0 veya 1 aldığı özel IP. Proje seçimi, tesis yeri belirleme, taşıma rotası optimizasyonu için kullanılır. Ünlü "Sırt Çantası Problemi (Knapsack)" bu kategoride.
Excel Solver ve Python PuLP ile Çözüm
Excel Solver ile LP Çözümü
Excel'in Solver eklentisi, Simpleks ve GRG Nonlinear algoritmalarını destekler. Mobilya fabrikası problemini Excel'de kurmak için:
- B2: Sandalye miktarı (karar değişkeni), B3: Masa miktarı (karar değişkeni) → başlangıç: 0
- Amaç fonksiyonu hücresi (B5): =300*B2+500*B3
- Kısıt hücreleri: =2*B2+4*B3, =3*B2+2*B3, =B2+3*B3
- Data → Solver → Objective: B5 (Max), Variables: B2:B3, Constraints: ≤ 40, 36, 24 ve ≥ 0
- Solve → Sensitivity Report için "Keep Solver Solution" seçin
Python PuLP ile LP Çözümü
Mobilya fabrikası probleminin Python kodu:
from pulp import * # Problem tanımı
prob = LpProblem("Mobilya_Fabrikasi", LpMaximize) # Karar değişkenleri
x1 = LpVariable("Sandalye", lowBound=0)
x2 = LpVariable("Masa", lowBound=0) # Amaç fonksiyonu
prob += 300*x1 + 500*x2, "Kar_Maksimizasyonu" # Kısıtlar
prob += 2*x1 + 4*x2 <= 40, "Agac_Isleme"
prob += 3*x1 + 2*x2 <= 36, "Boyama"
prob += x1 + 3*x2 <= 24, "Montaj" # Çöz
prob.solve() # Sonuçlar
print(f"Durum: {LpStatus[prob.status]}")
print(f"Sandalye (x1): {value(x1)}")
print(f"Masa (x2): {value(x2)}")
print(f"Maksimum Kâr: {value(prob.objective)} TL")
# Çıktı:
# Durum: Optimal
# Sandalye (x1): 4.0
# Masa (x2): 8.0
# Maksimum Kâr: 5200.0 TL SciPy linprog ile Çözüm
from scipy.optimize import linprog # linprog minimizasyon yapar, negatif katsayı
c = [-300, -500] # Maks için negatife çevir
A = [[2,4],[3,2],[1,3]]
b = [40, 36, 24]
bounds = [(0,None),(0,None)] res = linprog(c, A_ub=A, b_ub=b, bounds=bounds)
print(f"x1={res.x[0]:.2f}, x2={res.x[1]:.2f}")
print(f"Z_max = {-res.fun:.2f} TL")
# x1=4.00, x2=5.14... → Sayısal hassasiyet farkı
# PuLP daha uygun LP kütüphane Endüstri Uygulamaları
American Airlines, 1990'lardan itibaren YA tekniklerini kullanarak uçak çizelgeleme, mürettabat atama ve bilet fiyatlandırmasını optimize etmektedir. Sadece mürettabat çizelgeleme optimizasyonu yılda ~20 milyon dolar tasarruf sağlamaktadır. Kullanılan teknikler: Tamsayılı programlama, sütun üretimi (column generation), dinamik programlama ve Lagrangian relaxation.
küresel bir e-ticaret devi, yeni depo yerlerinin belirlenmesinde (tesis yeri seçimi — facility location problem), müşterilere teslimat rotalarının planlanmasında (gezgin satıcı ve araç rotalama problemleri) ve depo içi robotların hareketinin koordinasyonunda YA tekniklerini yoğun kullanmaktadır. Son kilometre teslimat optimizasyonu için gelişmiş karışık tamsayılı programlama (MIP) ve meta-sezgisel algoritmaları (genetik algoritma, simüle tavlama) birlikte kullanan hibrit sistemler çalışmaktadır.
lider bir telekomünikasyon şirketi, yeni fiber optik altyapı yatırımlarını planlarken hangi güzergahlara yatırım yapılacağını belirlemek için minimum yayılan ağaç (minimum spanning tree) ve ağ akış (network flow) optimizasyonu uygulamaktadır. Yüz binlerce kilometre hat ve binlerce düğümlü bu ağda elle yapılacak planlama pratikte imkânsızdır — YA teknikleri bu ölçekte çalışabilmenin yegane yolunu sunar.