Bölüm 14: Dal Sınır Algoritmaları

Bölüm 14: Dal Sınır Algoritmaları · Çalışma Soruları
Dallanma, sınırlama, budamaGeçerli sınırFIFO, LIFO, en iyi önce0/1 sırt çantasıGezgin satıcıAtama problemiTam sayılı programlamaMaksimum klik
Sercan KÜLCÜ

Çoktan Seçmeli · Paradigma

Soru 1: Dal Sınırın Farkı

Dal sınır yöntemini geri izlemeden ayıran budama kuralı hangisidir (en büyükleme)?

B: Geri izleme yalnızca olursuzluk ve tamlık kurallarını kullanır. Dal sınır, düğüm geçerli olsa bile sinir(u) ≤ enİyi ise onu keser: altındaki hiçbir çözüm en iyiyi geçemez. Sınır testi olmayan bir TSP ya da klik araması aslında geri izlemedir.

Çoktan Seçmeli · Paradigma

Soru 2: Canlı ve Ölü Düğüm

Dal sınır terminolojisinde canlı düğüm hangisidir?

D: Canlı düğümler kuyruk yapısında genişletilmeyi bekler. Genişletilen düğüm E-düğümdür (A); genişletilmiş, olursuz ya da sınırı yetersiz olduğu için budanmış düğüm ölü düğümdür (B). C ise enİyi (incumbent) çözümdür.

Çoktan Seçmeli · Sınır

Soru 3: Geçerli Sınır

En büyükleme probleminde u düğümü için hesaplanan sinir(u) değerinin geçerli olması ne demektir ve geçerli olmazsa ne olur?

C: Sınır iyimser olmalıdır: alt ağaçtaki hiçbir çözüm onu geçemez. Sınır gerçek değerin altında kalırsa optimumu içeren dal "yeterince iyi değil" diye budanabilir ve sonuç yanlış olur. Sınırın sıkı ve ucuz olması ise verimlilikle ilgilidir; gerçek optimuma eşit olması gerekmez (o zaman problem zaten çözülmüş olurdu).

Çoktan Seçmeli · Sınır

Soru 4: En Küçüklemede Budama

Gezgin satıcı gibi bir en küçükleme probleminde u düğümü ne zaman sınır nedeniyle budanır?

A: En küçüklemede sınır bir alt sınırdır: u'nun altındaki her tur en az alt(u) tutar. alt(u) ≥ enİyi ise bu daldan daha kısa bir tur çıkamaz. B yönleri karıştırır ve optimumu kaçırır; en büyüklemede ise sinir(u) ≤ enİyi olunca budanır.

Çoktan Seçmeli · Sınır

Soru 5: Kötümser Sınır

Bir öğrenci sırt çantası için sınırı "kalan eşyalardan tamamen sığanların kazancını ekle, kesirli parçayı ekleme" diye hesaplıyor. Bu sınır için hangisi doğrudur?

D: Bu değer açgözlü bir 0/1 çözümün kazancıdır, yani bir alt sınırdır: gerçek optimumun altında kalabilir. (p, w) = (20, 2), (30, 5), (35, 7), (12, 3), W = 9 örneğinde kökte 20 + 30 = 50 verir ama optimum 55'tir; enİyi 50 iken bu "sınır" optimumun dalını keser. Üst sınır, kesirli gevşetme gibi iyimser bir değer olmalıdır.

Klasik Soru · Sınır

Soru 6: Kesirli Sınırın Geçerliliği

Kesirli sırt çantası sınırının (eşyalar p/w oranına göre azalan sırada) 0/1 sırt çantası için her zaman geçerli bir üst sınır olduğunu gösterin. Eşyalar oran sırasında değilse ne olur?

Cevabı göster
  1. Her 0/1 çözüm, kesirleri yalnızca 0 ya da 1 olan bir kesirli çözümdür: 0/1 çözüm kümesi, kesirli çözüm kümesinin alt kümesidir.
  2. Daha geniş kümede en büyük değer daha küçük olamaz: kesirli optimum ≥ 0/1 optimum (gevşetme).
  3. Açgözlü yöntem (oran sırasıyla doldur, son eşyayı böl) kesirli problemi en iyi şekilde çözer; dolayısıyla hesaplanan değer kesirli optimumdur ve hiçbir 0/1 çözüm onu geçemez.

