Açgözlü algoritma kanıtlamak nasıl doğru


29

Doğru olabileceğinden şüphelendiğim açgözlü bir algoritma var ama emin değilim. Doğru olup olmadığını nasıl kontrol edebilirim? Açgözlü bir algoritmayı doğrulamak için kullanılacak teknikler nelerdir? Ortak kalıplar veya teknikler var mı?

Bunun yeni başlayanlara işaret etmek için kullanılabilecek bir referans sorusu olacağını umuyorum ; dolayısıyla normalden daha geniş kapsamı. Lütfen en az bir örnekle gösterilen, ancak yine de birçok durumu kapsayan genel, didaktik olarak sunulan cevaplar vermeye özen gösterin. Teşekkürler!



Açgözlü bir algoritmanın bir matroid veya bir greedoid kullanarak doğru olduğunu ispatlayabilir miyiz?
zdm

Yanıtlar:


24

Sonuçta, matematiksel bir doğruluk kanıtına ihtiyacınız olacak. Aşağıda bunun için bazı kanıt tekniklerini kullanacağım, ama önce, buna dalmadan önce, size biraz zaman kazandıracağım: bir kanıt aramadan önce rastgele test yapmayı deneyin.

Rastgele test

İlk adım olarak, algoritmanızı test etmek için rastgele testler kullanmanızı öneririm. Bunun ne kadar etkili olduğu şaşırtıcı: benim açımdan, açgözlü algoritmalar için rastgele testlerin makul derecede etkili olduğu görülüyor. Algoritmanızı kodlamak için 5 dakika harcayın ve bir kanıt bulmaya çalışırken kendinizi bir ya da iki saatten tasarruf edebilirsiniz.

Temel fikir basit: algoritmanızı uygulayın. Ayrıca, doğru olduğunu bildiğiniz bir referans algoritması uygulayın (örneğin, tüm olasılıkları ayrıntılı olarak deneyen ve en iyisini alan bir algoritma). Referans algoritmanızın asimptotik olarak verimsiz olması sorun değil, çünkü bunu sadece küçük problem örneklerinde çalıştırabilirsiniz. Ardından, rastgele bir milyon küçük sorun örneği oluşturun, her iki algoritmayı da çalıştırın ve aday algoritmanızın her durumda doğru cevabı verip vermediğini kontrol edin.

Ampirik olarak, eğer aday açgözlü algoritmanız yanlışsa, genellikle bunu rastgele testler sırasında keşfedeceksiniz. Tüm test durumlarında doğru gibi görünüyorsa, bir sonraki adıma geçmelisiniz: Matematiksel bir doğruluk kanıtı ile gelmek.

Matematiksel doğruluk kanıtları

Tamam, bu nedenle açgözlü algoritmamızın doğru olduğunu ispatlamamız gerekiyor: en uygun çözümü ürettiğini (ya da eşit derecede iyi olan birden fazla optimal çözüm varsa, bunlardan birini çıkardığını).

Temel ilke sezgiseldir:

Prensip: Asla kötü bir seçim yapmazsan, tamam diyeceksin.

Açgözlü algoritmalar genellikle bir dizi seçeneği içerir. Temel kanıt stratejisi, algoritmanın asla kötü bir seçim yapmadığını kanıtlamaya çalışacağımızdır. Açgözlü algoritmalar geri adım atamaz - bir seçim yaptıklarında, kararlıdırlar ve bu seçimi geri almazlar - bu yüzden asla kötü bir seçim yapmamaları çok önemlidir.

İyi bir seçenek olarak ne sayılır? Tek bir optimal çözüm varsa, neyin iyi bir seçim olduğunu görmek kolaydır: optimum çözüm tarafından yapılan ile aynı olan herhangi bir seçenek. Başka bir deyişle, açgözlü algoritmaların yürütülmesinin herhangi bir aşamasında, algoritma tarafından yapılan seçeneklerin sırasının, optimal çözümün bazı önekleriyle tam olarak eşleştiğini kanıtlamaya çalışacağız. Birden fazla eşit derecede iyi en iyi çözüm varsa, iyi bir seçim, en az bir tane ile en uygun olanıdır. Başka bir deyişle, algoritmanın şu ana kadarki tercih dizisi, en uygun çözümlerden birinin önekiyle eşleşirse, şu ana kadar her şey yolundadır (henüz hiçbir şey ters gitmedi).

