Dinamik programlama Brute force'den nasıl farklı?


19

Aşağıdaki alıntıyla karşılaştığımda Dinamik Programlama üzerine okuyordum

Dinamik bir programlama algoritması sorunu çözmek için olası tüm yolları inceleyecek ve en iyi çözümü seçecektir. Bu nedenle, dinamik programlamayı kabaca , en iyisini seçmek için mümkün olan tüm çözümleri gözden geçirmemizi sağlayan akıllı, kaba kuvvet yöntemi olarak düşünebiliriz . Sorunun kapsamı, mümkün olan tüm çözümlerden geçmek mümkün ve yeterince hızlı olacaksa, dinamik programlama en uygun çözümü bulmayı garanti eder

Aşağıdaki örnek verildi

Örneğin, belirli bir şehirde, acele saatinde A noktasından B noktasına mümkün olduğunca hızlı gitmeniz gerektiğini varsayalım. Dinamik bir programlama algoritması, trafik raporunun tamamını inceleyebilir, alabileceğiniz tüm olası yol kombinasyonlarına bakar ve ancak o zaman size en hızlı şekilde hangi yolun olduğunu söyler. Tabii ki, algoritma bitene kadar bir süre beklemeniz gerekebilir ve ancak o zaman sürüşe başlayabilirsiniz. Alacağınız yol en hızlı olacak (dış ortamda hiçbir şeyin değişmediği varsayılarak)

Brute Force en iyi çözüme karar vermeden önce mümkün olan her çözümü deniyor.

Dinamik Programlama'nın , en iyiyi seçmeden önce olası tüm çözümlerden geçmesi durumunda Brute Force'tan farkı nedir, gördüğüm tek fark Dinamik Programlamanın ek faktörleri (bu durumda trafik koşulları) dikkate almasıdır.

Dinamik Programlama Brute Force yönteminin bir alt kümesi olduğunu söylemek doğru mudur?


1
Trafik koşulları kırmızı bir ringa balığıdır. Bunları herhangi bir algoritmada düşünebilirsiniz.
Yuval Filmus


İlk teklifiniz dinamik programlamayı tanımlamıyor.
reinierpost

@reinierpost Peki, oraya varmaya çalışıyorintelligent, brute force , ama sonra "akıllı" kısmı tanımlamayı unutuyor
Izkata

@Izkata Bu akıl yürütme ile, her algoritma "akıllı kaba kuvvet" tir (zaten bir oksimoron).
Raphael

Yanıtlar:


17

Dinamik bir programlama algoritması sorunu çözmek için olası tüm yolları inceleyecek ve en iyi çözümü seçecektir.

Bu ifade sadece yanlıştır.

Dinamik programlama nükslerin do (genellikle) bazı şemaya göre daha küçük örneklerini içine verilen sorun örneğini bölmek mümkün olan tüm yöntemleri deneyebilirsiniz. Bununla birlikte, tüm kısmi problemlerin tüm çözümlerini birbiriyle birleştirmeyecek ve en iyisini seçmeyecektir - sadece en uygun kısmi çözümleri birleştirir (ve bunlardan en iyisini alır).

Bunun orijinal problem için en uygun çözümü vermesi önemsiz değildir ve aslında sadece bazı problemler için geçerlidir. Yani Bellman'ın iyimserlik ilkesini ( düzenli olarak alıntılanan en balıklı, yanlış anlaşılmış "tanımlardan") karşılayanlar. Bununla ilgili daha fazla düşünce için buraya bakın .

Somut bir örnek olarak, dikkate Bellman-Ford algoritması tam bir grafiktir ilgili birim ağırlıkları ile: bu sadece bir uzunlukta bir ve iki yolları (yani dikkate Θ ( n 2 ) , çünkü çok) bir kenarı kullanan tüm en uygun olan . Ancak izin verilen maksimum kenar sayısını ve hala ( n - 1 ) sınırlamıyorsanız sonsuz sayıda çözüm vardır ! her düğümün yalnızca bir kez kullanılmasına izin verirseniz, çoğu. Yani açıkça, Bellman-Ford - dinamik programlama algoritması - yok değil bir kaba kuvvet arama gerçekleştirmek.KnΘ(n2)(n1)!


"Bu ifade sadece yanlış" - Düzelt .
nmclean