Eşyalar oran sırasında değilse açgözlü doldurma kesirli optimumu bulmaz; elde edilen değer kesirli optimumdan küçük ve hatta 0/1 optimumdan bile küçük olabilir. O zaman "sınır" geçersiz olur ve optimum budanabilir. Bu yüzden eşyalar en başta bir kez O(n log n) ile sıralanır.

Çoktan Seçmeli · Arama Stratejileri

Soru 7: Bellek Kısıtlı Strateji

Belleği çok kısıtlı bir sistemde dal sınır için hangi arama stratejisi seçilmelidir?

C: LIFO (DFS) yalnızca geçerli yolun kardeş düğümlerini tutar: bellek O(derinlik · dallanma). FIFO ve en iyi önce stratejilerinde canlı düğüm sayısı üstel büyüyebilir. En iyi önce genellikle en az düğümü genişletir ama kuyruğu bellek tüketir; LIFO erken bir tam çözümle enİyi'yi de hızla yükseltir.

Çıktı Sorusu · Arama Stratejileri

Soru 8: FIFO Dal Sınır

Dersteki sırt çantası örneği: (p, w) = (40, 2), (30, 5), (50, 10), (10, 5), W = 16. En iyi önce kodundaki öncelikli kuyruk ArrayDeque ile değiştirilip add()/poll() kullanılıyor (FIFO). Program ne yazar (enİyi, üretilen, genişletilen)?

Deque<Dugum> kuyruk = new ArrayDeque<>();
kuyruk.add(kok);
while (!kuyruk.isEmpty()) {
  Dugum u = kuyruk.poll();      // ilk giren
  if (u.sinir <= enIyi || u.seviye == n - 1)
    continue;
  gen++;
  // al ve alma: aynı kod (uretilen += 2)
}
System.out.println(
    enIyi + " " + uretilen + " " + gen);
Cevabı göster

Çıktı: 90 13 6

  • FIFO düğümleri seviye seviye (BFS) genişletir: önce kökün iki çocuğu, sonra onların çocukları…
  • En iyi önce aynı örnekte 11 düğüm üretip 5'ini genişletir; FIFO en büyük sınırlı düğümü beklemediği için daha fazla düğüm açar.
  • Optimum yine 90'dır (eşya 1 ve 3): strateji yalnızca iş miktarını ve belleği değiştirir.

Adım Adım Çalıştırma · 0/1 Sırt Çantası

Soru 9: sinir(kök) İzleme

Eşyalar (p, w): (20, 2), (30, 5), (35, 7), (12, 3); W = 9. Kök düğüm için kesirli sınır nasıl hesaplanır?

W = 9sonuc = 0

Eşyalar oran sırasında: (20, 2) 10 · (30, 5) 6 · (35, 7) 5 · (12, 3) 4; W = 9. Kök: seviye −1, kazanç 0, ağırlık 0 ≤ 9 → olurlu.

W = 9sonuc = 0

Sınır mevcut kazançtan başlar; j = seviye + 1 = 0 (eşya 1).

W = 9e1sonuc = 20

0 + w[0] = 2 ≤ 9 → eşya 1 tamamen sığar: toplamAg = 2, sonuc = 20.

W = 9e1e2sonuc = 50

2 + w[1] = 7 ≤ 9 → eşya 2 de sığar: toplamAg = 7, sonuc = 50.

W = 9e1e2sonuc = 50

7 + w[2] = 14 > 9 → eşya 3 tamamen sığmaz, döngü biter.

W = 9e1e2e3·2/7sonuc = 60

Kalan kapasite 2: eşya 3'ün 2/7'si → 2 · 35/7 = 10 eklenir, sonuc = 60.

W = 9e1e2e3·2/7sonuc = 60

sinir(kök) = 60: hiçbir 0/1 çözüm 60'tan fazla kazandıramaz. Gerçek optimum 55'tir (eşya 1 + 3, ağırlık 9).

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
    sonuc += (W - toplamAg)
             * (double) p[j] / w[j];
  return sonuc;
}

Çıktı Sorusu · 0/1 Sırt Çantası

Soru 10: Diğer Düğümlerin Sınırı

