Geri izleme - Backtracking

Geri izleme bir genel algoritma bazılarına tüm (veya bazı) çözümleri bulmak için hesaplama problemleri özellikle kısıtlama tatmin sorunları, çözümlere aşamalı olarak adaylar oluşturur ve bir adayın geçerli bir çözüme tamamlanamayacağını belirlediği anda bir adayı terk eder ("geri dönüşler").[1][2]

Geriye dönük izleme kullanımına ilişkin klasik ders kitabı örneği, sekiz kraliçe yapboz, sekizin tüm düzenlemelerini ister satranç kraliçeler standart olarak satranç tahtası böylece hiçbir kraliçe diğerine saldırmasın. Ortak geri izleme yaklaşımında, kısmi adaylar, k kraliçeler ilk k Tahtanın sıraları, hepsi farklı sıra ve sütunlarda. Karşılıklı olarak saldıran iki kraliçeyi içeren herhangi bir kısmi çözüm terk edilebilir.

Geriye dönük izleme, yalnızca "kısmi aday çözüm" kavramını kabul eden ve bunun geçerli bir çözüme tamamlanıp tamamlanamayacağının nispeten hızlı bir testini kabul eden sorunlar için uygulanabilir. Örneğin, sırasız bir tabloda belirli bir değeri bulmak için yararsızdır. Bununla birlikte, uygulanabilir olduğunda, geri izleme genellikle daha hızlıdır. kaba kuvvet sayımı tek bir testle birçok adayı eleyebildiği için tüm tam adaylar arasında.

Geriye dönük izleme, çözme için önemli bir araçtır kısıtlama tatmin sorunları,[3] gibi bulmacalar, sözel aritmetik, Sudoku ve diğer birçok bulmaca. Genellikle en uygun olanıdır (en verimli değilse[kaynak belirtilmeli ]) tekniği ayrıştırma,[4] için sırt çantası sorunu ve diğeri kombinatoryal optimizasyon sorunlar. Aynı zamanda sözde temeli mantık programlama gibi diller Simge, Planlayıcı ve Prolog.

Geriye dönük izleme, kullanıcı tanımına bağlıdır "kara kutu prosedürleri "çözülecek problemi, kısmi adayların doğasını ve bunların tam adaylara nasıl genişletileceğini tanımlayan. metaheuristik belirli bir algoritmadan ziyade - diğer birçok meta-sezgisel yöntemin aksine, sınırlı bir süre içinde sınırlı bir soruna tüm çözümleri bulmak garantilidir.

"Geri izleme" terimi Amerikalı matematikçi tarafından icat edildi D. H. Lehmer 1950 lerde.[5] Öncü dizi işleme dili SNOBOL (1962) yerleşik bir genel geri izleme tesisi sağlayan ilk kişi olabilir.

Yöntemin açıklaması

Geri izleme algoritması, bir dizi kısmi adaylar bu prensipte olabilir Tamamlandı verilen soruna olası tüm çözümleri vermek için çeşitli şekillerde. Tamamlama, bir dizi ile aşamalı olarak yapılır. aday uzatma adımları.

Kavramsal olarak, kısmi adaylar bir ağaç yapısı, potansiyel arama ağacı. Her bir kısmi aday, ondan tek bir uzatma adımıyla farklılık gösteren adayların ebeveynidir; ağacın yaprakları daha fazla uzatılamayan kısmi adaylardır.

Geri izleme algoritması bu arama ağacının üzerinden geçer tekrarlı, kökten aşağı derinlik birinci derece. Her düğümde calgoritma kontrol eder c geçerli bir çözüme tamamlanabilir. Yapamazsa, tüm alt ağacın kökleri c atlandı (budanmış). Aksi takdirde, algoritma (1), c kendisi geçerli bir çözümdür ve eğer öyleyse bunu kullanıcıya bildirir; ve (2) tüm alt ağaçları özyinelemeli olarak numaralandırır c. Her düğümün iki testi ve çocukları, kullanıcı tarafından verilen prosedürlerle tanımlanır.

bu yüzden gerçek arama ağacı algoritma tarafından geçilen, potansiyel ağacın sadece bir parçasıdır. Algoritmanın toplam maliyeti, gerçek ağacın düğüm sayısı ile her bir düğümü elde etme ve işleme maliyetinin çarpımıdır. Potansiyel arama ağacını seçerken ve budama testi uygularken bu gerçek dikkate alınmalıdır.

Sözde kod

