동적 프로그래밍과 Brute Force의 차이점


19

다음 인용문을 보았을 때 동적 프로그래밍 에 대해 읽었습니다.

동적 프로그래밍 알고리즘은 가능한 모든 방법으로 문제를 해결하고 최상의 솔루션을 선택합니다. 따라서 우리는 동적 프로그래밍을 가능한 모든 솔루션을 통해 최상의 솔루션을 선택할 수 있는 지능적이고 무차별 한 방법 이라고 생각할 수 있습니다 . 문제의 범위가 모든 가능한 솔루션을 통과하는 것이 가능하고 충분히 빠르면 동적 프로그래밍은 최적의 솔루션을 찾도록 보장합니다.

다음 예제가 주어졌다

예를 들어, 러시 아워 동안 주어진 도시에서 가능한 빨리 A 지점에서 B 지점으로 가야한다고 가정 해 봅시다. 동적 프로그래밍 알고리즘은 전체 교통 보고서를 검토하고 가능한 모든 도로 조합을 조사한 다음 가장 빠른 길을 알려줍니다. 물론, 알고리즘이 끝날 때까지 잠시 기다려야 할 수 있으며 그 후에 만 ​​운전을 시작할 수 있습니다. 당신이 취할 길은 가장 빠른 길입니다 (외부 환경에서 아무것도 바뀌지 않았다고 가정)

Brute Force 는 최상의 솔루션을 결정하기 전에 가능한 모든 솔루션을 시도하고 있습니다.

최상의 솔루션을 선택하기 전에 가능한 모든 솔루션을 거치는 경우 동적 프로그래밍이 Brute Force 와 다른 점은 동적 프로그래밍이 추가 요소 (이 경우 트래픽 조건)를 고려한다는 것입니다.

동적 프로그래밍이 Brute Force 방법의 하위 집합이라고 말하는 것이 맞습니까?


1
교통 상황은 붉은 청어입니다. 모든 알고리즘에서 고려할 수 있습니다.
Yuval Filmus


첫 번째 인용문은 동적 프로그래밍을 정의하지 않습니다.
reinierpost

잘 @reinierpost, 그것은 시도 와 거기에 도착 intelligent, brute force, 그러나 잊어은 "지능형"부분을 설명하기 위해
Izkata

@ 이즈 카타 (Izkata) 그 이론에 따르면, 모든 알고리즘은 "지능형 무차별 대입"이다 (어쨌든 옥시 모론).
Raphael

답변:


17

동적 프로그래밍 알고리즘은 가능한 모든 방법으로 문제를 해결하고 최상의 솔루션을 선택합니다.

이 진술은 명백한 잘못입니다.

동적 프로그래밍 재귀 종종 어떤 체계에 따라 주어진 문제 인스턴스를 더 작은 인스턴스로 분할하는 가능한 모든 방법을 고려합니다. 그러나 모든 솔루션을 모든 부분 문제에 결합하지 않고 최선을 선택 하지는 않습니다. 최적의 부분 솔루션 만 결합 하고 그 중 최선을 선택합니다.

이것이 원래 문제에 대한 최적의 솔루션을 제공한다는 사실은 사소한 것이 아니며 실제로 일부 문제에 대해서만 적용됩니다 . 즉, Bellman 최적 성 원칙 을 충족하는 것 (가장 비싸고 잘못 이해되는 "정의"중 하나). 그것에 대한 더 많은 생각 은 여기 를 참조 하십시오 .

구체적인 예로서, 단위 중량을 가진 완전한 그래프 K n 에서 Bellman-Ford 알고리즘 을 고려하십시오 . 한 에지를 사용하는 경로가 모두 최적 이기 때문에 길이 1과 2 (즉, Θ ( n 2 )가 많은)의 경로 만 고려합니다 . 그러나 허용되는 최대 가장자리 수를 제한하지 않고 여전히 ( n - 1 ) 이면 무한히 많은 솔루션이 있습니다 ! 모든 노드를 한 번만 사용하도록 허용하는 경우 많은 수입니다. 따라서 동적 프로그래밍 알고리즘 인 Bellman-Ford 는 무차별 검색을 수행 하지 않습니다 .케이Θ(2)(1)!