Aynı örnekte (W = 9) şu düğümlerin sınırlarını hesaplayın: C = "eşya 1 alınmadı" (seviye 0, kazanç 0, ağırlık 0) ve E = "eşya 1 alındı, eşya 2 alınmadı" (seviye 1, kazanç 20, ağırlık 2). Oranla açgözlü seçim ve optimum kaçtır; C budanır mı?

Cevabı göster
  • sinir(C) = 50: eşya 2 sığar (30, ağırlık 5); eşya 3 sığmaz, kalan 4 birim → 4 · 35/7 = 20 → 30 + 20 = 50.
  • sinir(E) = 55: 20 + eşya 3 (35, ağırlık 9) = 55; kapasite tam doldu, eşya 4 için kesir 0.
  • Açgözlü (oran sırası) 1 ve 2'yi alır: 50 (ağırlık 7); 3 ve 4 sığmaz. Optimum 1 + 3 = 55.
  • enİyi = 55 bulunduktan sonra sinir(C) = 50 ≤ 55 → C budanır: eşya 1'siz hiçbir çözüm 55'i geçemez.

Adım Adım Çalıştırma · 0/1 Sırt Çantası

Soru 11: En İyi Önce Dal Sınır

Aynı örnekte en iyi önce (LC) dal sınır hangi düğümleri hangi sırayla genişletir?

A60

Kök A: kazanç 0, ağırlık 0, sinir = 60. Kuyruk (en büyük sınır önce): A (60); enİyi = 0. Etiketlerin yanındaki sayı sınırdır.

A60B60C50

A çıkarıldı (en büyük sınır) ve dallandı; enİyi = 20. B (eşya 1 alındı): s = 60 → kuyruğa; C (eşya 1 yok): s = 50 → kuyruğa.

A60B60C50D60E55

B çıkarıldı (en büyük sınır) ve dallandı; enİyi = 50. D (eşya 2 alındı): s = 60 → kuyruğa; E (eşya 2 yok): s = 55 → kuyruğa.

A60B60C50D60E55F✗G58

D çıkarıldı (en büyük sınır) ve dallandı; enİyi = 50. F (eşya 3 alındı): ağırlık 14 > 9 → olursuz; G (eşya 3 yok): s = 58 → kuyruğa.

A60B60C50D60E55F✗G58H✗I50

G çıkarıldı (en büyük sınır) ve dallandı; enİyi = 50. H (eşya 4 alındı): ağırlık 10 > 9 → olursuz; I (eşya 4 yok): s = 50 ≤ 50 → budandı.

A60B60C50D60E55F✗G58H✗I50J55K32

E çıkarıldı (en büyük sınır) ve dallandı; enİyi = 55. J (eşya 3 alındı): s = 55 ≤ 55 → budandı; K (eşya 3 yok): s = 32 ≤ 55 → budandı.

A60B60C50D60E55F✗G58H✗I50J55K32

C çıkarıldı: sinir = 50 ≤ enİyi = 55 → budandı (beklerken eskidi). Kuyruk boş: en iyi kazanç 55. Tam ağacın 31 düğümünden 11'i üretildi, 5'i genişletildi.

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;
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);
Dugum alma = new Dugum(i, u.kazanc,
                       u.agirlik);
alma.sinir = sinir(alma);
if (alma.sinir > enIyi) kuyruk.add(alma);

Çıktı Sorusu · 0/1 Sırt Çantası

Soru 12: Strateji Değişince

Aynı örnekte (W = 9) öncelikli kuyruk yerine ArrayDeque yığını kullanılıyor: önce al, sonra alma push edilir, pop() en son ekleneni alır. Döngünün geri kalanı aynıdır. Program kaç düğüm üretir, kaçını genişletir ve hangi kazancı bulur? En iyi önce ile karşılaştırın.

Deque<Dugum> yigin = new ArrayDeque<>();
yigin.push(kok);
int enIyi = 0, uretilen = 1, gen = 0;
while (!yigin.isEmpty()) {
  Dugum u = yigin.pop();
  if (u.sinir <= enIyi || u.seviye == n - 1)
    continue;
  gen++;
  // ... al ve alma (uretilen += 2)
  if (al.sinir > enIyi) yigin.push(al);
  if (alma.sinir > enIyi) yigin.push(alma);
}
System.out.println(
    enIyi + " " + uretilen + " " + gen);