Geriye dönük izlemeyi belirli bir sorun sınıfına uygulamak için, verilerin sağlanması gerekir P çözülecek sorunun belirli bir örneği için ve altı prosedür parametreleri, kök, reddetmek, kabul etmek, ilk, Sonraki, ve çıktı. Bu prosedürler örnek verilerini almalıdır P parametre olarak ve aşağıdakileri yapmalıdır:

  1. kök(P): kısmi adayı arama ağacının kökünde döndür.
  2. reddetmek(P,c): dönüş doğru sadece kısmi aday c tamamlamaya değmez.
  3. kabul etmek(P,c): dönüş doğru Eğer c bir çözüm P, ve yanlış aksi takdirde.
  4. ilk(P,c): adayın ilk uzantısını oluştur c.
  5. Sonraki(P,s): uzantıdan sonra bir adayın bir sonraki alternatif uzantısını oluştur s.
  6. çıktı(P,c): çözümü kullanın c nın-nin P, uygulamaya uygun şekilde.

Geriye dönük izleme algoritması, sorunu aramaya indirger bt(kök(P)), nerede bt aşağıdaki özyinelemeli prosedür:

prosedür bt (c) dır-dir    Eğer reddet (P, c) sonra dönüş Eğer kabul et (P, c) sonra çıkış (P, c) s ← önce (P, c) süre s ≠ NULL yapmak        bt (s) s ← sonraki (P, s)

Kullanım konuları

reddetmek prosedür bir boole değerli işlev geri döner doğru yalnızca olası bir uzantı olmadığından eminse c için geçerli bir çözümdür P. Prosedür kesin bir sonuca varamazsa, geri dönmelidir yanlış. Yanlış doğru sonuç neden olabilir bt bazı geçerli çözümleri kaçırma prosedürü. Prosedür şunu varsayabilir: reddetmek(P,t) iade yanlış her ata için t nın-nin c arama ağacında.

Öte yandan, geri izleme algoritmasının verimliliği, reddetmek geri dönen doğru köke mümkün olduğunca yakın olan adaylar için. Eğer reddetmek her zaman geri döner yanlış, algoritma yine de tüm çözümleri bulacaktır, ancak bir kaba kuvvet aramasına eşdeğer olacaktır.

kabul etmek prosedür geri dönmeli doğru Eğer c sorun örneği için eksiksiz ve geçerli bir çözümdür P, ve yanlış aksi takdirde. Kısmi adayın c ve ağaçtaki tüm ataları reddetmek Ölçek.

Yukarıdaki genel sözde kod, geçerli çözümlerin her zaman potansiyel arama ağacının yaprakları olduğunu varsaymaz. Başka bir deyişle, geçerli bir çözüm olasılığını kabul eder. P başka geçerli çözümler sağlamak için daha da genişletilebilir.

ilk ve Sonraki prosedürler geri izleme algoritması tarafından bir düğümün çocuklarını numaralandırmak için kullanılır c ağacın, yani farklı olan adayların c tek bir uzatma adımıyla. Arama ilk(P,c) ilk çocuğunu vermelidir c, bir sırayla; ve çağrı Sonraki(P,s) düğümün sonraki kardeşini döndürmelidir s, bu sırayla. İstenen alt öğe yoksa, her iki işlev de ayrı bir "NULL" aday döndürmelidir.

Birlikte kök, ilk, ve Sonraki işlevler, kısmi adaylar kümesini ve potansiyel arama ağacını tanımlar. Her çözümün P ağacın herhangi bir yerinde oluşur ve hiçbir kısmi aday birden fazla görülmez. Dahası, verimli ve etkili bir reddetmek yüklem.

Erken durdurma çeşitleri

Yukarıdaki sözde kod arayacak çıktı verilen örnek için bir çözüm olan tüm adaylar için P. Algoritma, ilk çözümü veya belirli sayıda çözümü bulduktan sonra duracak şekilde değiştirilebilir; veya belirli sayıda kısmi adayı test ettikten sonra veya belirli bir miktar harcadıktan sonra İşlemci zaman.

Örnekler

Bir Sudoku geri izleme ile çözüldü.

Bulmacaları veya sorunları çözmek için geri izlemenin kullanılabileceği örnekler şunları içerir:

Aşağıdakiler, geriye dönük izlemenin kısıtlama tatmin problemi:

Kısıtlama memnuniyeti

Genel kısıtlama tatmin problemi tam sayıların bir listesini bulmaktan oluşur x = (x[1], x[2], …, x[n]), her biri bir aralıkta {1, 2, …, m}, bazı keyfi kısıtlamaları karşılayan (boole işlevi) F.

Bu sorun sınıfı için örnek verileri P tamsayılar olurdu m ve nve yüklem F. Bu soruna yönelik tipik bir geri izleme çözümünde, kısmi bir aday tamsayıların bir listesi olarak tanımlanabilir. c = (c[1], c[2], …, c[k]), herhangi k 0 ile n, ilkine atanacak k değişkenler x[1], x[2], …, x[k]. Kök aday daha sonra boş liste () olacaktır. ilk ve Sonraki prosedürler o zaman olurdu