"이 문장은 잘못되었습니다"수정하십시오 .
nmclean 12

4
@nmclean Wikipedia에서 알고리즘 관련 기사를 편집 한 경험은 그리 유쾌하지 않습니다. 차라리 여기에 내 시간을 투자하고 싶습니다.
Raphael

나는 운을 시험하고 기사를 편집했다. 지금은 조금 덜 잘못되기를 바랍니다.
C4stor

9

동적 프로그래밍은 계산 을 재사용 할 때 영리 하지만 무차별적인 힘은 그렇지 않습니다. f (6)을 해결한다고 가정하면, f (3)을 호출하는 2 개의 하위 문제를 해결해야합니다. 무차별 강제 방법은 f (3)을 두 번 계산하므로 노력이 낭비되는 반면 동적 프로그래밍에서는 한 번만 호출하므로 나중에 계산할 때 결과를 저장해야합니다. 많은 문제에서 동적은 다항식 복잡성에 대한 무차별 대입의 지수 적 복잡성을 개선합니다.


9
의 그 메모이 제이션 한 많은 트릭의 DP가 사용하는 것이입니다.
벤 Voigt

4
메모를 통한 무차별 대입은 여전히 ​​비효율적입니다. DP 재발에 의해 제공되는 추가 구조 / 정리만으로도 메모가 가능합니다.
라파엘

3
동적 프로그래밍에 대해서는 아무것도 모르지만 무차별 알고리즘에 캐시를 추가하는 것보다 더 많은 것이 있다고 확신합니다. 동적 프로그래밍은 문제 공간을 세분화하고 각 작은 세분화에 대한 최적의 솔루션을 찾은 다음 이들을 결합하여 전체적으로 최상의 솔루션을 만들어 가능한 모든 조합을 테스트하지 않아도된다고 생각합니다. (이는 재귀 적으로, 하위 분할을 하위 다이빙으로 수행 할 수 있습니다.) 이것은 이와 같은 솔루션의 조합을 허용하고 여전히 전반적인 최적을 얻는 방식으로 문제를 표현할 수있는 경우에만 작동합니다.
Jonathan Hartley

1
이 답변은 실제로 매우 정확합니다. 동적 프로그래밍에 대해 더 배우려면 Cormen et al : "Introduction to Algorithms"와 같은 교과서를 읽는 것이 좋습니다.이 책에는 상당히 좋은 장이 있습니다. 간단히 말해서, 효율적인 동적 프로그래밍은 해결하려는 (최적화) 문제의 두 가지 속성을 사용합니다. 더 작은 하위 문제의 최적 솔루션에서 최적의 솔루션을 구성 할 수 있으며, 더 작은 하위 문제의 총 수는 실제로 오히려 작은. 그런 다음 모든 하위 문제 해결 솔루션을 상향식으로 구축하여 메모리 비용으로 계산을 가속화 할 수 있습니다.
MRA

또는 더 간단한 용어로 표현하면 파스칼의 삼각형 을 사용하여 이항 계수를 계산하는 방법을 알고 있다면 동적 프로그래밍에 대해 알아야 할 모든 것을 알 수 있습니다.
MRA

3

Wikipedia 기사가 만들고자하는 차이점은 세 가지 유형의 알고리즘입니다.

  1. 최적의 솔루션을 선택하여 가능한 모든 솔루션을 다루는 알고리즘.

  2. 최적의 솔루션이 서브 세트에 속하도록 선택된 모든 가능한 솔루션의 서브 세트를 처리하는 알고리즘.

  3. 최적의 솔루션이 서브 세트에 속한다는 보장없이 가능한 모든 솔루션의 서브 세트를 처리하는 알고리즘.

처음 두 유형의 알고리즘은 최적의 솔루션을 생성하는 반면 세 번째 유형은 최적의 솔루션이 아닌 "좋은"솔루션을 생성하는 것을 목표로합니다. 제 생각에 처음 두 종류의 구별은 그렇게 분명하지 않습니다.