Cevabı göster

Çıktı: 55 21 10 (enİyi, üretilen, genişletilen).

stratejiüretilengenişletilenen büyük kuyruk
En iyi önce (LC)1153
FIFO (kuyruk)1153
LIFO, alma önce çıkar21103
  • alma en son push edildiği için önce o çıkar: arama "hiçbir şey alma" dalına dalar; enİyi geç yükselir ve daha az budama yapılır.
  • Üç strateji de aynı optimumu (55) bulur; değişen, üretilen düğüm sayısı ve bellektir. LIFO'da push sırası çevrilirse (önce alma, sonra al) "al" dalı önce gezilir ve enİyi hızla yükselir.

Çoktan Seçmeli · 0/1 Sırt Çantası

Soru 13: Kuyruktan Çıkınca Tekrar Sına

En iyi önce kodunda poll() sonrasında if (u.sinir <= enIyi) continue; testi neden yapılır? Düğüm kuyruğa eklenirken zaten sınanmıştı.

B: Sınır değişmez; değişen enİyi'dir. Örnekte C (sınır 50) eklenirken enİyi 20'ydi; çıkarıldığında enİyi 55 olmuştu ve C hiç genişletilmeden atıldı. Test yapılmasa sonuç yine doğru olur, ama gereksiz düğümler genişletilir.

Adım Adım Çalıştırma · Gezgin Satıcı

Soru 14: TSP Dal Sınır İzleme

Simetrik uzaklıklar: d(0,1) = 4, d(0,2) = 9, d(0,3) = 5, d(1,2) = 3, d(1,3) = 7, d(2,3) = 6. tsp(0, 0, 1) hangi dalları açar, hangilerini budar?

4953760123

Şehir 0'dan başlanır. Her şehrin en ucuz çıkış kenarı enKucuk = [4, 3, 3, 5]; kök alt sınırı 4 + 3 + 3 + 5 = 15.

4953760123

0 → 1: yeni = 4; alt = 15 < ∞ → dallan.

4953760123

1 → 2: yeni = 7; alt = 15 < ∞ → dallan.

4953760123

2 → 3: yeni = 13; alt = 18 < ∞ → dallan.

4953760123

Tur 0 → 1 → 2 → 3 → 0 = 18 < ∞ → enİyi = 18.

4953760123

1 → 3: yeni = 11; alt = 19 ≥ enİyi = 18 → budandı.

4953760123

0 → 2: yeni = 9; alt = 20 ≥ enİyi = 18 → budandı.

4953760123

0 → 3: yeni = 5; alt = 16 < 18 → dallan.

4953760123

3 → 1: yeni = 12; alt = 18 ≥ enİyi = 18 → budandı.

4953760123

3 → 2: yeni = 11; alt = 17 < 18 → dallan.

4953760123

2 → 1: yeni = 14; alt = 17 < 18 → dallan.

4953760123

Tur 0 → 3 → 2 → 1 → 0 = 18 = enİyi; güncellenmez. Bitti: en kısa tur 18 (0 → 1 → 2 → 3 → 0).

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
  }
}

Çoktan Seçmeli · Gezgin Satıcı

Soru 15: TSP Alt Sınırının Geçerliliği

alt(yol) = maliyet(yol) + enKucuk[son şehir] + Σ enKucuk[ziyaret edilmemiş] sınırı neden geçerlidir?

B: Turu tamamlamak için son şehirden ve ziyaret edilmemiş her şehirden tam bir kez çıkılır; her çıkış en az o şehrin en ucuz kenarı kadar tutar. Bu yüzden hiçbir tamamlanmış tur alt(yol)'dan ucuz olamaz. Sınır gerçek değere eşit olmak zorunda değildir; A en yakın komşu sezgiselidir ve bir üst değer verir.

Klasik Soru · Gezgin Satıcı

Soru 16: İki En Kısa Kenar Sınırı

Aynı 4 şehirli örnekte, simetrik TSP için "her şehrin iki en kısa kenarının toplamının yarısı" kök alt sınırını hesaplayın. En ucuz çıkış sınırıyla (15) karşılaştırın.