Hayatı basitleştirmek ve dikkat dağıtıcı şeyleri ortadan kaldırmak için, bağın olmadığı duruma odaklanalım: tek ve benzersiz bir optimum çözüm var. Tüm makineler, temelde herhangi bir değişiklik olmadan aynı anda çok iyi optima olabileceği duruma gelecektir, ancak teknik detaylar konusunda biraz daha dikkatli olmalısınız. Bu ayrıntıları yok sayarak ve en uygun çözümün benzersiz olduğu duruma odaklanarak başlayın; Bu neyin gerekli olduğuna odaklanmanıza yardımcı olacaktır.

Kullandığımız çok yaygın bir kanıt deseni var. Algoritmanın aşağıdaki özelliğini ispatlamak için çok çalışacağız:

İddia: Let algoritması ile çözelti çıkışı ve uygun çözüm. Eğer farklıdır , o zaman çimdik başka bir çözüm elde etmek farklıdır ve kesinlikle daha iyi .O S O O O * O ÇSOSOOOOO

Bunun neden faydalı olduğuna dikkat edin. Eğer iddia doğru ise, algoritmanın doğru olduğunu izler. Bu temelde çelişki ile bir kanıtıdır. Her iki aynıdır ya da farklıdır. Farklı ise, o zaman başka bir çözüm bulabilirsiniz kesinlikle daha iyi olduğunu - ama biz tanımlandığı gibi olduğu, bir çelişki optimal çözüm olmak ve bundan daha var herhangi bir çözüm olamaz. Bu yüzden farklı olamayacağı sonucuna vardık ; her zaman eşit olmalıÇ Ç * Ç Ç S O S OSOOOOSOSOyani açgözlü algoritma her zaman doğru çözümü ortaya çıkarır. Yukarıdaki iddiayı ispatlayabilirsek, algoritmamızı doğru kanıtladık.

İnce. Öyleyse iddiayı nasıl kanıtlarız? çözümünü , algoritma tarafından yapılan seçim sırasına karşılık gelen bir vektör düşünüyoruz ve benzer şekilde, bir vektör olarak en uygun çözümünü yol açacak seçeneklerin sırasına karşılık gelir . Eğer , farklıysa, indeksi var olmalıdır ; burada ; Biz en küçük Böyle odaklanacağız . Sonra, çimdik edeceğiz değiştirerek içinde biraz( S 1 , ... , S , n ) n, O ( O 1 , ... , O , n ) O S O i S iO i i O O i S i O i O *S(S1,,Sn)nO(O1,,On)OSOiSiOiiOOiinci pozisyon maç için , yani biz optimal çözüm çimdik edeceğiz değiştirerek açgözlü algoritma tarafından seçilen birine inci seçim, sonra göstereceğiz ki daha yüksek çözüme bu yol açar. Özellikle, gibi bir şey tanımlayacağızSiOiO

O=(O1,O2,,Oi1,Si,Oi+1,Oi+2,,On),

bunun dışında, genel tutarlılığı korumak için bölümünü hafifçe değiştirmeniz gerekecektir. Kanıtlama stratejisinin bir kısmı, uygun şekilde tanımlanmasında bir miktar zekâ içerir . O zaman, ispatın eti bir şekilde algoritma hakkındaki gerçekleri ve kesinlikle daha iyi olduğunu gösterme problemini kullanıyor olacak ; Probleme özgü bazı görüşlere ihtiyacınız olacak yer burasıdır. Bir noktada, kendi probleminizin detaylarına dalabilirsiniz. Fakat bu size açgözlü bir algoritma için tipik bir doğruluk kanıtı yapısının anlaşılmasını sağlar.O O OOi+1,Oi+2,,OnOOO

Basit bir örnek: Maksimum toplam ile altküme

Basit bir örnekle detaylı olarak çalışarak bunu anlamak daha kolay olabilir. Aşağıdaki sorunu göz önüne alalım:

Giriş: Bir tam sayı kümesi , bir tam sayı Çıkış: Toplam değeri olabildiğince büyük olan boyutunda bir küme kümesik S U kUk
SUk

Bu problem için doğal bir açgözlü algoritma var:

  1. Ayarı .S:=
  2. For : i:=1,2,,k
    • Let en büyük sayı henüz alınmamışsa (yani de inci büyük sayı ). Ekle için . U i U x i SxiUiUxiS

