욕심 많은 알고리즘이 올바른지 증명하는 방법


29

나는 욕심 많은 알고리즘을 가지고 있다고 생각하지만 확실하지 않습니다. 올바른지 어떻게 확인합니까? 욕심 많은 알고리즘의 정확성을 입증하는 데 사용할 기술은 무엇입니까? 일반적인 패턴이나 기술이 있습니까?

나는 이것이 초보자를 가리키는 데 사용할 수 있는 참조 질문 이되기를 희망 합니다. 따라서 일반적인 범위보다 광범위합니다. 적어도 하나의 예로 설명되어 있지만 많은 상황을 다루는 일반적이고 교훈적으로 제시된 답변을 제공하도록주의하십시오. 감사!



matroid 또는 greedoid를 사용하여 욕심 많은 알고리즘이 올바른지 증명할 수 있습니까?
zdm

답변:


24

궁극적으로, 수학적 정확성에 대한 증거가 필요합니다. 아래에 그에 대한 몇 가지 증명 기술을 얻을 것입니다.하지만 먼저 다이빙을 시작하기 전에 시간을 절약 할 수 있습니다. 증명을 찾기 전에 무작위 테스트를 시도하십시오.

무작위 테스트

첫 번째 단계로 랜덤 테스트를 사용하여 알고리즘을 테스트하는 것이 좋습니다. 내 경험상 탐욕스러운 알고리즘의 경우 무작위 테스트가 부당하게 효과적 인 것 같습니다. 5 분 동안 알고리즘을 코딩하면 증거를 제시하는 데 1-2 시간을 절약 할 수 있습니다.

기본 아이디어는 간단합니다. 알고리즘을 구현하십시오. 또한 올바른 것으로 알고있는 참조 알고리즘 (예 : 모든 가능성을 철저히 시도하고 최선을 다하는 알고리즘)을 구현하십시오. 작은 문제 인스턴스에서만이 알고리즘을 실행하므로 참조 알고리즘이 점진적으로 비효율적이면 좋습니다. 그런 다음 무작위로 백만 개의 작은 문제 인스턴스를 생성하고 각각에 대해 두 알고리즘을 모두 실행하고 후보 알고리즘이 모든 경우에 정답을 제공하는지 확인하십시오.

경험적으로 후보 욕심 알고리즘이 올바르지 않은 경우 일반적으로 무작위 테스트 중에이를 발견하게됩니다. 모든 테스트 사례에서 올바른 것 같으면 다음 단계로 넘어 가야합니다. 수학적 정확성 증명이 나옵니다.

수학적 정확성 증명

욕심 많은 알고리즘이 올바른지 증명해야합니다. 최적의 솔루션을 출력한다는 것입니다 (또는 동일한 최적의 솔루션이 여러 개 있으면 그 중 하나를 출력 함).

기본 원칙은 직관적입니다.

원칙 : 잘못된 선택을하지 않으면 괜찮습니다.

탐욕 알고리즘은 일반적으로 일련의 선택을 포함합니다. 기본 증명 전략은 알고리즘이 결코 나쁜 선택을하지 않음을 증명하려고 시도하는 것입니다. 탐욕스러운 알고리즘은 역 추적 할 수 없습니다. 일단 일단 선택하면, 그들은 최선을 다하고 그 선택을 취소하지 않을 것입니다. 따라서 결코 나쁜 선택을하지 않는 것이 중요합니다.

좋은 선택은 무엇입니까? 최적의 솔루션이 하나 인 경우 최적의 솔루션이 무엇인지와 동일한 선택이 무엇인지 쉽게 알 수 있습니다. 다시 말해, 탐욕스러운 알고리즘의 실행 단계에서 알고리즘에 의해 선택된 선택 순서가 지금까지 최적 솔루션의 접두사와 정확히 일치 함을 증명하려고 노력할 것입니다. 동일하게 최적의 솔루션이 여러 개있는 경우 최적의 솔루션 중 하나 이상과 일치하는 솔루션을 선택하는 것이 좋습니다. 다시 말해, 알고리즘의 선택 순서가 지금까지 최적의 솔루션 중 하나의 접두사와 일치하면 지금까지는 아무 문제가 없습니다.

삶을 단순화하고 방해 요소를 없애기 위해 유대가없는 경우에 집중합시다. 하나의 고유 한 최적의 솔루션이 있습니다. 모든 기계는 근본적인 변경없이 동일하게 여러 가지 최적화가 가능한 경우에 적용되지만 기술적 인 세부 사항에 대해서는 좀 더주의를 기울여야합니다. 이러한 세부 사항을 무시하고 최적의 솔루션이 고유 한 경우에 중점을 두어 시작하십시오. 그것은 당신이 필수적인 것에 집중하는 데 도움이 될 것입니다.