Cevabı göster
şehiriki en kısa kenartoplam
04, 59
13, 47
23, 69
35, 611

(9 + 7 + 9 + 11) / 2 = 36 / 2 = 18. Her şehre bir kenarla girilir, bir kenarla çıkılır; her kenar iki şehirde sayıldığı için toplam 2'ye bölünür.

Bu sınır optimuma (18) eşittir: kökte bile ilk tur bulununca tüm dallar budanabilir. En ucuz çıkış sınırı 15 ile daha gevşektir. Sıkı sınır daha çok budar ama her düğümde biraz daha pahalıdır.

Çoktan Seçmeli · Gezgin Satıcı

Soru 17: Tur Sayısı

Başlangıç şehri sabitlenmiş 10 şehirli bir TSP'de kaba kuvvetin denemesi gereken tur sayısı kaçtır (yön ayrımı yapılarak)?

D: Başlangıç sabitse kalan 9 şehrin her sırası bir turdur: (n − 1)! = 9! = 362 880. 2ⁿ, sırt çantasındaki alt küme sayısıdır. n = 20'de (n − 1)! ≈ 1,2 · 10¹⁷'ye çıkar; dal sınır budama ile bunun çok küçük bir kısmını gezer.

Çıktı Sorusu · Gezgin Satıcı

Soru 18: TSP Alt Sınırları

TSP izleme sorusundaki 4 şehirli örnekte (enKucuk = [4, 3, 3, 5]) kök, 0 → 2 ve 0 → 3 → 1 kısmi yollarının alt sınırları nedir? enİyi = 18 iken hangileri budanır?

Cevabı göster
  • Kök: 4 + 3 + 3 + 5 = 15.
  • 0 → 2: maliyet 9 + enKucuk[2] = 3 + (enKucuk[1] + enKucuk[3]) = 3 + 5 → 20 ≥ 18 → budanır.
  • 0 → 3 → 1: maliyet 5 + 7 = 12 + enKucuk[1] = 3 + enKucuk[2] = 3 → 18 ≥ 18 → budanır (eşitlik de yeter: daha kısa tur çıkamaz).

Son şehirden ve ziyaret edilmemiş her şehirden en az bir kez çıkılacağı için bu toplamdan ucuz tur yoktur. Şehir 0'a dönüş kenarı, son ziyaret edilmemiş şehrin çıkış kenarı olarak sayılmıştır.

Adım Adım Çalıştırma · Atama Problemi

Soru 19: Atama Problemi İzleme

Maliyet matrisi [[9, 2, 7], [6, 4, 3], [5, 8, 1]] (satır: kişi, sütun: iş). ata(0, 0) hangi dalları açar, hangilerini budar?

927k0643k1581k2iş 0iş 1iş 2

Kişi i'ye iş j'nin maliyeti c[i][j]. Satır en küçükleri 2, 3, 1 → kalanMin = [6, 4, 1, 0] (i. satırdan sonuna). Kök alt sınırı 6.

927k0643k1581k2iş 0iş 1iş 2

Kişi 0 → iş 0: yeni = 9, alt = 9 + kalanMin[1] = 13 < ∞ → dallan.

927k0643k1581k2iş 0iş 1iş 2

Kişi 1 → iş 1: yeni = 13, alt = 13 + kalanMin[2] = 14 < ∞ → dallan.

927k0643k1581k2iş 0iş 1iş 2

Kişi 2 → iş 2: yeni = 14, alt = 14 + kalanMin[3] = 14 < ∞ → dallan.

927k0643k1581k2iş 0iş 1iş 2

Tam atama [0, 1, 2], maliyet 14 → enİyi = 14.

927k0643k1581k2iş 0iş 1iş 2

Kişi 1 → iş 2: yeni = 12, alt = 12 + kalanMin[2] = 13 < 14 → dallan.

927k0643k1581k2iş 0iş 1iş 2

Kişi 2 → iş 1: alt = 20 ≥ enİyi = 14 → budandı.

927k0643k1581k2iş 0iş 1iş 2

Kişi 0 → iş 1: yeni = 2, alt = 2 + kalanMin[1] = 6 < 14 → dallan.

927k0643k1581k2iş 0iş 1iş 2