işlevi ilk (P, c) dır-dir    k ← uzunluk (c) Eğer k = n sonra        dönüş BOŞ Başka        dönüş (c [1], c [2],…, c [k], 1)
işlevi sonraki (P, s) dır-dir    k ← uzunluk (lar) Eğer s [k] = m sonra        dönüş BOŞ Başka        dönüş (s [1], s [2],…, s [k - 1], 1 + s [k])

Buraya uzunluk(c) listedeki elemanların sayısıdır c.

Arama reddetmek(P, c) geri dönmelidir doğru eğer kısıtlama F herhangi bir listeden tatmin edilemez n ile başlayan tamsayılar k unsurları c. Geri izlemenin etkili olabilmesi için, en azından bazı adaylar için bu durumu tespit etmenin bir yolu olmalıdır. c, hepsini saymadan mnk n-tuples.

Örneğin, eğer F ... bağlaç çeşitli boole koşullarının F = F[1] ∧ F[2] ∧ … ∧ F[p], ve her biri F[ben] değişkenlerin yalnızca küçük bir alt kümesine bağlıdır x[1], …, x[n], sonra reddetmek prosedür basitçe şartları kontrol edebilir F[ben] yalnızca değişkenlere bağlı olan x[1], …, x[k], ve dönüş doğru bu terimlerden herhangi biri geri dönerse yanlış. Aslında, reddetmek yalnızca bağlı olan şartları kontrol etmesi gerekir x[k], çünkü yalnızca bağlı olan terimler x[1], …, x[k − 1] arama ağacında daha yukarılarda test edilecektir.

Varsayalım ki reddetmek yukarıdaki gibi uygulanırsa kabul etmek(P, c) sadece kontrol edilmesi gerekir c tamamlandı mı? n elementler.

Değişkenler listesini en kritik olanlarla (yani en az değer seçeneğine sahip olanlar veya sonraki seçimler üzerinde daha büyük bir etkisi olanlar) başlayacak şekilde sıralamak genellikle daha iyidir.

Bir de izin verebilir Sonraki kısmi bir adayı genişletirken, kendisi tarafından zaten atanmış olan değişkenlerin değerlerine bağlı olarak hangi değişkenin atanacağını seçmek için işlev. Tekniği ile daha fazla iyileştirme elde edilebilir kısıt yayılımı.

Yedeklemede kullanılan minimum kurtarma değerlerini korumaya ek olarak, geri izleme uygulamaları genellikle değer değişikliği geçmişini kaydetmek için değişken bir iz tutar. Geri izleme tüm değişiklikleri tek bir işlem olarak sileceğinden, verimli bir uygulama, seçim noktası olmadığında iki ardışık değişiklik arasında değişken bir iz girişi oluşturmaktan kaçınacaktır.

Değişken ize bir alternatif, bir zaman damgası değişkende son değişikliğin ne zaman yapıldığını gösterir. Zaman damgası, bir seçim noktasının zaman damgasıyla karşılaştırılır. Seçim noktasının, değişkeninkinden sonra ilişkili bir zamanı varsa, seçim noktası gerçekleşmeden önce değiştirildiği için, seçim noktası geriye doğru izlendiğinde değişkeni geri döndürmek gereksizdir.

Ayrıca bakınız

Notlar

Referanslar

  1. ^ Donald E. Knuth (1968). Bilgisayar Programlama Sanatı. Addison-Wesley.
  2. ^ Gurari, Eitan (1999). "CIS 680: VERİ YAPILARI: Bölüm 19: Geri İzleme Algoritmaları". Arşivlenen orijinal 17 Mart 2007.
  3. ^ A. Biere; M. Heule; H. van Maaren (29 Ocak 2009). Memnuniyet El Kitabı. IOS Basın. ISBN  978-1-60750-376-7.
  4. ^ Des Watson (22 Mart 2017). Derleyici Yapısına Pratik Bir Yaklaşım. Springer. ISBN  978-3-319-52789-5.
  5. ^ Rossi, Francesca; Beek, Peter Van; Walsh, Toby (Ağustos 2006). "Kısıt Memnuniyeti: Ortaya Çıkan Paradigma". Kısıt Programlama El Kitabı. Yapay Zekanın Temelleri. Amsterdam: Elsevier. s. 14. ISBN  978-0-444-52726-4. Alındı 2008-12-30. Bitner ve Reingold, 1950'lerde ilk kez "geri izleme" terimini kullanarak Lehmer'e itibar ettiler.

daha fazla okuma

Dış bağlantılar