Bir programcı olduğumu ve onu çözmek için ihtiyacım olan NP-tamam bir sorunum olduğunu varsayalım. NPC problemleriyle başa çıkmak için hangi yöntemler mevcut? Bu konuda bir anket ya da benzeri bir şey var mı?
Bir programcı olduğumu ve onu çözmek için ihtiyacım olan NP-tamam bir sorunum olduğunu varsayalım. NPC problemleriyle başa çıkmak için hangi yöntemler mevcut? Bu konuda bir anket ya da benzeri bir şey var mı?
Yanıtlar:
Bir dizi iyi çalışılmış strateji var; uygulamanızda en iyisi olan durum şartlara bağlıdır.
En kötü vaka çalışma zamanını iyileştirme
Probleme özgü kavrayışı kullanarak, sıklıkla naif algoritmayı geliştirebilirsiniz. Örneğin,Vertex Cover için[1]olanalgoritmaları vardır; Bu,naifüzerinde büyük bir gelişmedir ve sizin için örnek boyutlarını izlenebilir hale getirebilir.C < 1.3 Ω ( 2 N )
Beklenen çalışma zamanını iyileştirme
Sezgisel tarama kullanarak, çoğu zaman hızlı olan algoritmalar geliştirebilirsiniz. Bunlar pratikte tanıştığınızın çoğunu içeriyorsa, altınsınız. Oldukça ilgili çözücülerin var olduğu SAT örnekleri ve Simplex algoritması (bir polinom problemini çözen, ancak yine de). Genellikle yardımcı olan temel tekniklerden biri dallanma ve ciltlenmedir .
Sorunu sınırlayın
Girdilerinizle ilgili daha fazla varsayım yapabilirseniz, sorun daha kolay olabilir.
Sonucu zayıflatma
Bu, hatalı veya eksik sonuçlara müsamaha göstereceğiniz anlamına gelir. İki ana lezzet vardır:
Ayrıntılı bir tedavi için Hromkovič'in Sert Problemleri için Algoritma bölümüne bakın.
Diğer cevaplar bunu daha teorik bir bakış açısıyla ele almıştır. İşte daha pratik bir yaklaşım.
"Tipik" NP-tamamlanmış karar problemleri için ( "bütün bu kısıtlamaları sağlayan bir şey var mı?" ), Bu her zaman ilk önce deneyeceğim şeydir:
Sorunlu örneğinizi bir SAT örneği olarak kodlayan basit bir program yazın .
Sonra iyi bir SAT çözücüsü kullanın , çalıştırın (sahip olduğunuz en hızlı çok çekirdekli bilgisayarı kullanarak) ve ne olduğunu görün.
Ne kadar süre alabileceği hakkında bir fikir edinmek için önce küçük örneklerle çalışın.
Şaşırtıcı bir şekilde, bu yaklaşım, özellikle şu anki sorununuz için kendi çözücünüzü uygulamaya çalışmaktan çok daha iyidir:
SAT çözücüleri çok akıllıca ve iyi optimize edilmişler. Kendi geriye izleme arama uygulamanızı kolayca gerçekleştirir (kodunuzu optimize etmek için ne kadar zaman harcadığınız önemli değil). Ayrıca, tamsayılı doğrusal programlama çözücüler gibi kişisel olmayan birçok alternatifi kolayca geride bırakıyorlar.
Bu çok az programlama gerektirir. Adım 1 nispeten basittir ve performans açısından kritik değildir; Python gibi betik dillerini kullanabilirsiniz. Adım 2 için ihtiyacınız olan herşeyi uygulamaya başlamış olan başka biri zaten var.
Tipik NP-sert optimizasyon problemleri için ( "tüm bu kısıtlamaları sağlayan en küçük şeyi bulun" ) bu yaklaşım işe yarayabilir ya da çalışmayabilir.
Eğer Eğer kolayca bir çevirmek karar problemi ( "tatmin bütün bu kısıtlamalara? Bu büyüklükte 4 bir şeyini orada var yok" , "hangi boyutta 3? Hakkında" , büyük, karar problemleri ile yukarıdaki gibi aynı yaklaşımı izleyin).
Aksi takdirde, küçük bir çözüm bulmaya çalışan bir sezgisel çözücüye başvurmak isteyebilirsiniz (mutlaka en küçük çözüm değil). Örneğin:
Sorununuzu (ağırlıklı) bir MAX-SAT örneği olarak kodlayın .
UBCSAT paketindeki sezgisel çözücüleri kullanın . Sezgisel çözücüler önemsiz biçimde paraleldir; yüzlerce bilgisayarı olan bir bilgisayar kümesi bulmaya çalışın. Çözücüleri istediğiniz kadar çalıştırabilir ve şimdiye kadar bulduğunuz en iyi çözümü alabilirsiniz.
Karşılıksızlığa saldırmanın bir yolu, parametreli karmaşıklık bağlamında problemi düşünmektir.
Gelen parametrized karmaşıklığı bazı parametre (diyelim düzeltilerek sorunu çözmek ). İçinde bazı sorunu çözmek mümkün değilse zaman, biz sorun olduğunu söylemek parametre uysal sabit içinde . Burada sadece bir miktar hesaplanabilir fonksiyondur. FPT olan çok sayıda NP zor problemi vardır, ancak NP'de sabit parametre izlenebilir olmadığına inanılan pek çok problem vardır.f ( k ) ⋅ p ( n ) k f ( k )
Bazı parametreleri düzelterek zamanında bir sorunu çözebilirsek , bu sorunun XP'de olduğu söylenir. XP'nin FPT'ye eşit olmadığına inanıyoruz (tıpkı P inandığımız gibi ). Ancak bu ikisi arasında da birçok sorun var (FPT ve XP) ve biz de bir H-hiyerarşisi olan bir hiyerarşi (aslında birkaç tane) tanımladık. W hiyerarşisinde, NP-sınıfı derslerde indirim gibi indirimleriniz var, sadece çoklu zaman indirimleri aramıyoruz, sadece bir FPT indirimine ihtiyacımız var. W sınıfı [0], FPT sınıfıdır.≠
Bunlar, W hiyerarşisinin farklı sınıflarındaki bazı örnekler:
Bunlar, NP problemlerini daha kesin bir şekilde sınıflandırmak için bir başka karmaşıklık seviyesidir ve daha fazlasını istiyorsanız, Parametreli Devre Karmaşıklığı ve W Hiyerarşisine Downey ve arkadaşlarının (1998) bakabilirsiniz .
Ve eğer daha fazlasını istiyorsanız, Flum ve Grohe'nin Parametreli Karmaşıklık Teorisi'ni okumak iyidir .
Ve sonunda:
Sorun FPTAS'a sahipse (tamamen polinom-zaman yaklaşımı yaklaşımı şeması ) varsa, aynı zamanda FPT'dir (ki bu açıktır) Ama ters yönde iyi bilinen hiçbir şey yoktur, ayrıca PTAS ve XP ilişkisi üzerine bazı çalışmalar vardır, fakat PTAS ve W hiyerarşisi arasındaki ilişki çok sıkı değil (en azından şu anda bilmiyorum).
Ayrıca bazı durumlarda, bazı farklı parametreler belirleyebiliriz, örneğin: grafikteki en uzun yolun uzunluğu sınırlanmış ve bir çözümün boyutu sınırlanmış (örneğin, geribildirim tepe noktası kümesinde), ...
Bazı insanlar parametreleştirilmiş karmaşıklığın pratikte işe yaramaz olduğuna inanıyor olabilir. Ama bu yanlış. Parametrelenmiş algoritmaların çoğu, bazı parametreleri düzeltebileceğiniz gerçek dünya uygulamalarında keşfedilmiştir. İşte size bir örnek:
Parametreli karmaşıklıktaki ana teoremlerden biri, Courcell'e yaptığı gibi , parametreleştirilmiş bazı problem sınıfları için çalışma zamanının bir algoritmasını sağlar . kulenin sayısı dır , yani anlamına gelir . Ancak, bir grup algoritmasını bazı özel modifikasyonlar ile uyguladı ve şu anda Almanya'daki bazı metro istasyonlarında kullanılan tepe örtüsü için oldukça hızlı bir algoritma elde ettiler.2 O ( k ) k = 10
TSP için en hızlı ve en doğru sezgisel algoritmalardan biri şudur: Sorunun parametrelendirilmesini kullanan tur birleştirme ve dal ayrıştırması (doğrudan değil, fakat dal ayrışması ve kullandıkları dinamik programlama yaklaşımı bazı iyi varsayımlara dayanmaktadır).
NP'nin eksiksizliği, en kötü durumda kararsızlıkla ilgilidir. Hangi problem üzerinde çalıştığınıza bağlı olarak, pek çok örnek sınıfı pratikte makul bir sürede çözülebilir (iyi çalışma süreleri için daha özel bir algoritmaya ihtiyaç duyabilirsiniz).
Boolean Satisfiability veya Integer Linear Programming gibi iyi çözücülerle ilgili bir probleminizde probleminizden etkin bir düşüş olup olmadığını görmeyi düşünün.
Genel olarak üç seçeneğiniz var: Birincisi , probleminizin özel durumlarını dikkate almanız . Bazı özel durumlarda, sorunu çözülebilir polynomially örneğin basit bir yolu bulunup bulunmadığının belirlenmesi olabilir için için keyfi yönettiği grafikte NP-Complete ama ne zaman (doğrusal) polinom olacak indirgenemez. İkinci seçenek, sorununuzu çözmek için iyi bir tahmin algoritması kullanmaktır . Tahmin algoritmaları, probleminize en yakın cevapları sağlar. Önceki seçenekleri kullanamazsanız, geriye kalan tek yol şudur : sorununuzu üssel zamanda çözmek için tolere edilebilir bir algoritma kullanmakv j v k G G. Üstel algoritmalar arasında, bazılarının çalışma süresi, probleminizin giriş boyutu belirli bir değerden düşük olduğunda tolere edilebilir.
Bazı cevaplarda kısaca değinilmiş olmasına rağmen, pratikte NP-tamamlanmış problemlerin her zaman çözüldüğünü (veya yaklaştığını) vurgulayayım. NP-komple problemleri pratikte çözebilmenizin ana nedeni şudur:
Uygulamada karşılaşılan örnekler "en kötü durum" değildir.
Tutarsızlık için başka bir nedeni:
Sezgisel algoritmaları resmi olarak analiz etmek zordur.
Uygulamada, NP-tamam problemlerinizi çözmek için sezgisel algoritmalar kullanır ve en iyisini umarsınız. Sonuçlar genellikle çarpıcı.
Diğer cevaplarda değinilen bir başka konu:
Bazen üstel algoritmalar yeterince hızlıdır.
Tabii ki bu soruna bağlı. Büyük veriler söz konusu olduğunda bunun tam tersi bir karşılığımız olur:
Bazen tek uygulanabilir algoritmalar kuasilindir.
Korkarım buradaki kalabalık teorik olarak eğimli. Ana stackexchange sitesinde daha iyi cevaplar alabilirsiniz.