Kişi 1 → iş 0: yeni = 8, alt = 8 + kalanMin[2] = 9 < 14 → dallan.

927k0643k1581k2iş 0iş 1iş 2

Kişi 2 → iş 2: yeni = 9, alt = 9 + kalanMin[3] = 9 < 14 → dallan.

927k0643k1581k2iş 0iş 1iş 2

Tam atama [1, 0, 2], maliyet 9 → enİyi = 9.

927k0643k1581k2iş 0iş 1iş 2

Kişi 1 → iş 2: yeni = 5, alt = 5 + kalanMin[2] = 6 < 9 → dallan.

927k0643k1581k2iş 0iş 1iş 2

Kişi 2 → iş 0: alt = 10 ≥ enİyi = 9 → budandı.

927k0643k1581k2iş 0iş 1iş 2

Kişi 0 → iş 2: alt = 11 ≥ enİyi = 9 → budandı. Bitti: en iyi atama [1, 0, 2] (2 + 6 + 1), maliyet 9.

void ata(int i, int maliyet) { // i. kişi
  if (i == n) {
    enIyi = Math.min(enIyi, maliyet);
    return;
  }
  for (int j = 0; j < n; j++) {
    if (atandi[j]) continue;
    int yeni = maliyet + c[i][j];
    if (yeni + kalanMin[i + 1] >= enIyi)
      continue; // sınır
    atandi[j] = true;
    ata(i + 1, yeni);
    atandi[j] = false; // geri al
  }
}

Çıktı Sorusu · Atama Problemi

Soru 20: 4 × 4 Atama

Atama izleme sorusundaki ata metodu (çağrı sayacı ve tam atama sayacı eklenmiş) aşağıdaki matrisle çalıştırılıyor. Kök alt sınırı (kalanMin[0]) nedir; program ne yazar?

int[][] c = {{7, 3, 8, 4},
             {5, 6, 2, 9},
             {4, 8, 5, 3},
             {6, 2, 7, 5}};
// kalanMin: satır en küçüklerinin sonek toplamı
ata(0, 0);
System.out.println(kalanMin[0] + " " + enIyi
    + " " + cagri + " " + tam);
Cevabı göster

Çıktı: 10 12 21 4 (kalanMin[0], enIyi, çağrı, tam atama).

  • Satır en küçükleri 3, 2, 3, 2 → kök alt sınırı 10. Sınır geçerlidir: her kişi en az kendi en ucuz işi kadar tutar.
  • En iyi atama: kişi 0 → iş 3 (4), 1 → iş 2 (2), 2 → iş 0 (4), 3 → iş 1 (2) = 12.
  • Kaba kuvvet 4! = 24 tam atama dener; dal sınır 21 çağrıda yalnızca 4 tam atamaya ulaşır.

Klasik Soru · Tam Sayılı Programlama

Soru 21: ILP Dal Sınır Ağacı

En büyükle Z = 5x + 8y; x + y ≤ 6, 5x + 9y ≤ 45, x, y ≥ 0 tam sayı. LP gevşetmeleriyle dal sınır uygulayın (önce y, sonra x kesirliyse onda dallanın). Optimum nedir? LP çözümünü yuvarlamak neden yetmez?

Cevabı göster
düğümLP çözümü (x; y)Zkarar
kök(2,25; 3,75)41,25y kesirli → y ≤ 3 | y ≥ 4
y ≤ 3(3; 3)39tam sayı → enİyi = 39
y ≥ 4(1,8; 4)41x kesirli → x ≤ 1 | x ≥ 2
y ≥ 4, x ≤ 1(1; 4,44)40,56y kesirli → y ≤ 4 | y ≥ 5
… y ≤ 4(1; 4)3737 ≤ 39 → budandı
… y ≥ 5(0; 5)40tam sayı, 40 > 39 → enİyi = 40
y ≥ 4, x ≥ 2——olursuz

Optimum x = 0, y = 5, Z = 40. Yuvarlama: (2; 4) olursuzdur (5·2 + 9·4 = 46 > 45), (2; 3) ise Z = 34'tür; gerçek optimum LP noktasından uzaktadır. LP değeri (41,25) her alt ağaç için üst sınırdır.

Çoktan Seçmeli · Tam Sayılı Programlama