우리가 사용하는 매우 일반적인 증거 패턴이 있습니다. 알고리즘의 다음 속성을 증명하기 위해 열심히 노력할 것입니다.

제 : 하자 알고리즘에 의해 출력 용액 및 O는 최적의 솔루션. 경우 S는 다른 O , 우리는 조정할 수 O를 다른 솔루션을 얻기 위해 O * 다른 O 엄격하게보다 나은 O를 .SOSOOOOO

이것이 왜 유용한 지 주목하십시오. 주장이 사실이면 알고리즘이 올바른 것입니다. 이것은 기본적으로 모순에 의한 증거입니다. 어느 동일하다 OSO 또는 다르다. 이 다른 경우, 우리는 또 다른 솔루션을 찾을 수 있습니다 엄격하게보다 나은의 O를 - 그러나 우리는 정의 즉, 모순의 O를 최적의 솔루션으로 더 나은보다 상관 없음 해결책이 될 수 없다. 따라서 SO 와 다를 수 없다는 결론을 내릴 수밖에 없습니다 . S 는 항상 O와 같아야합니다OOOSOSO즉, 탐욕스러운 알고리즘은 항상 올바른 솔루션을 출력합니다. 위의 주장을 입증 할 수 있다면 알고리즘이 올바른 것으로 입증 된 것입니다.

벌금. 그렇다면 어떻게 주장을 증명할 수 있습니까? 우리 용액 생각 벡터로서 ( S 1 , ... , S , N ) 의 시퀀스에있는 대응 해당 알고리즘에 의해 선택하고, 마찬가지로, 우리는 최적의 솔루션을 생각 O 벡터로서 ( O (1) , ... , O의 N ) 로 이어질 것이다 선택의 순서에 대응 O . 경우 S는 다른 O , 일부 인덱스가 존재해야 내가 S 난을S(S1,,Sn)nO(O1,,On)OSOi , 우리는 작은 같은 할것 다음, 우리가 조정할 수 있습니다. O를 변경하여 이여 에서 조금SiOiiOO 경기가 제 위치를 S 난을 즉, 우리는 최적의 솔루션 조정할 수 있습니다 O를 변화에 의해 내가에게 욕심 알고리즘에 의해 선택된 하나 일 선택을 한 다음 우리는 이것이 더 나은 해결책으로 이어진다는 것을 보여줄 것입니다. 특히 O * 를 다음과 같이정의합니다.iSiOiO

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

종종 우리는 O i + 1 을 수정해야한다는 것을 제외하고전역 일관성을 유지하기 위해 2 ,, O n 부분을 ​​약간. 증명 전략의 일부는 O *를 적절하게정의 할 때 약간의 영리함을 포함합니다. 그런 다음 증명의 고기는 어떻게 든 알고리즘에 대한 사실을 사용하고 O *O보다 엄격하게 우수하다는 문제를 보여줍니다Oi+1,Oi+2,,OnOOO; 여기서 문제 별 통찰력이 필요합니다. 어떤 시점에서 특정 문제의 세부 사항을 살펴볼 필요가 있습니다. 그러나 이것은 욕심 많은 알고리즘에 대한 전형적인 정확성 증명의 구조에 대한 감각을 제공합니다.

간단한 예 : 최대 합이있는 부분 집합

간단한 예제를 자세히 살펴보면 이해하기가 더 쉬울 수 있습니다. 다음과 같은 문제를 생각해 봅시다.

입력: 정수 의 집합 , 정수 k 출력 : 합이 가능한 큰 크기 k 의 집합 S UUk
SUk

이 문제에 대한 자연스럽고 탐욕스러운 알고리즘이 있습니다.

  1. 설정하십시오 .S:=
  2. 옵션 : i:=1,2,,k
    • 하자 에서 가장 큰 숫자 U 아직 (즉, 포착되지 않은xiU 에서 일 가장 많은 U ). x i S에 추가하십시오.iUxiS

무작위 테스트는 이것이 항상 최적의 솔루션을 제공한다고 제안하므로이 알고리즘이 올바른지 공식적으로 증명합시다. 최적의 솔루션은 고유하기 때문에 관계에 대해 걱정할 필요가 없습니다. 위에서 설명한 주장을 증명합시다 :