4
@nmclean Wikipedia'da algoritma ile ilgili makaleleri düzenleme konusundaki deneyimim hoş bir şey değildi, bu yüzden hayır. Zamanımı buraya yatırmayı tercih ederim.
Raphael

Şansımı denedim ve makaleyi düzenledim. Umarım şimdi biraz daha az yanlıştır.
C4stor

9

Dinamik Programlama, hesaplamayı yeniden kullandığı için akıllıdır , ancak kaba kuvvet bunu yapmaz. Çözelim, f (6), her ikisinin de f (3) olarak adlandırdığı 2 alt problemi çözmeniz gerekir. Kaba kuvvet yöntemi f (3) 'ü iki kez hesaplar, böylece dinamik programlama bir kez çağırır, gelecekteki hesaplamaların kullanması gerektiğinde sonucu kaydeder. Birçok problemde dinamik, kaba kuvvetin polinom karmaşıklığına üstel karmaşıklığını geliştirir.


9
Bu memoizasyon , DP'nin kullandığı birçok hileden sadece biri.
Ben Voigt

4
Hafızalı kaba kuvvet hala verimsizdir; sadece DP yinelemeleri tarafından sağlanan ek yapı / budama, not ödemesini sağlar.
Raphael

3
Dinamik programlama hakkında hiçbir şey bilmiyorum, ancak bunun kaba kuvvet algoritmasına önbellek eklemekten daha fazlası olduğuna eminim. Bence dinamik programlama, problem alanını alt bölümlere ayırarak, her küçük alt bölüm için en uygun çözümü bularak ve daha sonra genel olarak en iyi çözümü oluşturmak için birleştirerek olası tüm kombinasyonları test etmekten kaçındığını düşünüyorum. (Bunu yinelemeli olarak yapabilir, alt bölümlere alt dalabilir.) Bu, yalnızca sorunu böyle çözümlerin birleşmesine izin verecek şekilde ifade edebiliyorsanız ve yine de genel olarak optimum bir şekilde elde ederseniz çalışır.
Jonathan Hartley

1
Bu cevap aslında oldukça doğru. Dinamik programlama hakkında daha fazla bilgi edinmek için Cormen et al: "Algoritmalara Giriş" gibi bir ders kitabı okumanızı tavsiye ederim, bu kitabın oldukça iyi bir bölümü var. Özetle, verimli dinamik programlama çözmek istediğiniz (optimizasyon) probleminin iki özelliğini kullanır: daha küçük alt problemlerin optimal çözümlerinden optimum çözümler yapılabilir ve daha küçük alt problemlerin toplamı aslında daha doğrudur küçük. Ardından, tüm alt sorunlu çözümleri aşağıdan yukarıya doğru oluşturarak hesaplamayı bellek maliyetiyle hızlandırabilirsiniz.
MRA

Daha da basit ifade etmek gerekirse: Pascal üçgenini kullanarak bir binom katsayısını nasıl hesaplayacağınızı biliyorsanız, dinamik programlama hakkında bilmeniz gereken her şeyi bilirsiniz.
MRA

3

Wikipedia makalesinin yapmaya çalıştığı ayrım üç tür algoritma arasındadır:

  1. Olası tüm çözümlerin üzerinden geçen ve en uygun çözümü seçen algoritmalar.

  2. Optimum çözüm alt kümeye ait olacak şekilde seçilen tüm olası çözümlerin bir alt kümesinin üzerinden geçen algoritmalar.

  3. Optimum çözümün alt kümeye ait olduğunu garanti etmeden, tüm olası çözümlerin bir alt kümesinin üzerinden geçen algoritmalar.

İlk iki tür algoritma en uygun çözümü üretirken, üçüncü tür en uygun çözüm yerine "iyi" bir çözüm üretmeyi amaçlamaktadır. Kanımca, ilk iki tür arasındaki ayrım çok net değil.

En kısa yol bağlamında (verdiğiniz örnek) her üç algoritma türü için de basit örnekler vererek başlayayım.

  1. Olası tüm yolları deneyin. Bu kaba kuvvet olarak bilinir .

  2. Şimdiye kadar minimum çözümü takip ederek mümkün olan tüm yolları deneyin. Yapmakta olduğunuz mevcut yol şu ana kadar minimum çözümden daha pahalı olduğunda, onu terk edin ve başka bir yol seçin (mesafenin bölümlere göre hesaplandığını hayal ediyoruz). Buna budama denir .

  3. Haritaya bakın, birkaç yolu düşünün ve aralarından en iyisini seçin. Bu bilgisayar yerine insan için bir algoritmadır.

