Bir programın 'optimality performansının' herhangi bir tanımı için 'optimality performans' A veya 'optimality performans' B olup olmadığını belirleme sorunu genel olarak kararlaştırılamaz (aşağıdaki kanıt). Bu, bir algoritmanın her zaman ne kadar optimal olduğunu söyleyebilecek tek bir yöntem olmadığı anlamına gelir.
Bununla birlikte, yaklaşım algoritmalarını analiz ederken sıklıkla uygulanan yöntemler vardır. Çoğu zaman, yaklaşık algoritmalar, çözümünün optimum çözümden ne kadar uzakta olduğuna dair garantileri ile değerlendirilir. Oranları ispatlamak için yaygın olarak kullanılan bir yöntem olan 'alt sınır' yöntemini kullanarak kanıtlayacağım örnek bir problem ve yaklaşım vereceğim.
Söz konusu sorun 'Kamyon Yükleme' problemidir: her biri en fazla T ağırlığında bir yük taşıyabilen birçok özdeş kamyonumuz var (istediğimiz kadar). Bu kamyonlara yüklemek istediğimiz n nesnemiz var. Ulaşım. Her nesne i'nin ağırlığı w_i, burada w_i <= T'dir (bu nedenle tek başına bir kamyona sığamayan hiçbir öğe yoktur). Öğeler parçalara bölünemez. Mümkün olduğunca az kamyona ihtiyacımız olması için kamyonları doldurmak istiyoruz. Bu sorun NP-tamdır.
Bu sorun için çok kolay bir yaklaşım algoritması vardır. Kamyon bir sonraki öğe sığmayacak kadar dolu olana kadar, bir kamyonu öğelerle yüklemeye başlarız. Daha sonra başka bir kamyon alıp bu kamyona önceki kamyona uymayan bu ürünle yüklüyoruz. Bu kamyona daha fazla ürün yüklemiyoruz: bunun yerine, yeni bir kamyon alıyoruz, artık yerine oturana kadar tekrar birçok eşya ile dolduruyoruz, son öğeyi kendi kamyonuna tekrar koyduk.
Bu algoritma, sorun için 2 yaklaşım olarak adlandırılır: en uygun çözümün ihtiyaç duyduğundan iki kat daha fazla kamyon kullanır. 'En fazla' çok önemlidir: şanslı olabilir ve en uygun çözümü bulabiliriz, ama en azından çok kötü yapmayacağız.
Bunu kanıtlamak için, öncelikle ihtiyacımız olan en uygun kamyon sayısına bir alt sınır tanımlarız. Bunun için, parçaları parçalara ayırmamıza izin verildiğini hayal edin: daha sonra her kamyonu ancak sonuncuyu tamamen doldurabiliriz. Eğer yapsaydık, ihtiyacımız olan kamyon sayısı, asıl soru için ihtiyacımız olan kamyon sayısı için daha düşük bir sınırdır: 'en iyi' durumda en uygun çözüm her kamyonu tamamen doldurur, bu durumda kamyon sayısı eşittir, ancak eğer optimum çözümler kamyonları doldurmazsa, sadece daha fazla kamyona ihtiyaç duyabilir.
Şimdi yaklaşım algoritmamıza bakıyoruz. Her adımda, iki kamyonu (kısmen) doldurduğumuza dikkat edin. Ayrıca, algoritmanın nasıl çalıştığı ile, ilk kamyondaki ve ikinci kamyondaki ürünün birlikte ilk kamyona sığmayacağını unutmayın, bu nedenle toplamları en az T'dir. Bu, her adımda en az bir tam yük kamyon değerinde iki kamyon. Şimdi alt sınır için bu karşılaştırma: bu durumda, biz öğelerin tam kamyon değerinde yük bir kamyon. Başka bir deyişle, yaklaşım algoritmamız (doğrusal zamanda) alt sınır 'çözümümüze çok benzeyen ancak bir yerine iki kamyon kullanan bir çözümü hesaplar. Bu nedenle, optimal algoritmanın en fazla iki katı kamyon kullanıyoruz, çünkü optimal algoritmanın alt sınırının en fazla iki katı kamyon kullanıyoruz.
Bu algoritma sabit faktörlü bir yaklaşım sağlar: optimal çözümden en fazla 2 kat daha kötüdür. Diğer önlemlere bazı örnekler: en iyi C en uygun çözümden daha fazla (ilave hata, oldukça nadir), en çok c oturum açma zamanı en uygun çözüm kadar kötü, en fazla cn zaman en uygun çözüm kadar kötü, en fazla c 2 ^ (dn) kez en iyi çözüm kadar kötü (çok kötü; örneğin, genel TSP sadece bu tür garantili algoritmaları kabul eder).
Tabii ki, kanıtladığınız faktörün kanıtlayabileceğiniz en iyi faktör olduğundan emin olmak istiyorsanız, algoritmanızın verdiği çözümün gerçekten olabildiğince kötü olduğu örnekleri bulmaya çalışmalısınız.
Ayrıca NP-zor olmayan problemlerde bazen yaklaşım algoritmaları kullandığımızı da unutmayın.
Bunu üniversitemdeki yaklaşım algoritmaları dersinde öğrendim.
Kararsızlık kanıtı: P'nin bir sorun olmasına ve A ve B'nin, A ve B'nin 'duyarlılığın' mantıklı bir tanımı için aynı 'optimallik'e sahip olmadığı ve A ve B'nin çalışma süresinin hem omega olduğu P için yaklaşım algoritmaları olmasına izin verin (1) (sabit zamandan kesinlikle daha yavaş, yani daha büyük durumlar için daha yavaş olurlar) ve A ve B'nin her zaman durduğu yerler.
D, aşağıdakileri hesaplayabileceğini iddia eden bir program olsun: P için yaklaşık bir hesaplama hesaplayan bazı program C verildiğinde, yeterince büyük girdiler için A kadar iyi veya B kadar iyi olup olmadığına karar verin (bu nedenle programları kategorilere ayırmak için bunu kullanabilirsiniz iyimserliklerine göre).
Ardından durma problemini çözmek için D'yi kullanabiliriz. E bir program olsun ve F bu program için bir girdi olsun. D'yi E'nin F girişinde durup durmayacağına karar vermek için kullanacağız.
Aşağıdakileri yapan bir program G tasarlıyoruz: P problemi için S girişi verildiğinde, F'de E ve S'de paralel olarak çalışır: E'yi bir süre çalıştırır, sonra A, sonra E ve benzerlerini yürütür. E, F'de durursa, A çalışmasını durdurur ve bunun yerine S'yi B'de çalıştırır ve B'nin sonucunu döndürür. A, E durmadan önce durursa, A sonucunu döndürür.
D'de G kullanılması artık E'nin F üzerinde durup durmadığına karar verir: E F üzerinde durursa, yeterince büyük S girişleri için E, A üzerinde S durmadan önce F durur (çünkü E'nin durması için geçen süre, A'nın aksine giriş). Bu nedenle D, G'nin B'nin optimallik özelliklerine sahip olduğunu bildirir. E, F üzerinde durmazsa, D, G'nin A'nın optimallik özelliklerine sahip olduğunu bildirecektir.