클레임 : 를 입력 U , kO 에서이 알고리즘에 의해 솔루션 출력으로 하자SU,kO 최적해. 경우 , 우리는 다른 용액을 만들 수도 O * 그 합보다 더 큰 O가 .SOOO

증명. 가정 하고하자 제가 첫번째 인덱스 반복 될 여기서 X IO . ( 우리는 S O 라고 가정 하고 이러한 알고리즘의 정의에 따라 S = { x 1 , , x k }가 있기 때문에 인덱스 i 가 존재해야합니다 .) 가정에 따르면 i 는 최소이므로 x 1 , , x i - 1O , 특히SOixiOiSOS={x1,,xk}ix1,,xi1O 폼 갖는다 O를 = { X 1 , X 2 ,O(여기서 숫자x1,,xi-1)은 내림차순으로 나열됩니다. 알고리즘이x1,,xi를 어떻게 선택하는지 살펴보면모든ji에대해xi>x ' 가 있어야한다는 것을 알 수 있습니다. 특히,xi>x ' i 입니다. 따라서O=O={x1,x2,,xi1,xi,xi+1,,xn}x1,,xi1,xi,,xnx1,,xixi>xjjixi>xi, 즉, 우리는 얻을O*삭제하여난을의 일 수를O x i 추가하기. 이제 O * 의 원소의 합은 O + x i - x ' i 의 원소의 합이며 x i - x 'O=O{xi}{xi}OiOxiOOxixi이므로O*의 합보다 확실히 크다O의 합 '. 이것은 주장을 증명합니다. xixi>0OO

여기서 직관은 욕심 많은 알고리즘이 O 와 일치하지 않는 선택을한다면O 한다면, 그 단계에서 욕심 많은 알고리즘에 의해 선택된 요소를 포함하도록 수정된다면 더 나아질 수 있다는 것을 . O 가 최적 이기 때문에 더 나은 방법으로 만들 수는 없으며 (모순 일 수도 있음) 유일하게 남아있는 가능성은 우리의 가정이 잘못되었을뿐입니다. 즉, 탐욕스러운 알고리즘은 결코 선택하지 않을 것입니다 O 와 일치하지 않습니다 .OOO

이 인수를 종종 교환 인수 또는 교환 보조 라고합니다 . 우리는 최적의 솔루션이 욕심 많은 솔루션과 다른 첫 번째 장소를 발견하고 해당 욕심 많은 선택에 대해 요소를 교환하는 것을 상상했습니다 ( x 교환O 위한XI). 일부 분석에 따르면이 교환은 최적의 솔루션 만 개선 할 수 있지만 정의에 따르면 최적의 솔루션은 개선 할 수 없습니다. 따라서 최적의 솔루션이 욕심 많은 솔루션과 다른 곳이 없어야한다는 유일한 결론입니다. 다른 문제가있는 경우 특정 상황에서이 교환 원칙을 적용 할 수있는 기회를 찾으십시오.xixi


이것은 오래된 질문이지만 Google의 첫 번째 결과입니다. 그 줄 then we can tweak O to get another solution O∗ that is different from O and strictly better than O은 나를 혼란스럽게한다. 최적의 솔루션이 여러 개있는 경우 S != O둘 다 최적 일 수 있습니다. 우리는 O를 "더 비슷하게"S (O를 생성) strictly better than
조절할 수 있지만

@citelao, 혼란스러워 죄송합니다. 아아, 나는 그것을 더 명확하게 설명하는 방법을 모르겠습니다. 예, 모두 동일한 가치를 가진 여러 최적 솔루션이있을 수 있습니다. 맞아요. 당신이 쓴 것과 내가 쓴 것은 모두 유효합니다. 모순이 없습니다. 차이점은 작성한 내용이 욕심 많은 알고리즘을 올바르게 증명하는 데 도움이되지 않는다는 것입니다. 내가 쓴 일. 다시 쓴 내용 만 살펴보고 제안한 내용이 유용한 지 알아볼 수 있습니다. 그래도 도움이되지 않으면 다른 기록을 찾을 수 있습니다. 까다 롭고 혼란 스럽다는 것을 알고 있습니다.
DW

1
빠른 응답에 감사합니다! 나는 당신이 알고리즘을 증명하는 데 집중하는 지점을 놓쳤다 a single, unique optimal solution. 이 질문은 욕심 많은 알고리즘을 올바르게 증명 하는 것이므로 여러 최적의 솔루션이 존재할 수있는 경우에 대한 답변을 드리고자합니다. 이 모든 것을 연구한지 오래되었지만, alg와 다른 최적의 솔루션 O에서 각 요소 O_i를 교환 할 수 있음을 입증하는 것으로 충분하지 않습니다. S_i가있는 솔루션 S와 여전히 O 보다 나쁘지 않은 솔루션 O '가 있습니까?
citelao

@citelao,이 기술은 여러 최적의 솔루션이있는 경우에도 적용됩니다. 최적의 솔루션이 독창적 인 경우에만 중점을 두었습니다. 처음으로 이것을 볼 때 해당 설정에서 이러한 증명의 작동 방식을 이해하는 것이 더 쉽기 때문입니다. 그러나 여러 최적의 솔루션이 있어도 동일한 전략이 적용됩니다. 최적의 단일 솔루션이있을 때 작동 방식을 이해 한 다음 일반적인 경우에 적용하는 방법을 이해하는 것이 좋습니다. 또한 욕심 많은 알고리즘에 대한 몇 가지 예제 증명을 연구하는 것이 도움이 될 것이라고 생각합니다.
DW

후자의 질문에 대답하는 것은 충분하지 않습니다. S가 최적이라는 것을 증명하지는 않습니다. (O가 O보다 나쁘지 않다고 요구하면 S가 차선책 인 경우가 있지만 그러한 종류의 교환을 할 수 있으므로 O보다 나쁘지 않은 O '를 달성 할 수 있음을 증명 't은 S가 최적이며, 욕심 알고리즘이 정확한지 증명하지 않는지에 대해 아무것도 증명 나는 방법은 좀 더이 질문에 대해 기술 연구 제안 그것은 까다로운 귀류법을 이해하는 것이 까다 롭다)....
DW를

14

다음과 같은 간단한 정렬 알고리즘을 예로 사용하겠습니다.

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

정확성을 증명하기 위해 두 단계를 사용합니다.

  • 먼저 알고리즘이 항상 종료됨을 보여줍니다.
  • 그런 다음 종료되는 솔루션이 내가 원하는 솔루션임을 보여줍니다.

첫 번째로, 알고리즘이 모든 단계에서 알고리즘을 향상 시킨다는 것을 보여줄 수있는 적절한 비용 함수를 선택합니다.

이 예제에서는 입력 목록에서 반전 수를 선택합니다. 목록 의 반전 은 한 쌍의 항목 A [ i ] , A [ j ] 입니다.AA[i]A[j] 이지만 i < j .A[i]>A[j]i<j . 반전의 수는 항상 음이 아니며 정렬 된 목록에는 0의 반전이 있습니다.

순서가 잘못된 두 개의 인접한 항목 , A [ i + 1 ] 을 명확하게 교체 하면 반전 A [ i ] , A [ i + 1 ]가 제거됩니다.A[i]A[i+1]A[i],A[i+1] 되지만 다른 반전은 영향을받지 않습니다. 따라서 모든 반복에서 반전 횟수가 줄어 듭니다.

이것은 알고리즘이 결국 종료됨을 증명합니다.

정렬 된 목록에서 반전의 수는 0입니다. 모든 것이 잘 진행되면 알고리즘은 반전의 수를 0으로 줄입니다. 로컬 최소값에 멈춰 있지 않다는 것을 보여 주면됩니다.

나는 보통 모순으로 이것을 증명합니다. 알고리즘이 중지되었다고 가정하지만 솔루션이 올바르지 않습니다. 이 예에서는 목록이 아직 정렬되지 않았지만 잘못된 순서로 인접한 항목이 없음을 의미합니다.

목록이 정렬되지 않은 경우 올바른 위치에 있지 않은 항목이 두 개 이상 있어야합니다. 하자 [ I ][ J ] , I < J , [ I ] > [ J ] 수 개의 이러한 항목 성 차이 IJ는 최소이다. 알고리즘이 멈추지 않았으므로 인접하지 않으므로 i + 1 < j 입니다. 우리는 최소를 가정했기 때문에 A [ i ] < AA[i]A[j]i<jA[i]>A[j]iji+1<j A [ i + 1 ] < A [ j ] , 그리고 A [ i ] < A [ j ] 그리고 모순이 있습니다.A[i]<A[i+1]A[i+1]<A[j]A[i]<A[j]

이는 목록이 정렬 될 때만 알고리즘이 중지됨을 증명합니다. 따라서 우리는 끝났습니다.


설명 된 기술은 너무 일반적이기 때문에 실제로이 질문의 주제 인 욕심 많은 알고리즘에 대해서는 특별한 것이 없습니다.
Apass.Jack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.