Bölüm 14: Dal Sınır Algoritmaları
Giriş
Öğrenme Çıktıları
Dal sınır yönteminin durum uzayı ağacı, dallanma, sınırlama ve budama adımlarını açıklamak; geri izlemeden farkını söylemek.
En büyükleme için üst, en küçükleme için alt sınır kurmak; sınırın geçerli (iyimser) olmasının neden şart olduğunu gerekçelendirmek.
FIFO, LIFO ve en düşük maliyet (en iyi önce) stratejilerini aynı örnekte izlemek; bellek ve düğüm sayısı açısından karşılaştırmak.
0/1 sırt çantası, gezgin satıcı, tamsayılı doğrusal programlama ve maksimum klik problemlerini dal sınır ile adım adım çözmek.
Giriş
En İyi Seçenekleri Ele Almak
- Karmaşık problemleri çözmek, bazen bir yol ayrımında doğru seçeneği bulmaya benzer.
- Dal sınır (branch and bound) algoritmaları bu problemler için akıllı bir yaklaşım sunar: olası çözüm yollarını inceleyerek en iyi seçeneği bulmaya çalışır.
- Hedef: kombinatoryal optimizasyon problemlerinde kesin (optimal) çözüm. Tüm adayları denemek ise üstel ya da faktöriyel sürer.
- Fikir: bir dalın en fazla ne kadar iyi olabileceğini önceden tahmin et; yeterince iyi değilse o dala hiç girme.
| n | 2ⁿ alt küme | (n−1)! tur |
|---|---|---|
| 5 | 32 | 24 |
| 10 | 1 024 | 362 880 |
| 20 | 1 048 576 | ≈ 1,2 · 10¹⁷ |
| 40 | ≈ 1,1 · 10¹² | ≈ 2,0 · 10⁴⁶ |
Sırt çantası 2ⁿ alt kümeyi, gezgin satıcı (n−1)! turu dener: kaba kuvvet hızla imkânsızlaşır.
Giriş
Dal Sınır Algoritmaları
- Dallanıp budanan bir ağaç gibi düşünülebilir.
- Önce problem daha küçük alt problemlere ayrılır (dallanma, branching).
- Her alt problem için ulaşılabilecek en iyi değer tahmin edilir (sınır, bound).
- Sınırı, o ana kadar bulunan en iyi çözümden daha iyi olmayan olasılıklar elenir (budama, pruning).
- İşlem kalan tüm alt problemler için tekrarlanır; gereksiz dallar budandıkça arama süresi kısalır.
- Gezgin satıcı, sırt çantası, çizelgeleme gibi birçok alanda kullanılır.
Giriş
Temel Kavramlar
Paradigma
Genel Şema (En Büyükleme)
int enIyi = -∞; kuyruk.ekle(kök); while (!kuyruk.bosMu()) { Dugum u = kuyruk.cikar(); // strateji if (sinir(u) <= enIyi) continue; for (Dugum c : u.cocuklar()) { if (!olurluMu(c)) continue; if (tamCozumMu(c) && deger(c) > enIyi) enIyi = deger(c); // yeni aday if (sinir(c) > enIyi) kuyruk.ekle(c); // canlı düğüm } } return enIyi;
- Seç: kuyruktan bir canlı düğüm çıkar. Hangisinin çıkacağını strateji belirler (FIFO, LIFO, en iyi sınır).
- Tekrar sına: düğüm beklerken enİyi büyümüş olabilir; sınırı artık yetersizse at.
- Dallan: çocukları üret; olursuzları ele.
- Güncelle: tam çözüm daha iyiyse enİyi'yi yükselt.
- Sınırla: yalnızca sınırı enİyi'yi geçebilen çocukları kuyruğa koy.
En küçüklemede yönler ters çevrilir: alt sınır kullanılır, alt(c) ≥ enIyi ise budanır.
Paradigma
Sınır (Bound) Nasıl Seçilir?
Paradigma
Bir Düğüm Ne Zaman Budanır?
Geri izleme yalnızca 1. kuralı (ve tamlığı) kullanır. Dal sınırı ondan ayıran şey 2. kuraldır: düğüm geçerli olsa bile "yeterince iyi değilse" kesilir.
Paradigma
Arama Stratejileri: Sıradaki Canlı Düğüm Hangisi?
| Strateji | Kuyruk | Nasıl gezer? | Artı / eksi |
|---|---|---|---|
| FIFO dal sınır | kuyruk (ArrayDeque) | seviye seviye, genişlik öncelikli (BFS) | sığ çözümleri erken bulur; canlı düğüm sayısı üstel büyüyebilir |
| LIFO dal sınır | yığın (ya da özyineleme) | derinlik öncelikli (DFS) | bellek O(derinlik); erken bir tam çözüm enİyi'yi hızla yükseltir |
| En düşük maliyet (LC, en iyi önce) | öncelikli kuyruk (PriorityQueue) | sınırı en umut verici düğüm önce | genellikle en az düğümü genişletir; kuyruk bellek tüketir, her işlem O(log k) |
- Üç strateji de aynı optimumu bulur; değişen, üretilen düğüm sayısı ve bellektir.
- LC aramada maliyet fonksiyonu ĉ(u) = sınır değeri (ya da f(u) + ĝ(u) tahmini) olur; A* araması bu fikrin yol bulmadaki karşılığıdır.
Paradigma
Geri İzleme ve Dal Sınır
| Özellik | Geri izleme (Bölüm 13) | Dal sınır |
|---|---|---|
| Problem türü | karar / arama: bir ya da tüm geçerli çözümler (N-vezir, Sudoku) | optimizasyon: en iyi çözüm (en büyük kazanç, en kısa tur) |
| Budama ölçütü | olurluluk: kısıt ihlal ediliyor mu? | olurluluk + sınır: enİyi'yi geçebilir mi? |
| Gezinme | her zaman DFS (özyineleme) | DFS, BFS ya da en iyi önce |
| Ek bilgi | yalnızca kısmi çözüm | kısmi çözüm + sınır fonksiyonu + enİyi |
| Bellek | O(derinlik) | DFS'te O(derinlik); BFS/LC'de kuyruk boyu kadar |
| En kötü durum | üstel | yine üstel; pratikte çok daha az düğüm |
Sınır testi olmayan bir TSP ya da maksimum klik araması aslında geri izlemedir; tek bir sınır satırı eklenince dal sınıra dönüşür (ilerideki slaytlar).
Paradigma
Avantajlar ve Dezavantajlar
Avantajlar
- Karmaşık optimizasyon problemlerinde kesin en iyi çözümü bulur.
- Arama alanını daraltır, gereksiz olasılıkları eler.
- En iyi rotayı ya da seçimi bulmayı gerektiren problemlerde idealdir.
- Çözümleri ağaç olarak temsil edilebilen çok çeşitli problemlere uygulanır.
- Erken durdurulursa elde iyi bir çözüm ve onun sınırı (kalite garantisi) bulunur.
Dezavantajlar
- Çok fazla olasılık içeren durumlarda çözüm süresi artabilir: en kötü durumda üstel zaman.
- FIFO ve en iyi önce stratejilerinde bellek de üstel büyüyebilir.
- Başarı, iyi bir sınır tahminine bağlıdır; zayıf sınır neredeyse hiç budamaz.
- Probleme özgü sınır ve dallanma kuralı tasarlamak gerekir; uygulaması geri izlemeden karmaşıktır.
0/1 Sırt Çantası
Örnek: 0/1 Sırt Çantası Problemi
- n eşya: kazanç pᵢ, ağırlık wᵢ; kapasite W. Her eşya ya alınır ya alınmaz (xᵢ ∈ {0, 1}).
- Amaç: Σ wᵢxᵢ ≤ W koşuluyla Σ pᵢxᵢ'yi en büyüklemek.
- Eşyalar pᵢ/wᵢ oranına göre azalan sırada dizilir; sınır hesabı bu sırayı kullanır.
- Durum uzayı ağacı ikilidir: i. seviyede sol dal "eşya i alındı" (1), sağ dal "alınmadı" (0). Tam ağaç 2⁵ − 1 = 31 düğüm.
| Eşya | pᵢ | wᵢ | pᵢ/wᵢ |
|---|---|---|---|
| 1 | 40 | 2 | 20 |
| 2 | 30 | 5 | 6 |
| 3 | 50 | 10 | 5 |
| 4 | 10 | 5 | 2 |
Kapasite W = 16.
0/1 Sırt Çantası
Üst Sınır: Kesirli Sırt Çantası Gevşetmesi
- Gevşetme: "eşya bölünemez" kısıtını kaldır. Kesirli sırt çantasını açgözlü yöntem (Bölüm 12) en iyi şekilde çözer.
- u düğümünde (kazanç k, ağırlık a, seviye i): kalan eşyaları oran sırasıyla, sığdığı kadar tam ekle; ilk sığmayan eşyanın kesirli parçasını ekle:
0/1 Sırt Çantası · Kodu adım adım çalıştır
sinir(kök): Kodu Adım Adım İzle
double sinir(Dugum u) { if (u.agirlik > W) return 0; // olursuz double sonuc = u.kazanc; int toplamAg = u.agirlik; int j = u.seviye + 1; while (j < n && toplamAg + w[j] <= W) { toplamAg += w[j]; sonuc += p[j]; j++; } if (j < n) // kesirli parça sonuc += (W - toplamAg) * (double) p[j] / w[j]; return sonuc; }
Kök düğüm: seviye −1, kazanç 0, ağırlık 0. 0 ≤ 16 olduğundan düğüm olurlu.
Sınır mevcut kazançtan başlar; j bir sonraki eşyayı gösterir (indis 0 = eşya 1).
0 + w[0] = 2 ≤ 16 → eşya 1 tamamen sığar.
toplamAg = 2, sonuc = 40, j = 1.
2 + w[1] = 7 ≤ 16 → eşya 2 de tamamen sığar.
toplamAg = 7, sonuc = 70, j = 2.
7 + w[2] = 17 > 16 → eşya 3 tamamen sığmaz, döngü biter.
Kalan kapasite 9: eşya 3’ün 9/10’u → 9 · 50/10 = 45 eklenir, sonuc = 115.
sinir(A) = 115: bu düğümün altındaki hiçbir çözüm 115’ten fazla kazandıramaz.
0/1 Sırt Çantası · Adım adım
En İyi Önce (LC) Dal Sınır: Durum Uzayı Ağacı
Kök A: hiçbir eşya seçilmedi (kazanç 0, ağırlık 0). Kesirli sınır s = 115; enİyi = 0. Kuyruk: A (115).
A çıkarıldı (en büyük sınır) ve dallandı. B (eşya 1 alındı): enİyi = 40, s = 115 → kuyruğa. C (eşya 1 yok): s = 82 → kuyruğa. Kuyruk: B (115), C (82).
B çıkarıldı (en büyük sınır) ve dallandı. D (eşya 2 alındı): enİyi = 70, s = 115 → kuyruğa. E (eşya 2 yok): s = 98 → kuyruğa. Kuyruk: D (115), E (98), C (82).
D çıkarıldı (en büyük sınır) ve dallandı. F (eşya 3 alındı): ağırlık 17 > 16 → olursuz. G (eşya 3 yok): s = 80 → kuyruğa. Kuyruk: E (98), C (82), G (80).
E çıkarıldı (en büyük sınır) ve dallandı. H (eşya 3 alındı): enİyi = 90, s = 98 → kuyruğa. I (eşya 3 yok): s = 50 ≤ 90 → budandı. Kuyruk: H (98), C (82), G (80).
H çıkarıldı (en büyük sınır) ve dallandı. J (eşya 4 alındı): ağırlık 17 > 16 → olursuz. K (eşya 4 yok): s = 90 ≤ 90 → budandı. Kuyruk: C (82), G (80).
C çıkarıldı: s = 82 ≤ enİyi = 90 → budandı. G çıkarıldı: s = 80 ≤ enİyi = 90 → budandı. Kuyruk boş: en iyi kazanç 90 (H: eşya 1 ve 3). Tam ağacın 31 düğümünden yalnızca 11’i üretildi.
0/1 Sırt Çantası
En İyi Önce Dal Sınır: Java
int dalSinir() { PriorityQueue<Dugum> kuyruk = new PriorityQueue<>( (a, b) -> Double.compare(b.sinir, a.sinir)); Dugum kok = new Dugum(-1, 0, 0); kok.sinir = sinir(kok); kuyruk.add(kok); int enIyi = 0; while (!kuyruk.isEmpty()) { Dugum u = kuyruk.poll(); // en büyük sınır if (u.sinir <= enIyi || u.seviye == n - 1) continue; int i = u.seviye + 1; // sol çocuk: i. eşyayı al Dugum al = new Dugum(i, u.kazanc + p[i], u.agirlik + w[i]); if (al.agirlik <= W && al.kazanc > enIyi) enIyi = al.kazanc; al.sinir = sinir(al); if (al.sinir > enIyi) kuyruk.add(al); // sağ çocuk: i. eşyayı alma Dugum alma = new Dugum(i, u.kazanc, u.agirlik); alma.sinir = sinir(alma); if (alma.sinir > enIyi) kuyruk.add(alma); } return enIyi; }
Dugum: seviye, kazanç, ağırlık, sınır (seçilen eşyalar için birboolean[]ya da bit maskesi eklenebilir).- Karşılaştırıcı ters: en büyük sınır önce çıkar.
pollsonrası test, kuyrukta beklerken eskiyen düğümleri atar (örnekte C ve G).- FIFO için
ArrayDeque+add()/poll(), LIFO içinpush()/pop()yeterlidir; kodun geri kalanı aynıdır. - En kötü durum O(2ⁿ) düğüm, düğüm başına O(n) sınır hesabı.
0/1 Sırt Çantası
Aynı Örnekte Üç Strateji
Numaralar genişletme sırasıdır; küçük daireler üretilip genişletilmeyen düğümler (kırmızı kesikli: budanan), halka: optimum (90).
| Yöntem | Üretilen düğüm | Genişletilen | En büyük kuyruk |
|---|---|---|---|
| Kaba kuvvet (tam ağaç) | 31 | 15 | — |
| FIFO dal sınır | 13 | 6 | 3 |
| LIFO dal sınır (önce "al") | 13 | 6 | 3 |
| En iyi önce (LC) | 11 | 5 | 3 |
Gezgin Satıcı
Gezgin Satıcı Problemi (TSP): Alt Sınır
- Her şehri bir kez ziyaret edip başlangıca dönen en kısa tur (en küçükleme, NP-zor).
- Düğüm = 0'dan başlayan kısmi yol; çocuklar = ziyaret edilmemiş bir sonraki şehir.
- Alt sınır: henüz çıkılmamış her şehirden (bulunulan şehir + ziyaret edilmemişler) en az bir kenarla çıkılmak zorundadır:
| 0 | 1 | 2 | 3 | min | |
|---|---|---|---|---|---|
| 0 | — | 3 | 2 | 15 | 2 |
| 1 | 3 | — | 21 | 5 | 3 |
| 2 | 2 | 21 | — | 8 | 2 |
| 3 | 15 | 5 | 8 | — | 5 |
4 şehirli simetrik uzaklık matrisi d.
Kök: 2 + 3 + 2 + 5 = 12. Yol 0 → 1: 3 + 3 + (2 + 5) = 13. Her gerçek turun maliyeti bu toplamdan küçük olamaz, bu yüzden sınır geçerlidir.
Gezgin Satıcı · Kodu adım adım çalıştır
tsp(0, 0, 1): Sınırlı Derinlik Öncelikli Arama
void tsp(int sehir, int maliyet, int sayac) { if (sayac == n) { // tur tamam int tur = maliyet + d[sehir][0]; if (tur < enIyi) enIyi = tur; return; } for (int s = 0; s < n; s++) { if (ziyaret[s]) continue; int yeni = maliyet + d[sehir][s]; ziyaret[s] = true; if (altSinir(s, yeni) < enIyi) // sınır tsp(s, yeni, sayac + 1); ziyaret[s] = false; // geri al } }
Şehir 0’dan başlanır. Kökün alt sınırı = 2 + 3 + 2 + 5 = 12.
0 → 1: yeni = 0 + 3 = 3; alt = 13 < ∞ → dallan.
1 → 2: yeni = 3 + 21 = 24; alt = 31 < ∞ → dallan.
2 → 3: yeni = 24 + 8 = 32; alt = 37 < ∞ → dallan.
Tur 0 → 1 → 2 → 3 → 0 = 32 + 15 = 47 < ∞ → enİyi = 47.
1 → 3: yeni = 3 + 5 = 8; alt = 15 < 47 → dallan.
3 → 2: yeni = 8 + 8 = 16; alt = 18 < 47 → dallan.
Tur 0 → 1 → 3 → 2 → 0 = 16 + 2 = 18 < 47 → enİyi = 18.
0 → 2: yeni = 0 + 2 = 2; alt = 12 < 18 → dallan.
2 → 1: yeni = 23; alt = 31 ≥ enİyi = 18 → budandı.
2 → 3: yeni = 10; alt = 18 ≥ enİyi = 18 → budandı.
0 → 3: yeni = 15; alt = 25 ≥ enİyi = 18 → budandı.
Bitti: en kısa tur 0 → 1 → 3 → 2 → 0 = 18; 16 yerine 10 düğüm.
Gezgin Satıcı
Daha Büyük Örnek: 6 Şehir
| 0 | 1 | 2 | 3 | 4 | 5 | min | |
|---|---|---|---|---|---|---|---|
| 0 | — | 29 | 20 | 21 | 16 | 31 | 16 |
| 1 | 29 | — | 15 | 29 | 28 | 40 | 15 |
| 2 | 20 | 15 | — | 15 | 14 | 25 | 14 |
| 3 | 21 | 29 | 15 | — | 12 | 18 | 12 |
| 4 | 16 | 28 | 14 | 12 | — | 22 | 12 |
| 5 | 31 | 40 | 25 | 18 | 22 | — | 18 |
- Budamasız geri izleme tüm (n−1)! = 120 turu dener;
altSinirtestiyle aynı sonuç çok daha az düğümle bulunur. - Kök alt sınırı: 16 + 15 + 14 + 12 + 12 + 18 = 87; optimum 115.
- En iyi tur: 0 → 1 → 2 → 3 → 5 → 4 → 0 = 29 + 15 + 15 + 18 + 22 + 16 = 115.
| Sürüm | Üretilen düğüm | tsp çağrısı |
|---|---|---|
| Budamasız (geri izleme) | 326 | 326 |
| En ucuz çıkış sınırı | 210 | 130 |
Diğer Uygulamalar
Tamsayılı Doğrusal Programlama (ILP)
- Doğrusal programın tüm değişkenleri tamsayı olmalı. Dal sınırın en yaygın endüstriyel kullanımı (Land ve Doig, 1960).
- Sınır: tamsayı koşulunu kaldır, LP gevşetmesini çöz. LP optimumu, ILP optimumu için üst sınırdır.
- Dallanma: kesirli bir değişken (y = 1,5) için iki alt problem: y ≤ 1 ve y ≥ 2. Aradaki kesirli bölge atılır, hiçbir tamsayı nokta kaybolmaz.
İkinci örnek: Z = 3x + 2y; x + y ≤ 4, x ≤ 3, y ≤ 2. Kaba kuvvet 0 ≤ x ≤ 3, 0 ≤ y ≤ 2 ızgarasındaki 12 noktanın hepsini dener → (3, 1), Z = 11. Bu örnekte LP gevşetmesi de (3, 1) verir: dal sınır kökte biter.
Diğer Uygulamalar · Adım adım
ILP: LP Gevşetmeleriyle Dallanma
Kök: tamsayı koşulu gevşetilir (LP gevşetmesi). LP optimumu (3; 1,5), Z = 21 → üst sınır. y kesirli → y üzerinde dallan.
Dal y ≤ 1: LP optimumu (3,33; 1), Z = 20,67. x kesirli → x ≤ 3 ve x ≥ 4 dalları açılır.
Dal x ≤ 3: LP çözümü (3; 1) tamsayı → ilk aday çözüm, enİyi = 19.
Dal x ≥ 4: LP çözümü (4; 0) tamsayı, Z = 20 > 19 → enİyi = 20.
Dal y ≥ 2: LP sınırı Z = 18 ≤ 20 → budandı. Optimum: x = 4, y = 0, Z = 20.
Dikkat: LP optimumu (3; 1,5) yuvarlanırsa (3; 1) → Z = 19 ya da (3; 2) → olursuz olur. Gerçek optimum (4; 0) yuvarlamayla bulunamaz.
Diğer Uygulamalar
Maksimum Klik (Maximum Clique)
- Klik: her iki köşesi komşu olan köşe kümesi.
- Sınır: |K| + |aday| ≤ |enİyi| ise mevcut klik ne kadar büyütülse de enİyi'yi geçemez.
void klik(List<Integer> K, int bas) { if (K.size() > enIyi.size()) enIyi = new ArrayList<>(K); List<Integer> aday = new ArrayList<>(); for (int v = bas; v < n; v++) if (uygun(v, K)) aday.add(v); // K'ye komşu if (K.size() + aday.size() <= enIyi.size()) return; // sınır for (int v : aday) { K.add(v); klik(K, v + 1); K.remove(K.size() - 1); // geri al } }
| Sürüm | klik çağrısı |
|---|---|
| Sınırsız geri izleme | 36 |
| |K| + |aday| sınırıyla | 17 |
Diğer Uygulamalar
Dal Sınırla Çözülen Diğer Problemler
Not: Maksimum akış gibi polinom zamanlı algoritması olan (Bölüm 4) problemlerde dal sınıra gerek yoktur; yöntem NP-zor problemler için anlamlıdır.
Özet
Özet
| Konu | Hatırlanacaklar |
|---|---|
| Paradigma | durum uzayı ağacı; seç → dallan → sınırla → buda; enİyi en iyi tam çözümü tutar |
| Sınır | geçerli (iyimser), sıkı, ucuz; gevşetme ile kurulur. En büyüklemede üst, en küçüklemede alt sınır |
| Budama | olursuzluk, sınır ≤ enİyi (ya da alt ≥ enİyi), tam çözüm / tamsayı LP |
| Stratejiler | FIFO (BFS, kuyruk), LIFO (DFS, yığın, az bellek), LC / en iyi önce (öncelikli kuyruk, az düğüm) |
| Sırt çantası | kesirli sırt çantası üst sınırı; örnekte sınır(kök) = 115, optimum 90; 31 yerine 11 düğüm |
| TSP | alt sınır = maliyet + çıkılmamış şehirlerin en ucuz çıkış kenarları; 4 şehirde 16 → 10 düğüm |
| ILP / klik | LP gevşetmesi + kesirli değişkende dallanma; klikte |K| + |aday| ≤ |enİyi| sınırı |
| Karmaşıklık | en kötü durumda üstel; pratik başarı sınırın kalitesine bağlı |
Özet
Etkileşimli Simülatörler
Özet
Sık Yapılan Hatalar
Özet
Örnek Problemler
Sırt çantası: (p, w) = (20, 2), (30, 5), (35, 7), (12, 3); W = 9 (oranlar 10, 6, 5, 4).
- Kökün kesirli üst sınırını hesaplayın.
- Oranla açgözlü seçim ve optimum kazanç nedir?
- "Eşya 1 alınmadı" düğümünün (0, 0) sınırı nedir? Optimum bulunduktan sonra budanır mı?
- 4 şehirli TSP örneğinde 0 → 3 → 1 yolunun alt sınırı nedir?
- Maksimum klikte K = {3, 4}, aday = {5}, |enİyi| = 5 iken ne olur?
- Belleği çok kısıtlı bir sistemde hangi arama stratejisini seçersiniz?
Cevapları göster
- 20 + 30 = 50 (ağırlık 7); kalan 2 birim eşya 3'ten: 2 · 35/7 = 10 → 60.
- Açgözlü 1 ve 2'yi alır (ağırlık 7), 3 ve 4 sığmaz → 50. Optimum 1 ve 3: 55 (ağırlık 9).
- Eşya 2 tam sığar: 30 (ağırlık 5); eşya 3 sığmaz, kalan 4 birim: 4 · 35/7 = 20 → 50. 50 ≤ 55 → budanır.
- maliyet 15 + 5 = 20; + enKucuk[1] = 3 + enKucuk[2] = 2 → 25 (≥ 18, budanır).
- 2 + 1 = 3 ≤ 5 → budanır; bu daldan 5'ten büyük klik çıkamaz.
- LIFO (DFS): yalnızca geçerli yolun kardeş düğümleri tutulur; bellek O(derinlik · dallanma).
Özet
Alıştırmalar
- Sırt çantası kodunu FIFO kuyrukla yazın; bölümdeki örnekte kaç düğüm üretilir?
tspmetoduna en iyi turu kaydedenint[] enIyiYolekleyin.- 4 şehirli örneğin kökünde "iki en kısa kenar toplamının yarısı" sınırını hesaplayın.
- Maliyet matrisi [[9, 2, 7], [6, 4, 3], [5, 8, 1]] olan atama probleminin kök alt sınırı ve optimumu nedir?
- Kesirli sırt çantası sınırının her zaman geçerli olduğunu kanıtlayın.
- İkinci ILP örneği (Z = 3x + 2y; x + y ≤ 4, x ≤ 3, y ≤ 2) LP gevşetmeli dal sınırla kaç düğümde çözülür?
Cevaplar / ipuçları
ArrayDeque+poll(): 13 düğüm, 6 genişletme; sonuç yine 90.- Döngüde
yol[sayac] = s; tur < enIyi iseenIyiYol = yol.clone(). - (2+3) + (3+5) + (2+8) + (5+8) = 36 → 36/2 = 18: optimuma eşit.
- Satır en küçükleri 2 + 3 + 1 = 6; optimum 2 + 6 + 1 = 9.
- Her 0/1 çözüm kesirli bir çözümdür; açgözlü kesirli optimumu verir, o da ≥ 0/1 optimum.
- Tek düğüm: LP gevşetmesi zaten tamsayı (3, 1), Z = 11.
Özet
Kaynaklar
- E. Horowitz, S. Sahni ve S. Rajasekaran, Computer Algorithms, 2. baskı, Silicon Press, 2008 (Bölüm 8: Branch-and-Bound).
- R. Neapolitan, Foundations of Algorithms, 5. baskı, Jones & Bartlett, 2015 (Bölüm 6).
- A. Levitin, Introduction to the Design and Analysis of Algorithms, 3. baskı, Pearson, 2012 (Bölüm 12.2).
- A. H. Land ve A. G. Doig, "An Automatic Method of Solving Discrete Programming Problems", Econometrica 28(3), 1960.
- J. D. C. Little, K. G. Murty, D. W. Sweeney ve C. Karel, "An Algorithm for the Traveling Salesman Problem", Operations Research 11(6), 1963.
- R. Carraghan ve P. M. Pardalos, "An Exact Algorithm for the Maximum Clique Problem", Operations Research Letters 9(6), 1990.