Bölüm 7: Yakınsama Algoritmaları
Giriş
Öğrenme Çıktıları
Yakınsama (approximation) algoritmasının ne olduğunu, yaklaşım oranını ve sezgisel yöntemlerden farkını açıklamak.
Seyahat eden satıcı problemi için en yakın komşu, MST tabanlı 2-yaklaşım ve 2-opt yerel aramasını adım adım uygulamak.
İş çizelgeleme (liste, LPT, son tarihli iş sıralama) ve düğüm kapsama 2-yaklaşımını Java ile yazıp izlemek.
Power Iteration ile en büyük özdeğer ve özvektörün yinelemeli olarak nasıl yakınsandığını hesaplamak.
Giriş
Yakınsama Algoritmaları (Approximation Algorithms)
- Bazı problemlerin kesin (optimal) çözümünü bulmak çok zor ya da pratikte imkânsız olabilir: bilinen tüm kesin algoritmalar üstel zaman ister.
- Yakınsama algoritmaları mükemmel çözümü aramak yerine, optimal çözüme mümkün olduğunca yakın çözümler üretir.
- Polinom zamanda çalışırlar: karmaşık problemler makul sürede çözülebilir.
- Çözümün optimal çözüme belli bir oran ya da yüzde içinde yakın olduğu çoğu zaman kanıtlanabilir.
- Hesaplama kaynakları (zaman, bellek) kısıtlı olduğunda tercih edilir.
Giriş
Sezgi: Terazi Benzetmesi
- Terazinin bir kefesine bir ağırlık konduğunda, diğer kefeye tam olarak aynı ağırlığı koymak zor olabilir.
- Bu durumda, eldeki çeşitli küçük ağırlıklar kullanılarak büyük ağırlığa olabildiğince yakın bir denge kurulur.
- Elimizde yalnızca 20, 10, 5 ve 1 kg varsa ve her biri bir kez kullanılabiliyorsa, 37 kg'a en yakın denge 36 kg'dır.
Giriş
Yaklaşım Oranı (Approximation Ratio)
C: algoritmanın bulduğu çözümün maliyeti, C*: optimal çözümün maliyeti. Algoritma her girdi için
koşulunu sağlıyorsa bir ρ(n)-yaklaşım algoritmasıdır (ρ ≥ 1; ρ = 1 ise algoritma optimaldir).
Oran bir en kötü durum garantisidir; pratikte çözümler çoğu zaman optimuma çok daha yakındır.
Giriş
Yakınsama, Sezgisel ve Yaklaşım Şemaları
| Yaklaşım | Garanti | Örnek |
|---|---|---|
| Kesin algoritma | Optimal; ama NP-zor problemlerde üstel zaman | Kaba kuvvet TSP: (n−1)!/2 tur |
| Yakınsama algoritması | Polinom zaman + kanıtlanmış oran ρ | Düğüm kapsama: ρ = 2 |
| PTAS | Her sabit ε > 0 için (1 + ε) oranı, n'de polinom (ε'da üstel olabilir) | Öklid TSP (Arora, 1998) |
| FPTAS | (1 + ε) oranı, hem n'de hem 1/ε'da polinom | Sırt çantası: O(n³/ε) |
| Sezgisel (heuristic) | Garanti yok; pratikte genellikle iyi | 2-opt, en yakın komşu |
| Metasezgisel | Garanti yok; problemden bağımsız arama çerçevesi | Genetik algoritma, karınca kolonisi |
Rastgele yuvarlama (randomized rounding) gibi rastgele yakınsama algoritmaları da vardır; beklenen değerde bir oran garanti ederler (Bölüm 8).
Giriş
Neden Kesin Çözüm Değil? P, NP ve NP-Zor
- TSP, düğüm kapsama, iş çizelgeleme ve sırt çantasının en iyileme sürümleri NP-zordur.
- P ≠ NP ise bunların hiçbiri için polinom zamanlı kesin algoritma yoktur → yakınsama gerekir.
Giriş
Yakınsama Algoritmalarının Uygulamaları
Satıcının tüm müşterilere en kısa toplam yolla uğrayıp geri döndüğü rotaya karar vermek: lojistik, kargo, devre kartı delme.
Çantaya sığacak ve en büyük faydayı sağlayacak eşyaları seçmek: bütçe, yük ve portföy planlama.
Birden fazla işin ya da sürecin makinelerde/işlemcilerde en verimli şekilde yürütülmesi.
Ağlara en az sayıda izleme noktası yerleştirmek; büyük matrislerin özdeğerini yinelemeli yakınsamak (PageRank).
Giriş
Yakınsama Algoritmalarının Türleri
Problemin daha basit bir sürümü çözülür (ör. tamsayı kısıtı gevşetilir: LP gevşetmesi, MST ile TSP alt sınırı).
Her adımda o an en iyi görünen seçenek seçilerek ilerlenir (en yakın komşu, LPT, oran sıralı sırt çantası).
Mevcut çözüm küçük değişikliklerle iyileştirilir; daha iyi komşu kalmayınca durulur (2-opt).
Seyahat Eden Satıcı
Seyahat Eden Satıcı Problemi (TSP)
- En iyileme problemi: satıcı, bir dizi şehri en kısa toplam mesafede birer kez ziyaret edip başladığı şehre dönmek ister.
- Kombinatoryal problem: çözüm, tüm şehirlerin gezilme sırasıdır (bir permütasyon).
- NP-zor: çok sayıda şehir için en iyi rotayı bulmak pratikte zordur.
- Girdi: n şehir (0, 1, 2, … ya da A, B, C, …) ve dij: i ve j şehirleri arasındaki mesafe.
- Simetrik TSP: dij = dji; graf kuramında: tam graftaki en hafif Hamilton çevrimi.
| d | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | 0 | 10 | 15 | 20 | 25 |
| 1 | 10 | 0 | 35 | 25 | 30 |
| 2 | 15 | 35 | 0 | 30 | 35 |
| 3 | 20 | 25 | 30 | 0 | 40 |
| 4 | 25 | 30 | 35 | 40 | 0 |
Örnek: 5 şehrin mesafe matrisi (sonraki slaytlarda kullanılır).
Seyahat Eden Satıcı
Problemin Çözümü
| n | (n−1)!/2 farklı tur |
|---|---|
| 5 | 12 |
| 10 | 181 440 |
| 15 | ≈ 4,4 · 1010 |
| 20 | ≈ 6,1 · 1016 |
| 25 | ≈ 3,1 · 1023 |
Başlangıç şehri sabitlenir ve iki yön aynı sayılır. Saniyede 10⁹ tur denense bile n = 25 için ≈ 10⁷ yıl gerekir.
Seyahat Eden Satıcı
En Yakın Komşu (Nearest Neighbor) Sezgiseli
- Bir başlangıç şehri seç; onu ziyaret edildi olarak işaretle.
- Bulunduğun şehirden ziyaret edilmemiş en yakın şehre git (açgözlü seçim).
- Tüm şehirler ziyaret edilene kadar 2. adımı tekrarla.
- Son şehirden başlangıç şehrine dön ve turu kapat.
Artıları
- Çok basit; O(n²) zaman.
- Genellikle optimumun %25 kadar üzerinde tur verir.
- Yerel arama için iyi bir başlangıç turu.
Eksileri
- Sabit bir yaklaşım oranı yoktur; metrik TSP'de bile oran Θ(log n) olabilir.
- Son dönüş kenarı çok uzun kalabilir.
Seyahat Eden Satıcı · Kodu adım adım çalıştır
En Yakın Komşu: Kodu Adım Adım İzle
Başlangıç şehri 0: ziyaret[0] = true, tur = [0], toplam = 0.
0. satır taranır, ziyaret edilmemişler: d[0][1] = 10, d[0][2] = 15, d[0][3] = 20, d[0][4] = 25 → en küçüğü 1 (10).
tur[1] = 1, toplam += 10 → 10; artık simdiki = 1.
1. satır taranır, ziyaret edilmemişler: d[1][2] = 35, d[1][3] = 25, d[1][4] = 30 → en küçüğü 3 (25).
tur[2] = 3, toplam += 25 → 35; artık simdiki = 3.
3. satır taranır, ziyaret edilmemişler: d[3][2] = 30, d[3][4] = 40 → en küçüğü 2 (30).
tur[3] = 2, toplam += 30 → 65; artık simdiki = 2.
2. satır taranır, ziyaret edilmemişler: d[2][4] = 35 → en küçüğü 4 (35).
tur[4] = 4, toplam += 35 → 100; artık simdiki = 4.
Tüm şehirler ziyaret edildi; başlangıca dönülür: toplam += d[4][0] = 25 → 125.
Tur 0 → 1 → 3 → 2 → 4 → 0, uzunluk 125. (Kaba kuvvetle doğrulandı: bu örnekte optimumdur.)
int[] enYakinKomsu(int[][] d, int bas) { int n = d.length, toplam = 0, simdiki = bas; boolean[] ziyaret = new boolean[n]; int[] tur = new int[n + 1]; tur[0] = bas; ziyaret[bas] = true; for (int k = 1; k < n; k++) { int enYakin = -1, enAz = Integer.MAX_VALUE; for (int j = 0; j < n; j++) if (!ziyaret[j] && d[simdiki][j] < enAz) { enAz = d[simdiki][j]; enYakin = j; } // en yakın şehre git tur[k] = enYakin; ziyaret[enYakin] = true; toplam += enAz; simdiki = enYakin; } // başlangıca dön tur[n] = bas; toplam += d[simdiki][bas]; return tur; }
Seyahat Eden Satıcı
Kaba Kuvvetle Karşılaştırma: 12 Farklı Tur
| Tur | Uzunluk |
|---|---|
| 0 → 1 → 3 → 2 → 4 → 0 | 125 |
| 0 → 1 → 3 → 4 → 2 → 0 | 125 |
| 0 → 1 → 4 → 2 → 3 → 0 | 125 |
| 0 → 1 → 4 → 3 → 2 → 0 | 125 |
| 0 → 2 → 3 → 1 → 4 → 0 | 125 |
| 0 → 2 → 4 → 1 → 3 → 0 | 125 |
| Tur | Uzunluk |
|---|---|
| 0 → 1 → 2 → 3 → 4 → 0 | 140 |
| 0 → 1 → 2 → 4 → 3 → 0 | 140 |
| 0 → 2 → 1 → 3 → 4 → 0 | 140 |
| 0 → 2 → 1 → 4 → 3 → 0 | 140 |
| 0 → 3 → 1 → 2 → 4 → 0 | 140 |
| 0 → 3 → 2 → 1 → 4 → 0 | 140 |
- (5−1)!/2 = 12 tur denendi: optimum 125; en yakın komşu da 125 buldu (bu örnek için şanslı bir durum).
- Bu matris üçgen eşitsizliğini sağlamaz: d12 = 35 > d10 + d02 = 10 + 15. Yani örnek metrik değildir.
Seyahat Eden Satıcı
Üçgen Eşitsizliği ve Yaklaşım Sınırları
| Durum | Oran | Açıklama |
|---|---|---|
| Genel TSP | yok | P ≠ NP ise hiçbir sabit ρ için polinom zamanlı ρ-yaklaşım yoktur: böyle bir algoritma Hamilton çevrimi problemini çözerdi. |
| Metrik TSP, MST tabanlı | 2 | MST + önce-kök (preorder) gezinme + kısayol; O(n²). |
| Metrik TSP, Christofides | 1,5 | MST + tek dereceli düğümlerde en küçük mükemmel eşleme + Euler turu (1976). |
| Öklid TSP | 1 + ε | Düzlemdeki noktalar için PTAS vardır (Arora, Mitchell). |
| En yakın komşu | Θ(log n) | Metrik durumda bile sabit oran garanti etmez. |
Seyahat Eden Satıcı
Metrik TSP için MST Tabanlı 2-Yaklaşım
Metrik örnek: düzlemde 7 şehir; mesafeler Öklid uzaklığıdır (üçgen eşitsizliği sağlanır).
1) Prim ile en küçük kapsayan ağaç (MST) kurulur: toplam ağırlık w(T) = 228,8. Bir turdan bir kenar silinince kapsayan ağaç kalır → w(T) ≤ OPT.
2) Ağaç A'dan derinlik öncelikli iki kez gezilir (her kenar bir gidiş bir dönüş): A → D → B → C → E → F → E → C → B → D → G → D → A. Uzunluk 2 · w(T) = 457,6.
3) Tekrar eden şehirler atlanır (kısayol): önce-kök sırası A → D → B → C → E → F → G → A. Üçgen eşitsizliği sayesinde kısayol yolu uzatmaz: tur = 287,7.
Sonuç: tur ≤ 2 · w(T) ≤ 2 · OPT. Burada tur = 287,7, optimum (kaba kuvvet, 360 tur) = 282,5 → oran 1,02 ≤ 2.
Yerel Arama
Yerel Arama: 2-opt Hamlesi
Önce: (a, b) ve (c, d) kenarları çaprazlanıyor.
Sonra: (a, c) ve (b, d); aradaki yol ters çevrildi.
- Turdan iki kenar çıkar, uçları çapraz bağla: b … c arasındaki alt yol ters çevrilir.
- Kazanç Δ = d(a,c) + d(b,d) − d(a,b) − d(c,d) < 0 ise hamle yapılır. Öklid düzleminde her kesişme böyle kaldırılabilir.
- İyileştiren hamle kalmayınca tur 2-opt yerel optimumudur (genel optimum olması gerekmez).
Yerel Arama · Adım adım
2-opt ile Turu İyileştirme
28 şehir, rastgele başlangıç turu: uzunluk 1269,8. Kenarlar sürekli birbirini kesiyor.
1. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −36,9 → uzunluk 1232,9.
2. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −8,9 → uzunluk 1224,0.
4. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −27,6 → uzunluk 1187,3.
8. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −32,6 → uzunluk 1111,7.
14. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −14,9 → uzunluk 1005,2.
22. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −37,0 → uzunluk 852,8.
32. iyileştiren hamleden sonra: (a,b), (c,d) çıkarıldı (kesikli), (a,c), (b,d) eklendi (kalın). Δ = −11,8 → uzunluk 595,9.
48. ve son hamle: artık hiçbir 2-opt hamlesi turu kısaltmıyor → yerel optimum, uzunluk 430,8 (başlangıcın %34'ü). Kesişen kenar kalmadı.
Yerel Arama
2-opt Yerel Arama: Java
void ikiOpt(int[] tur, double[][] d) { int n = tur.length; boolean iyilesti = true; while (iyilesti) { iyilesti = false; for (int i = 0; i < n - 1; i++) for (int j = i + 2; j < n; j++) { int a = tur[i], b = tur[i + 1]; int c = tur[j], e = tur[(j + 1) % n]; double fark = d[a][c] + d[b][e] - d[a][b] - d[c][e]; if (fark < -1e-9) { // kısalıyor tersCevir(tur, i + 1, j); iyilesti = true; } } } }
Yerel Arama
Yerel Optimumdan Kaçış: Metasezgiseller
(Simulated annealing) Kötüleştiren bir hamle de e−Δ/T olasılıkla kabul edilir; "sıcaklık" T yavaşça düşürülür. Yerel optimumdan çıkabilir.
Turlardan oluşan bir popülasyon; seçilim, çaprazlama (crossover) ve mutasyonla nesiller boyunca iyileştirilir.
(Ant colony optimization) Karıncalar kısa turların kenarlarına daha çok feromon bırakır; sonraki karıncalar feromonu yoğun kenarları tercih eder.
- Üçü de TSP, araç rotalama, iş çizelgeleme ve atama problemlerinde yaygındır.
- Hiçbiri yaklaşım oranı garanti etmez; parametre ayarı (sıcaklık, popülasyon, buharlaşma) sonucu belirgin biçimde etkiler.
İş Çizelgeleme
İş Çizelgeleme (Job Scheduling)
- En iyileme problemi: belirli kaynaklarla (işçiler, makineler, işlemciler) işlerin en verimli şekilde planlanması.
- Amaç: işlerin tamamlanma süresini en aza indirmek ya da belirli ölçütlere (kâr, gecikme, son tarih) göre en iyilemek.
n iş, m özdeş makine; iş j'nin süresi pj. Son işin bittiği an Cmax (makespan) en küçük olsun. m ≥ 2 için NP-zor.
Her iş 1 birim sürer, bir kârı ve son tarihi (deadline) vardır. Son tarihinden önce biten işlerin toplam kârı en büyük olsun.
İlk problem için açgözlü yakınsama algoritmaları (liste çizelgeleme, LPT), ikincisi için optimal bir açgözlü algoritma göreceğiz.
İş Çizelgeleme · Adım adım
Makinelere İş Atama: Liste Çizelgeleme
Üç özdeş makine M1–M3. İşler sırayla gelir: J1 (2), J2 (8), J3 (6) t = 0'da hazır; J4 (3) t = 3'te gelir. Liste çizelgeleme (Graham): sıradaki iş, ilk boşalan makineye atanır.
J1 (süre 2) → M1, [0, 2] aralığında çalışır (tüm makineler boş; ilk makine seçilir).
J2 (süre 8) → M2, [0, 8] aralığında çalışır (M1 t = 2 anına kadar meşgul).
J3 (süre 6) → M3, [0, 6] aralığında çalışır (M1 t = 2 anına kadar meşgul; M2 t = 8 anına kadar meşgul).
t = 2: M1 boşaldı ama bekleyen iş yok; makine t = 3'e kadar boşta kalır (taralı alan).
J4 (süre 3) → M1, [3, 6] aralığında çalışır (M2 t = 8 anına kadar meşgul; M3 t = 6 anına kadar meşgul).
Tüm işler atandı: Cmax = 8 (M2). Alt sınır: OPT ≥ en uzun iş = 8 → bu çizelge optimaldir. Genelde ise liste çizelgeleme yalnızca (2 − 1/m) oranını garanti eder.
İş Çizelgeleme
Liste Çizelgeleme: (2 − 1/m)-Yaklaşım
İki alt sınır: OPT ≥ Σpj / m (iş yükü paylaştırılmalı) ve OPT ≥ max pj.
- En son biten iş j, sj anında başlamış olsun.
- sj'den önce tüm makineler meşguldü (yoksa j daha erken başlardı) → sj ≤ (Σp − pj) / m.
- Cmax = sj + pj ≤ Σp / m + (1 − 1/m) · pj ≤ OPT + (1 − 1/m) · OPT.
• Liste: M1 = 1 + 2 = 3, M2 = 1 → Cmax = 3
• Optimum: {1, 1} ve {2} → 2
Oran 3/2 = 2 − 1/2.
Genelde m(m − 1) adet 1 birimlik iş ve sonda tek bir m birimlik iş oranı 2 − 1/m'ye ulaştırır.
İş Çizelgeleme
En Uzun İş Önce (LPT): 4/3-Yaklaşım
LPT (Longest Processing Time first): işleri süreye göre azalan sırala, sonra liste çizelgeleme uygula. İşler: 2, 3, 4, 6, 2, 2 ve m = 3.
Verilen sıra: Cmax = 8
LPT sırası 6, 4, 3, 2, 2, 2: Cmax = 7 = OPT (≥ ⌈19/3⌉ = 7)
- Uzun işler başa alınınca sona kalan kısa işler dengesizliği düzeltir: Cmax ≤ (4/3 − 1/(3m)) · OPT (Graham, 1969). Süre O(n log n).
- Sıkı örnek (m = 3): 5, 5, 4, 4, 3, 3, 3 → LPT 11, optimum 9 ({5, 4}, {5, 4}, {3, 3, 3}).
İş Çizelgeleme
Son Tarihli İş Sıralama (Job Sequencing)
- Tek makine; her iş 1 zaman birimi sürer. İş, son tarihine kadar biterse kârı kazanılır.
- Açgözlü kural: işleri kâra göre azalan sırada ele al; her işi son tarihinden önceki en geç boş zaman dilimine (slot) yerleştir; boş dilim yoksa işi atla.
- En geç dilimi seçmek, erken dilimleri son tarihi daha yakın işlere bırakır.
- Bu problem için açgözlü kural optimaldir (matroid yapısı); süre O(n²), birleşim–bul (union–find) ile ≈ O(n log n).
| İş | Kâr | Son tarih |
|---|---|---|
| 3 | 40 | 2 |
| 4 | 30 | 2 |
| 1 | 20 | 4 |
| 2 | 10 | 1 |
İş Çizelgeleme · Kodu adım adım çalıştır
Son Tarihli İş Sıralama: Kodu Adım Adım İzle
İşler kâra göre azalan sıralanır: 3 (40), 4 (30), 1 (20), 2 (10). Bu örnekte tablo zaten sıralı.
n = 4 dilim oluşturulur; hepsi −1 (boş). dilim[t], t + 1. zaman dilimidir.
İş 3: son tarih 2 → en geç aday dilim t = min(4, 2) − 1 = 1.
dilim[1] boş → iş 3 yerleştirilir, toplamKar = 40; break.
İş 4: son tarih 2 → en geç aday dilim t = min(4, 2) − 1 = 1.
dilim[1] = 3 dolu → bir önceki dilime bak: t = 0.
dilim[0] boş → iş 4 yerleştirilir, toplamKar = 70; break.
İş 1: son tarih 4 → en geç aday dilim t = min(4, 4) − 1 = 3.
dilim[3] boş → iş 1 yerleştirilir, toplamKar = 90; break.
İş 2: son tarih 1 → en geç aday dilim t = min(4, 1) − 1 = 0.
dilim[0] = 4 dolu → bir önceki dilime bak: t = -1.
t = −1: son tarihi 1 olan iş 2 için boş dilim kalmadı → iş yapılamaz (kâr 0).
Sonuç dilim = [4, 3, −1, 1]: önce iş 4, sonra iş 3, t = 4'te iş 1. Toplam kâr = 40 + 30 + 20 + 0 = 90.
int[] isSirala(Is[] isler) { Arrays.sort(isler, (a, b) -> b.kar - a.kar); int n = isler.length, toplamKar = 0; int[] dilim = new int[n]; Arrays.fill(dilim, -1); // -1: boş for (Is is : isler) { int t = Math.min(n, is.sonTarih) - 1; for (; t >= 0; t--) if (dilim[t] == -1) { dilim[t] = is.no; toplamKar += is.kar; break; } } return dilim; }
Düğüm Kapsama
Düğüm Kapsama (Vertex Cover)
- Kapsama problemi: bir çizgenin tüm kenarlarını kapsayacak en az sayıda düğümü seçmek. Bir kenar, uçlarından en az biri seçilmişse kapsanır.
- Amaç: tüm kenarları en az düğümle kapsayan C ⊆ V kümesini bulmak. Karar sürümü ("k düğümlük kapsama var mı?") NP-tamdır.
Geçerli bir kapsama, boyut 6 (her kenarı bir "gözcü" görüyor)
Aynı çizgede en küçük kapsama, boyut 3
Düğüm Kapsama
Örnek: Dört Düğümlü Çizge
- Düğümler: A, B, C, D
- Kenarlar: (A, B), (A, C), (B, C), (B, D), (C, D)
- {A, B, C} bir düğüm kapsama kümesidir: her kenarın en az bir ucu kümede.
- Ama en küçük değildir: {B, C} de beş kenarın hepsini kapsar.
- Tek düğüm yetmez (B, (A, C)'yi kapsamaz) → optimum 2.
{A, B, C}: geçerli, boyut 3
{B, C}: en küçük, boyut 2
Düğüm Kapsama
Düğüm Kapsama: Çözüm Yaklaşımları
En küçük kapsama {A, B, H, I, J} (5 düğüm)
Düğüm Kapsama
Düğüm Kapsama Algoritması
Saf fikir:
- Başlangıçta boş bir kapsama kümesi oluştur.
- Kapsanmamış bir kenar seç; uçlarından birini kümeye ekle.
- Tüm kenarlar kapsanana kadar tekrarla.
Uçlardan yalnızca birini eklemek garanti vermez. Doğru 2-yaklaşım:
- Kapsanmamış bir (u, v) kenarı seç; u ve v'nin ikisini de ekle.
- u ya da v'ye değen tüm kenarları kapsanmış say; kenar kalmayana kadar tekrarla.
Her kenarda yaprak ucu seçilirse 5 düğüm; optimum {m}, 1 düğüm. n yapraklı yıldızda oran n olur.
Düğüm Kapsama · Kodu adım adım çalıştır
Düğüm Kapsama 2-Yaklaşımı: Kodu Adım Adım İzle
Kapsama kümesi boş. Kenarlar sırayla gezilecek: (A,B), (A,C), …, (J,L).
(A, B): iki uç da kapsamada değil → A ve B eklenir. Bu kenarlar bir eşleme (matching) oluşturur.
(A, C): A zaten kapsamada → kenar kapsanmış, atlanır.
(A, D): A zaten kapsamada → kenar kapsanmış, atlanır.
(A, E): A zaten kapsamada → kenar kapsanmış, atlanır.
(A, F): A zaten kapsamada → kenar kapsanmış, atlanır.
(B, C): B zaten kapsamada → kenar kapsanmış, atlanır.
(G, H): iki uç da kapsamada değil → G ve H eklenir. Bu kenarlar bir eşleme (matching) oluşturur.
(G, I): G zaten kapsamada → kenar kapsanmış, atlanır.
(H, I): H zaten kapsamada → kenar kapsanmış, atlanır.
(H, K): H zaten kapsamada → kenar kapsanmış, atlanır.
(I, J): iki uç da kapsamada değil → I ve J eklenir. Bu kenarlar bir eşleme (matching) oluşturur.
(J, K): J zaten kapsamada → kenar kapsanmış, atlanır.
(J, L): J zaten kapsamada → kenar kapsanmış, atlanır.
Sonuç {A, B, G, H, I, J}: 6 düğüm. Optimum 5 ({A, B, H, I, J}) → oran 6/5 = 1,2 ≤ 2.
Set<Character> dugumKapsama(char[][] kenarlar) { Set<Character> kapsama = new HashSet<>(); for (char[] k : kenarlar) { char u = k[0], v = k[1]; if (!kapsama.contains(u) && !kapsama.contains(v)) { kapsama.add(u); kapsama.add(v); } // iki uç } return kapsama; }
Düğüm Kapsama
Neden En Fazla 2 × Optimum?
- Algoritmanın seçtiği kenarlar M kümesi olsun. Seçilen her kenarın iki ucu da eklendiği için M'deki kenarların ortak ucu yoktur (M bir eşlemedir).
- Her kapsama, M'deki her kenarı kapsamak için farklı bir düğüm içermek zorundadır → OPT ≥ |M|.
- Algoritma tam olarak |C| = 2 |M| düğüm seçer → |C| ≤ 2 · OPT.
2'den belirgin biçimde iyi bir sabit oran bilinmiyor; 2 − ε oranının (Benzersiz Oyunlar Varsayımı altında) imkânsız olduğu gösterilmiştir.
Düğüm Kapsama · Adım adım
NP-Tamlık: 3-SAT'tan Düğüm Kapsamaya İndirgeme
φ = (x₁ ∨ x₁ ∨ x₂) ∧ (¬x₁ ∨ ¬x₂ ∨ ¬x₂) ∧ (¬x₁ ∨ x₂ ∨ x₂). Her değişken için bir kenar (üst kutu), her tümce için bir üçgen; tümcedeki her literal aynı adlı değişken düğümüne bağlanır. l = 2 değişken, m = 3 tümce → k = l + 2m = 8.
Atama x₁ = yanlış: değişken kenarından ¬x₁ seçilir. Kapsanan kenarlar soluklaşır.
Atama x₂ = doğru: x₂ seçilir. Her değişken kenarı tam olarak bir düğümle kapsandı (l = 2 düğüm).
C₁'de doğru literal x₂ (bağlantı kenarı zaten kapsanmış) dışarıda bırakılır; diğer iki köşe (x₁, x₁) eklenir.
C₂'de doğru literal ¬x₁ dışarıda; ¬x₂ ve ¬x₂ köşeleri eklenir.
C₃'te doğru literal ¬x₁ dışarıda; x₂ ve x₂ eklenir. 8 düğüm, 20 kenarın hepsi kapsandı: φ sağlanabilir ⇔ k = l + 2m boyutlu kapsama var.
Sırt Çantası
Sırt Çantası: Oran Sıralı Açgözlü Yakınsama
| Eşya | Değer | Ağırlık | Oran | Kapasite 10 |
|---|---|---|---|---|
| 6 | 20 | 7 | 2,86 | ✓ alındı (ağırlık 7) |
| 3 | 8 | 4 | 2,00 | ✗ sığmaz |
| 7 | 15 | 8 | 1,88 | ✗ sığmaz |
| 2 | 5 | 3 | 1,67 | ✓ alındı (ağırlık 10) |
| 5 | 10 | 6 | 1,67 | ✗ sığmaz |
| 1 | 3 | 2 | 1,50 | ✗ sığmaz |
| 4 | 6 | 5 | 1,20 | ✗ sığmaz |
Açgözlü toplam değer 25; DP ile optimum da 25 (eşya 2 + 6).
- Eşyaları değer/ağırlık oranına göre azalan sırala; sığanı al. O(n log n).
- Kesirli sırt çantasında bu kural optimaldir; 0/1 sürümde ise garanti yoktur.
- Kötü örnek: W = 10, (değer 2, ağırlık 1) ve (değer 10, ağırlık 10). Açgözlü 2 alır, optimum 10: oran W kadar büyüyebilir.
- İyileştirilmiş kural: max(açgözlü değer, sığan en değerli tek eşya) → 2-yaklaşım (optimumun en az yarısı).
- Daha iyisi: değerleri ölçekleyip DP uygulayan FPTAS, (1 − ε) · OPT, O(n³/ε).
Power Iteration
Power Iteration (Kuvvet Yinelemesi) Algoritması
- Bir matrisin en büyük (mutlak değeri en büyük, baskın) özdeğerini λ1 ve buna ait bir özvektörü v1 yaklaşık olarak hesaplayan yinelemeli bir yöntemdir.
- Tüm özdeğerleri kesin olarak hesaplamak (O(n³)) yerine, yalnızca baskın özdeğer ve özvektörün yaklaşık bir tahminini verir.
- Her adım yalnızca bir matris–vektör çarpımıdır (O(n²), seyrek matriste O(sıfır olmayan eleman)): büyük boyutlu matrislerde etkilidir.
Power Iteration
Power Iteration: Adımlar ve Neden Çalışır?
- Bir A matrisi belirlenir ve rastgele (sıfır olmayan) bir başlangıç vektörü x0 seçilir.
- Vektör matrisle çarpılarak yeni vektör elde edilir: y = A · xk.
- Yeni vektörün normu (uzunluğu) 1'e normalleştirilir: xk+1 = y / ‖y‖.
- Bu işlem istenen sayıda ya da değişim küçülene kadar tekrarlanır.
- xk → v1; özdeğer tahmini Rayleigh bölümü λ ≈ xkT A xk.
Neden? x0 = c1v1 + c2v2 + … ise
- |λ2/λ1| < 1 olduğundan diğer bileşenler geometrik olarak söner.
- Hata her adımda ≈ |λ2/λ1| katına iner: oran 1'e yakınsa yakınsama yavaştır.
- Koşul: c1 ≠ 0 (x0, v1'e dik olmamalı) ve |λ1| > |λ2|.
Power Iteration · Adım adım
Power Iteration Adım Adım
A = [[2, 1], [1, 3]], özdeğerler λ₁ = (5 + √5)/2 ≈ 3,618 ve λ₂ ≈ 1,382. Başlangıç x₀ = (1, 0); hata ‖x₀ − v₁‖ = 0,974.
k = 1: A·x = (2,000, 1,000), normalleştir → x = (0,894, 0,447); λ ≈ 3,000, hata 0,5465.
k = 2: A·x = (2,236, 2,236), normalleştir → x = (0,707, 0,707); λ ≈ 3,500, hata 0,2313.
k = 3: A·x = (2,121, 2,828), normalleştir → x = (0,600, 0,800); λ ≈ 3,600, hata 0,0899.
k = 4: x = (0,5547, 0,8321); λ ≈ 3,61538; hata 3,4 · 10⁻². Her adımda ≈ λ₂/λ₁ ≈ 0,38 katına iner.
k = 5: x = (0,5369, 0,8437); λ ≈ 3,61765; hata 1,3 · 10⁻². Her adımda ≈ λ₂/λ₁ ≈ 0,38 katına iner.
k = 6: x = (0,5300, 0,8480); λ ≈ 3,61798; hata 5,0 · 10⁻³. Her adımda ≈ λ₂/λ₁ ≈ 0,38 katına iner.
k = 7: x = (0,5274, 0,8496); λ ≈ 3,61803; hata 1,9 · 10⁻³. Her adımda ≈ λ₂/λ₁ ≈ 0,38 katına iner.
k = 8: x = (0,5264, 0,8503); λ ≈ 3,61803; hata 7,3 · 10⁻⁴. Her adımda ≈ λ₂/λ₁ ≈ 0,38 katına iner.
k = 9: x ≈ (0,5260, 0,8505) ≈ v₁ = (0,5257; 0,8507), λ ≈ 3,618034; hata ≈ 2,8 · 10⁻⁴. Hata grafiği log ölçekte bir doğru: doğrusal (geometrik) yakınsama.
Power Iteration
Power Iteration: Java ve Bir 3 × 3 Örnek
double[] kuvvet(double[][] a, int adim) { int n = a.length; double[] x = new double[n]; Arrays.fill(x, 1.0); // x₀ ≠ 0 for (int k = 0; k < adim; k++) { double[] y = new double[n]; for (int i = 0; i < n; i++) // y = A·x for (int j = 0; j < n; j++) y[i] += a[i][j] * x[j]; double norm = 0; for (double yi : y) norm += yi * yi; norm = Math.sqrt(norm); for (int i = 0; i < n; i++) // ‖x‖ = 1 x[i] = y[i] / norm; } return x; }
Örnek matris (satırlar):
(0,511 0,32 0,12) · (0,211 0,62 0,12) · (0,311 0,12 0,16); x₀ = (1, 1, 1)
| k | x₁ | x₂ | x₃ | ‖A·x‖ |
|---|---|---|---|---|
| 1 | 0,6474 | 0,6474 | 0,4023 | 1,4690 |
| 2 | 0,6533 | 0,6533 | 0,3827 | 0,8974 |
| 3 | 0,6539 | 0,6539 | 0,3807 | 0,9005 |
| 4 | 0,6539 | 0,6539 | 0,3805 | 0,9008 |
| 5 | 0,6539 | 0,6539 | 0,3805 | 0,9008 |
| 6 | 0,6539 | 0,6539 | 0,3805 | 0,9008 |
| 8 | 0,6539 | 0,6539 | 0,3805 | 0,9008 |
‖A·x‖ → λ₁ = 0,9008; v₁ ∝ (0,6539; 0,6539; 0,3805). λ₂/λ₁ = 0,3/0,9008 ≈ 0,33 → hızlı yakınsama.
Power Iteration
Power Iteration: Sınırlar ve Uygulamalar
Güçlü yanları
- Çok basit; yalnızca matris–vektör çarpımı.
- Seyrek ve dev matrislerde (milyarlarca satır) uygulanabilir.
- Bellek O(n): matris değiştirilmez.
Sınırları
- Yalnızca baskın özdeğeri bulur.
- |λ2| ≈ |λ1| ise çok yavaş; |λ1| = |λ2| ise yakınsamayabilir.
- x0, v1'e dik seçilirse (c1 = 0) kuramsal olarak başarısız olur.
- PageRank: web bağlantı matrisinin baskın özvektörü sayfaların önemini verir.
- Türevler: ters yineleme (en küçük özdeğer), kaydırmalı yineleme, Lanczos/Arnoldi; PCA'da ilk temel bileşen.
Özet
Özet
| Problem | Algoritma | Oran | Süre |
|---|---|---|---|
| TSP (genel) | en yakın komşu (sezgisel) | garanti yok | O(n²) |
| Metrik TSP | MST + önce-kök + kısayol / Christofides | 2 / 1,5 | O(n²) / O(n³) |
| TSP | 2-opt yerel arama | garanti yok | O(n²) / tarama |
| Makine çizelgeleme | liste çizelgeleme / LPT | 2 − 1/m / 4/3 − 1/(3m) | O(n log m) / O(n log n) |
| Son tarihli iş sıralama | kâr sıralı, en geç boş dilim | 1 (optimal) | O(n²) |
| Düğüm kapsama | kenar seç, iki ucu ekle | 2 | O(V + E) |
| 0/1 sırt çantası | max(oran sıralı, en iyi tek eşya) / FPTAS | 2 / 1 + ε | O(n log n) / O(n³/ε) |
| Baskın özdeğer | Power Iteration | hata ∝ |λ₂/λ₁|k | O(n²) / adım |
Özet
Etkileşimli Simülatörler
Özet
Sık Yapılan Hatalar
Özet
Örnek Problemler
- Bir en küçükleme probleminde algoritma 30, optimum 20 buluyor. Bu girdi için oran nedir?
- 5 şehirlik matriste (TSP slaytı) en yakın komşuyu 2 numaralı şehirden başlatın: tur ve uzunluk?
- 1–2–3–4–5–6 yolunda kenarlar (1,2), (2,3), …, (5,6) sırasıyla işlenirse 2-yaklaşım kaç düğüm seçer? Optimum?
- m = 2, işler 3, 3, 2, 2, 2: liste çizelgeleme ve LPT Cmax'ı ve optimum nedir?
- İşler (kâr, son tarih): a(100, 2), b(19, 1), c(27, 2), d(25, 1), e(15, 3). Açgözlü sıralama ve toplam kâr?
- W = 10, eşyalar (2, 1) ve (10, 10) (değer, ağırlık): oran sıralı açgözlü ve iyileştirilmiş kural ne bulur?
Cevapları göster
- C/C* = 30/20 = 1,5.
- 2 → 0 (15) → 1 (10) → 3 (25) → 4 (40) → 2 (35): 125.
- (1,2), (3,4), (5,6) seçilir → 6 düğüm; optimum {2, 4, 5} → 3; oran tam 2.
- Liste: 3 | 3, sonra 2 → M1 (5), 2 → M2 (5), 2 → M1 (7) → 7; LPT aynı sıra → 7; optimum {3, 3} | {2, 2, 2} = 6; 7/6 = 4/3 − 1/6 (sınır sıkı).
- Sıra a, c, d, b, e; a → dilim 2, c → dilim 1, d ve b sığmaz, e → dilim 3: c, a, e, kâr 142.
- Açgözlü önce (2, 1) alır, (10, 10) sığmaz → 2; iyileştirilmiş kural: max(2, 10) = 10 = optimum.
Özet
Alıştırmalar
- a(0,0), b(4,3), c(4,0), d(0,3) ve turda (a,b), (c,d) kenarları var. 2-opt kazancı Δ nedir?
- m = 3 için liste çizelgelemenin 5/3 oranına ulaştığı bir iş listesi kurun.
- K5 tam çizgesinde 2-yaklaşım kaç düğüm seçer? Optimum kaçtır?
- A = [[2, 0], [0, 1]], x0 = (1, 1). xk'nın ikinci bileşeni birincisinin 10⁻³'ünden kaç adımda küçük olur?
- İşleri son tarihe göre sıralayan bir açgözlü kod düşünün. Bunun yanlış sonuç verdiği bir örnek bulun.
- 2-yaklaşımı, seçilen eşlemeyi de döndürecek biçimde Java ile yazın.
Cevaplar / ipuçları
- d(a,c) + d(b,d) − d(a,b) − d(c,d) = 4 + 4 − 5 − 5 = −2 → hamle yapılır.
- Altı adet 1 birimlik iş, sonra bir 3 birimlik iş: liste 2 + 3 = 5; optimum {3} | {1,1,1} | {1,1,1} = 3 → 5/3.
- İki ayrık kenar seçilir → 4 düğüm; optimum n − 1 = 4 (oran 1).
- xk ∝ (2k, 1): 2−k < 10⁻³ → k = 10 (2¹⁰ = 1024).
- (kâr, son tarih) = (10, 1), (40, 2), (30, 2): son tarih sırası 10 → dilim 1, 40 → dilim 2, 30 sığmaz → 50. Kâr sırası 40 → dilim 2, 30 → dilim 1 → 70.
- İki ucu da işaretsiz kenarı eşlemeye ekleyip iki ucu işaretleyin; kapsama = eşlemenin uçları.
Özet
Kaynaklar
- Cormen, Leiserson, Rivest ve Stein, Introduction to Algorithms, 4. baskı, 2022 (Bölüm 35: Approximation Algorithms).
- V. V. Vazirani, Approximation Algorithms, Springer, 2001.
- D. P. Williamson ve D. B. Shmoys, The Design of Approximation Algorithms, Cambridge University Press, 2011.
- R. L. Graham, "Bounds on Multiprocessing Timing Anomalies", SIAM Journal on Applied Mathematics 17(2), 1969.
- N. Christofides, "Worst-Case Analysis of a New Heuristic for the Travelling Salesman Problem", Rapor 388, Carnegie Mellon Üniversitesi, 1976.
- M. Sipser, Introduction to the Theory of Computation, 3. baskı, 2012 (3-SAT → düğüm kapsama indirgemesi).
- G. H. Golub ve C. F. Van Loan, Matrix Computations, 4. baskı, 2013 (Power Iteration).