Rastgele test, bunun her zaman en uygun çözümü verdiğini gösterir, bu yüzden bu algoritmanın doğru olduğunu resmen kanıtlayalım. En uygun çözümün benzersiz olduğunu, bu nedenle bağlar konusunda endişelenmemize gerek olmadığını unutmayın. Yukarıda belirtilen iddiayı ispatlayalım:

Talep: , bu algoritma tarafından ve girişlerinde en iyi çözüm olan çözüm çıktısı olsun . Eğer , o zaman başka bir çözüm gerçekleştirebilmesi miktarı toplamı daha büyük olan .U , k O S O O OSU,kOSOOO

Kanıt. Varsayalım ve izin i ilk indeksi olarak yineleme burada X iO . (Böyle bir indeks i biz kabul ettik beri var olmalıdır S O ve algoritmanın tanım gereği sahip olduğumuz S = { x 1 , ... , x k } .) (Varsayımı ile) bu yana i minimal, biz olmalı x 1 , , x i - 1O ve özellikleSOixiOiSOS={x1,,xk}ix1,,xi1O , O = { x 1 , x 2 , , x i - 1 , x i , x i + 1 , , x n } biçimine sahiptir, burada x 1 , , x i - 1 , x i , , x nOO={x1,x2,,xi1,xi,xi+1,,xn}x1,,xi1,xi,,xnazalan düzende listelenir. Algoritmanın nasıl seçtiğine baktığımızda, tüm j i için x i > x j olması gerektiğini görüyoruz . Özellikle, x i > x i . Bu nedenle tanımlama, O = O { x i } { x ' i } , yani elde ederiz O * silerek i inci sayısı Ox1,,xixi>xjjixi>xiO=O{xi}{xi}OiOve ekleyerek . Şimdi elemanlarının toplamı O * elemanlarının toplamı O artı x i - X ' i , ve x i - x ' i > 0 , yani O * 'in toplamından daha kesin büyüktür O s toplamı'. Bu iddia kanıtlıyor. xiOOxixixixi>0OO

Buradaki sezgi, eğer açgözlü algoritma ile tutarlı olmayan bir seçim yaparsa, o zaman açgözlü algoritma tarafından seçilen öğeyi o aşamada içerecek şekilde değiştirilmişse O'nun daha iyi olabileceğini kanıtlayabiliriz . Yana Ç uygunudur geriye kalan tek ihtimal bizim varsayım yanlış olduğunu bu yüzden muhtemelen daha iyi (yani bir çelişki olurdu) yapmak için herhangi bir şekilde olamaz: başka bir deyişle, açgözlü algoritma bir seçim yapmak asla ile tutarsız o .OOOO

Bu argüman genellikle değişim argümanı veya değişim lemi olarak adlandırılır . İlk yerde bulunan burada hırslı çözeltiden uygun çözüm farklıdır ve bu alışveriş elemanının hayal (değiş tokuş karşılık gelen hırslı seçim için X ' i için x i ). Bazı analizler bu değişimin yalnızca en uygun çözümü geliştirebileceğini gösterdi - ancak tanım gereği, en uygun çözüm geliştirilemez. Dolayısıyla tek sonuç, optimal çözümün açgözlü çözümden farklı olduğu hiçbir yer olmaması gerektiğidir. Farklı bir probleminiz varsa, bu değişim prensibini sizin özel durumunuzda uygulama fırsatlarını araştırın.Oxixi


Bu eski bir soru, ancak Google’da benim için ilk sonuç. Hat then we can tweak O to get another solution O∗ that is different from O and strictly better than Obeni şaşırtıyor. Birden fazla optimal çözüm varsa, S != Oyine de en uygun olmak mümkündür ; O'yu "daha fazla" olması için S (O creating yaratma) ve yine de (değil ) O kadar iyi olabilirizstrictly better than .
citelao

@citelao, aklını karıştırdığını duyduğuma üzüldüm. Ne yazık ki, daha net bir şekilde nasıl açıklayacağımı bilmiyorum. Evet, hepsi aynı değerde birden fazla optimal çözüm olabilir. Bu doğru. Yazdıkların ve yazdıklarımın ikisi de geçerlidir; çelişki yoktur. Aradaki fark, yazdıklarınızın açgözlü bir algoritmanın doğru olduğunu kanıtlamaya yardımcı olmamasıdır; yazdığım şeyi yapıyor. Sadece yazdıklarımı tekrar gözden geçirmeyi önerebilirim ve yazdıklarımın ne kadar yararlı olduğunu bulabilecek misiniz bir bakın. Bu işe yaramazsa, belki farklı bir yazı buluruz. Bunun zor ve kafa karıştırıcı olduğunun farkındayım.
DW

1
hızlı cevabınız için teşekkür ederim! Algoritmayı kanıtlamaya odaklandığınız noktayı özledim, eğer varsa a single, unique optimal solution. Bu soru herhangi bir açgözlü algoritmayı doğrulamakla ilgili olduğu için, birden fazla optimal çözümün mevcut olabileceği durumlar için bir cevap vermek istiyorum. Tüm bunları okuduğumdan bu yana bir süre geçti, ancak her bir O_i elementini alg'ten farklı olan herhangi bir optimal çözüm O ile değiştirebileceğinizi kanıtlamak yeterli değil. S_i ile çözüm S ve hala O ' dan daha kötü olmayan bir çözüm O' var mı?
citelao

@citelao, teknik aynı zamanda birden fazla optimal çözüm olan durumlar için de geçerlidir. Optimum çözümün benzersiz olduğu duruma odaklanmayı önerdim, çünkü bunu ilk gördüğünüzde bu kanıtların o ortamda nasıl çalıştığını anlamak daha kolaydır. Fakat aynı strateji birden fazla optimal çözüm olsa bile işe yarıyor. Bunu incelemeyi, tek bir optimal çözüm olduğunda nasıl çalıştığını anladığınızdan emin olduktan sonra genel davaya uygulamanızı öneriyorum. Ayrıca açgözlü algoritmalar için birkaç örnek kanıtı incelemenin sizin için yardımcı olacağını düşünüyorum.
DW

İkinci sorunuza cevap vermek için, hayır, bu yeterli değil. Bu S'nin optimal olduğunu kanıtlamaz. (Sadece O'nun O'dan daha kötü olmamasını talep ediyorsanız, S'nin alt-optimal olduğu durumlar vardır, ancak bu tür bir değişimi yapmak mümkündür. O halde O'dan daha kötü olmayan bir O 'elde etmenin mümkün olduğunu kanıtlamak 't S en uygunudur ve açgözlü algoritma doğru olduğunu kanıtlamaz olmadığı hakkında bir şey ispat ben yöntem biraz daha yanıt açıklandığı okuyan önermek Bu aldatıcı çelişki tarafından Kanıtı anlamak çoğu kez zordur)....
DW

14

Örnek olarak aşağıdaki basit sıralama algoritmasını kullanacağım:

repeat:
  if there are adjacent items in the wrong order:
     pick one such pair and swap
  else
     break

Doğruluğunu kanıtlamak için iki adım kullanıyorum.

  • İlk önce algoritmanın daima sona erdiğini gösteriyorum.
  • Sonra, sonlandırdığı çözümün istediğim çözüm olduğunu gösteriyorum.

İlk olarak, algoritmanın her adımda geliştirdiğini gösterebileceğim uygun bir maliyet fonksiyonu seçiyorum.

AA[i]A[j]A[i]>A[j]i<j

A[i]A[i+1]A[i],A[i+1]

Bu, algoritmanın sonunda sona erdiğini kanıtlar.

Sıralanan bir listedeki inversiyon sayısı 0'dır. Her şey yolunda giderse, algoritma inversiyon sayısını 0'a düşürür. Yalnızca yerel minimumda sıkışıp kalmayacağını göstermemiz gerekir.

Bunu genellikle çelişki ile kanıtlarım. Algoritmanın durduğunu, ancak çözümün doğru olmadığını kabul ediyorum. Örnekte, bu, listenin henüz sıralanmadığı, ancak yanlış sırada bitişik öğe olmadığı anlamına gelir.

A[i]A[j]i<jA[i]>A[j]iji+1<jA[i]<A[i+1]A[i+1]<A[j]A[i]<A[j]

Bu, algoritmanın yalnızca liste sıralandığında durduğunu kanıtlar. Ve bu yüzden bitti.


Açıklanan teknikler o kadar genel ki, bu sorunun konusu olan açgözlü algoritma hakkında neredeyse hiçbir özelliğe sahip değiller.
Apass.Jack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.