가장 짧은 경로 (주어진 예제)와 관련하여 세 가지 유형의 알고리즘 모두에 대한 간단한 예를 제공하여 시작하겠습니다.

  1. 가능한 모든 경로를 시도하십시오. 이것을 무차별 강제력이라고 합니다.

  2. 지금까지 최소 솔루션을 추적하면서 가능한 모든 경로를 시도하십시오. 현재 구성하고있는 경로가 최소 솔루션보다 더 비쌀 때마다 포기하고 다른 경로를 선택하십시오 (거리는 세그먼트별로 계산된다고 생각합니다). 이것을 가지 치기 라고 합니다 .

  3. 지도를보고 몇 가지 경로를 고려한 후 가장 적합한 경로를 선택하십시오. 이것은 컴퓨터가 아니라 사람을위한 알고리즘입니다.

이 예제는 다소 거칠고 아마도 매우 정확한 그림을 그리지는 않을 것입니다. 가지 치기는 컴퓨터 체스와 같은 많은 상황에서 중요합니다. 궁금한 점이 있다면 실제로 가장 짧은 경로에 사용되는 A * 알고리즘을 찾아보십시오 .

동적 프로그래밍은 무차별 대입 알고리즘의 속도를 크게 향상시키는 기술입니다. 그러나 이런 식으로 생각하는 것은 다소 오해의 소지가 있습니다. 최적화 문제를 해결하기위한 알고리즘 기술입니다. 동적 프로그래밍 컨텍스트에서 프 루닝을 구현할 수 있습니다.

+1


그런 다음 후보를 완전히 처리하지 않고 고려 대상에서 제거합니다. 예를 들어, 최소 합이 아닌 음수가 아닌 숫자 집합을 찾으면 실제로 각 집합을 완전히 합할 필요는 없으며 합이 현재 최고를 초과 할 때까지만 진행하면됩니다. 이것은 가지 치기이지만 직교하는 것과 유사한 아이디어입니다. 이 두 가지 아이디어를 결합하면 복잡성이 줄어든 문제가 해결되고 가지 치기를 정당화하는 데 사용되는 "분기점"이 만들어집니다.
벤 Voigt

0

동적 프로그래밍은 무차별 대입보다 훨씬 빠릅니다. 동적 프로그래밍은 일반적으로 훨씬 빠르지 만 무차별 대입에는 시간이 걸릴 수 있습니다.

무차별 대항의 비유는 매우 느슨합니다. 동적 프로그래밍은 원하는 강력한 알고리즘을 사용하여 효율적으로 만들 수있는 마법의 은색 총알이 아닙니다.


5
그것은 설명이 아니라 결과입니다.
Raphael

-2

이것은 간단합니다. 동적 프로그래밍은 추가 요소를 사용하여 검색 범위를 좁히는 "검색 전략"입니다. 검색 공간에 솔루션이없는 경우 동적 프로그래밍 (일반적으로) 검색 공간의 모든 요소를 ​​통해 검색을 수행합니다. 그러나 이것이 그것이 무차별 대입 검색이라는 것을 의미하지는 않습니다.


"검색 공간에 솔루션이 없으면 동적 프로그래밍은 일반적으로 검색 공간의 모든 요소를 ​​통해 검색을 수행합니다." -내 대답을 참조하십시오.
Raphael

-2

동적 프로그래밍이 지능적인 무차별 대입이라는 말은 정확하지만 그 문구로 이해하기는 약간 어렵습니다. 동적 프로그래밍의 요점은 일반적으로 문제를 해결하고 지능적으로 작은 부분으로 나누는 것입니다. 이 작업을 수행 한 후에는 각 작은 조각을 해결하기 위해 무차별 대입을 사용하고 조각을 최종 솔루션으로 결합하기 위해 무차별 대입을 다시 사용하게됩니다. 따라서 동적 프로그래밍이 일종의 무차별 대입 솔루션이라고 말할 수는 있지만 그 트릭은 무차별 대입 방법에 있습니다.


1
"당신은 각각의 작은 조각을 해결하기 위해 무차별적인 힘을 사용할 것입니다." 일반적으로 동일한 접근 방식을 재귀 적으로 사용합니다.
FrankW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.