Soru 22: Kesirli Değişkende Dallanma

Bir ILP düğümünde LP gevşetmesinin çözümü y = 2,6 veriyor. Dal sınır hangi iki alt problemi üretir ve neden hiçbir tam sayı çözüm kaybolmaz?

A: Dallanma kesirli bölgeyi (2, 3) atar; tam sayı noktaların hepsi iki alt problemden birinde kalır. B kalan y değerlerini kaybeder; C mevcut LP çözümünü iki alt problemde de bırakır (ilerleme olmaz); D'de alt problemler örtüşür. Her alt problemin LP değeri o dal için bir üst sınırdır.

Çıktı Sorusu · Maksimum Klik

Soru 23: Klik Sınırının Kazancı

Kenarlar 0–1, 0–2, 1–2, 1–3, 2–3, 3–4, 2–4, 1–4. Dersteki klik metodu sınır satırıyla ve sınır satırı silinerek çalıştırılıyor; her çağrıda bir sayaç artıyor. En büyük klik ve iki sürümün çağrı sayıları nedir?

01234
Cevabı göster
  • En büyük klik: {1, 2, 3, 4} (4 düğüm; her çift komşu).
  • Sınırsız (geri izleme): 20 çağrı; |K| + |aday| ≤ |enİyi| sınırıyla: 15 çağrı.
  • enİyi = {1, 2, 3, 4} bulunduktan sonra K = {2}, aday = {3, 4} gibi dallar 1 + 2 ≤ 4 olduğu için hemen kesilir: bu daldan 4'ten büyük klik çıkamaz.
  • Örneğin K = {3, 4}, aday = {5}, |enİyi| = 5 ise 2 + 1 = 3 ≤ 5 → budanır.

Adım Adım Çalıştırma · Maksimum Klik

Soru 24: Maksimum Klik İzleme

Çizgede klik(new ArrayList<>(), 0) hangi kısmi klikleri genişletir, hangilerini sınırla keser?

01234

Kenarlar 0–1, 0–2, 0–3, 1–2, 1–4, 2–3. klik([], 0): K mevcut klik, aday K'nin tüm düğümlerine komşu ve bas'tan büyük düğümler.

01234

K = {}: aday = {0, 1, 2, 3, 4}; 0 + 5 > |enİyi| = 0 → dallan.

01234

K = {0}: aday = {1, 2, 3}; 1 + 3 > |enİyi| = 1 → dallan.

01234

K = {0, 1}: aday = {2}; 2 + 1 > |enİyi| = 2 → dallan.

01234

K = {0, 1, 2}: aday = {}; 3 + 0 ≤ |enİyi| = 3 → sınır, dön.

01234

K = {0, 2}: aday = {3}; 2 + 1 ≤ |enİyi| = 3 → sınır, dön.

01234

K = {0, 3}: aday = {}; 2 + 0 ≤ |enİyi| = 3 → sınır, dön.

01234

K = {1}: aday = {2, 4}; 1 + 2 ≤ |enİyi| = 3 → sınır, dön.

01234

K = {2}: aday = {3}; 1 + 1 ≤ |enİyi| = 3 → sınır, dön.

01234

K = {3}: aday = {}; 1 + 0 ≤ |enİyi| = 3 → sınır, dön.

01234

K = {4}: aday = {}; 1 + 0 ≤ |enİyi| = 3 → sınır, dön. Bitti: en büyük klik {0, 1, 2}; 10 çağrı (sınırsız 14).

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);
  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
  }
}

Çoktan Seçmeli · Maksimum Klik

Soru 25: Dal Sınır Gerekmeyen Problem

Aşağıdaki problemlerden hangisi için dal sınır yöntemine gerek yoktur?

C: Maksimum akışın polinom zamanlı algoritmaları vardır (Ford-Fulkerson, Edmonds-Karp; Bölüm 4). Dal sınır NP-zor eniyileme problemleri (TSP, 0/1 sırt çantası, maksimum klik, ILP) için anlamlıdır; en kötü durumda yine üstel çalışır ama iyi bir sınırla pratikte çok az düğüm gezer.

Son

Bölüm 14: Dal Sınır Algoritmaları: Çalışma Soruları
Konu anlatımı: Dal sınır algoritmaları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.