Bu örnekler oldukça kaba ve belki de çok doğru bir resim çizmiyorlar. Budama birçok durumda çok önemlidir, örneğin bilgisayar satrancı. Merak ediyorsanız , aslında en kısa yol için kullanılan A * algoritmasına bakın .

Dinamik programlama kaba kuvvet algoritmasını önemli ölçüde hızlandırmak için kullanılan bir tekniktir. Bununla birlikte, bunu bu şekilde düşünmek biraz yanıltıcıdır. Optimizasyon problemlerini çözmek için algoritmik bir tekniktir. Budamayı dinamik programlama bağlamında uygulayabilirsiniz.

En kısa yol söz konusu olduğunda, burada dinamik programlamanın bir sürümü bulunmaktadır. Biz haritası önemi olan herhangi bir noktaya indüktif başlangıç noktasından en kısa yolu hesaplamak kullanaraktsegmentleri . Belirli bir veri içintiçin verileri hesaplayabiliriz t+1başlangıç ​​noktasından başka herhangi bir noktaya herhangi bir yoldaki son "sekme" üzerinde numaralandırma yaparak. Ne zamantyeterince büyükse, başlangıç ​​noktasından başka herhangi bir noktaya en kısa yolu bulacağız. Bu, diğer dinamik programlama algoritmaları kadar verimli olmasa da, kaba kuvvetten çok daha etkilidir.


Ve sonra bir adayı tam olarak işlemeden değerlendirmeyi kaldırıyor. Örneğin, minimum toplamı olan negatif olmayan sayılar kümesini bulmak, aslında her bir kümeyi tamamen toplamak zorunda değilsiniz, sadece toplamın mevcut en iyi değeri geçene kadar devam edin. Bu budamaya benzer bir fikirdir ancak diktir. İki fikri birleştirmek, karmaşıklığı azaltan bir sorunun çözüldüğü ve budamayı haklı çıkarmak için kullanıldığı "dal ve sınır" verir.
Ben Voigt

0

Dinamik programlama kaba kuvvetten çok daha hızlıdır. Kaba kuvvet üstel zaman alabilir, dinamik programlama genellikle çok daha hızlıdır.

Kaba kuvvete benzetme çok gevşek. Dinamik programlama, istediğiniz kaba kuvvet algoritmasını almanızı ve verimli hale getirmenizi sağlayan sihirli bir gümüş mermi değildir.


5
Bu bir açıklama değil, bir sonuçtur.
Raphael

-2

Bu çok açık. Dinamik programlama, bir aramayı daraltmak için ek faktörler kullanan bir "arama stratejisidir". Arama uzayda hiçbir çözüm varsa, dinamik programlama olacaktır (genellikle) arama alanının her eleman aracılığıyla bir arama yapın. Ancak bu, kaba kuvvet arayışı olduğu anlamına gelmez.


"Arama alanında bir çözüm yoksa, dinamik programlama (genellikle) arama alanının her öğesinde arama yapar." - yanlış, cevabımı gör.
Raphael

-2

Dinamik programlamanın akıllı kaba kuvvet olduğu ifadesi doğrudur, ancak bu ifadeyle anlaşılması biraz zordur. Dinamik programlamanın amacı genellikle bir problem almak ve onu daha akıllıca küçük parçalara ayırmaktır. Bunu yaptıktan sonra, her küçük parçayı çözmek için kaba kuvvet kullanacaksınız ve daha sonra parçaları nihai bir çözümde birleştirmek için tekrar kaba kuvvet kullanacaksınız. Dolayısıyla dinamik programlamanın bir tür kaba kuvvet çözümü olduğunu söyleyebilseniz de, hile bu kaba kuvveti nasıl kullandığınıza bağlıdır.


1
"Her küçük parçayı çözmek için kaba kuvvet kullanacaksınız" - yanlış. Genellikle aynı yaklaşımı özyinelemeli kullanırsınız.
FrankW
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.