정답을 여러 개 또는 입증하기 어려운 테스트 (결정적) 알고리즘


11

나는 질문이 비슷 하다는 것을 서문하고 싶지만 , 내 질문에는 무작위성이 아니라 까다로운 결정론이 포함되어 있으므로 "알려진 씨앗 사용"이라는 대답은 실제로 적용되지 않습니다. 마찬가지로, 질문은 비슷하지만, 다시, 나는 지금까지 실패 할 알고리즘을 기대 아니에요 - 난 그냥이 올 것입니다 어떤 방법을 모르겠어요.

이 질문은 그래프 알고리즘을 테스트하는 동안 발생했습니다. 그러나 결코 그들에만 국한되는 것은 아닙니다. A *와 같은 일부 알고리즘에는 여러 정답이있을 수 있습니다. 정확한 구현에 따라 몇 가지 답변 중 하나를 얻을 수 있으며 각 답변은 똑같습니다. 그래도 어느 것이 미리 뱉어 질지 알지 못하기 때문에 손으로 답을 계산하는 데 시간이 많이 걸리기 때문에 테스트하기가 어려울 수 있습니다.

내 경우에는 Floyd-Warshall을 수정하여 가능한 한 가장 짧은 경로 를 뱉어 내고 테스트하는 데 시간을 보냈습니다. 그것은 그 자체로 좋은 기능이되는 이점이있었습니다. 그런 다음 FW에서 알려진 올바른 경로와 관련하여 다른 함수를 테스트 할 수 있습니다 (반환 된 경로가 해당 시작 / 종료 쌍에 대해 FW에서 반환 된 경로 중 하나 인 경우 정확합니다). 물론 이것은 FW 작동 방식으로 인해 밀도가 높은 그래프에서만 작동하지만 여전히 좋습니다.

그러나이 특성을 가진 모든 알고리즘에서 항상 실행 가능한 것은 아닙니다. 지금까지 내가 찾은 가장 좋은 대답은 정답 자체가 아니라 정답의 특성을 테스트하는 것입니다. 최단 경로 알고리즘으로 돌아가려면 반환 된 경로의 비용을 알려진 올바른 비용과 비교하여 경로가 유효한지 확인할 수 있습니다.

이것은 작동하지만, 검증 자체가 복잡한 경우 (예 들어 올바른 알고리즘이 존재하는 동안 최소 스패닝 트리를 검증하는 것은 알려진 어려운 문제입니다. MST 자체 구성),이 경우 테스트 코드를 광범위하게 테스트해야합니다. 최악의 경우 : 아마도 MST 검증 알고리즘을 테스트하기 위해 MST를 구성해야하므로 이제 MST 테스트가 MST 검증 알고리즘 작동에 의존하고 MST 검증 알고리즘 테스트가 MST 생성 코드 작동에 의존하는 훌륭한 시나리오를 갖게됩니다.

마지막으로, 출력을 관찰하고 직접 확인한 다음 테스트를 하드 코딩하여 방금 확인한 출력을 테스트하는 "저렴한 방법"이 있습니다. 그러나 매번 테스트를 수정해야 할 수도 있기 때문에 좋은 생각이 아닙니다. 구현을 약간 변경하십시오 (자동 테스트는 피해야합니다).

분명히 대답은 어느 정도 테스트하는 정확한 알고리즘에 달려 있지만, 결정적이고 결정적인 몇 가지 확실한 "출력"이있는 알고리즘을 검증하기위한 "모범 사례"가 있는지 궁금하지만 정확한 정확한 출력이 어렵다 미리 알고, 사실을 확인하기조차 어려울 수 있습니다.


3
언어가 허용한다면 그것을 테스트하는 대신 정확성을 증명할 수 있습니다
miniBill

많은 텍스트가 있지만 의문의 여지가 없습니다. 정확히 무엇을 묻고 있습니까?
BЈовић

@ BЈовић "정확한 출력을 검증하기 어려운 여러 개의 알고리즘 구현을 어떻게 테스트해야합니까?" 그렇게 명확하게하는 방법을 잘 모르겠습니다. 죄송합니다. 귀하의 관점에 따라 다소 광범위하게 고려 될 수 있음을 인정하지만, 그것이 정의되지 않았다고 생각합니다.
LinearZoetrope

여전히 이해가 안 돼요 알고리즘은 임의성에 의존하지 않지만 여전히 다른 출력을 생성 할 수 있습니다. 전혀 말이되지 않습니다. 입력 설정에 대한 모든 알고리즘은 동일한 출력을 가져야합니다. 이것이 단위 테스트에서 수행되고 테스트 된 것입니다. 연결 한 논문의 알고리즘조차도
BЈовић

@ BЈовић 물론 결정 론적이지만 그래프가 노드의 후계자를 반환하는 순서와 같이 매우 민감합니다. 약간의 나비 효과가 발생할 수 있습니다. 정점 B 이전에 스택에서 정점 A를 푸시할지 여부는 둘 다 최단 경로로 이어지는 경우 다른 출력으로 이어집니다. 비 정렬 정렬 또는 최소 힙과 같은 라이브러리 함수를 사용하면 문제가 더욱 악화됩니다.
LinearZoetrope

답변:


5

올바른 속성을 테스트하려고 시도하는 것이 확실하지 않으므로 모호성이 발생합니다.

그래프 알고리즘은 최단 경로 를 찾는 것을 목표로 하지 않지만 (이것은 부작용입니다), 모서리와 정점 세트에 정의 된 일부 비용 함수최소화하거나 최대화 합니다. 따라서이 기능의 최종 값을 테스트하고 첫 번째 노드와 마지막 노드가 실제로 필요한 노드임을 확인하여 솔루션의 정확성을 확인할 수 있습니다.

각 가능한 경로에 대한 최종 비용 함수 값을 사전 계산할 수있는 경우 (보통 비현실적), 테스트중인 구현에서 제공하는 솔루션 비용이이 세트 중 최소 비용과 동일한 지 확인하면됩니다 (절대 비교). ). 골드 표준 알고리즘 및 / 또는 구현이 "단지"인 경우 출력 비용을 테스트중인 알고리즘 중 하나와 비교해야합니다 (상대 비교).

예를 들어, 순진한 테스트 설정은 다음과 같습니다.

  1. 탐욕스러운 알고리즘으로 테스트 그래프에서 Va와 Vb 사이의 모든 가능한 경로를 계산하십시오.
  2. 이러한 각 경로에 대한 비용 함수 (예 : 모든 간선 가중치가 1 인 경우 길이)를 계산하고 최소값을 찾으십시오.
  3. 테스트중인 알고리즘을 적용하십시오.
  4. 단위 테스트에서 테스트 된 알고리즘 비용 값이 욕심 많은 솔루션의 최소값과 동일하다는 주장을합니다.

당신이 그래프 기반의 최적화에 대한 자세한 내용을 알고 싶은 경우에, 당신은 유리 Boykov의 출판물을 살펴 수 있습니다 여기를 하지만 다른 컨텍스트 (컴퓨터 비전 문제)에.


나는 찬성했지만 조금 기다릴 것이다. 이것은 내가 질문에서 언급 한 "정답의 특성에 대한 테스트"입니다. 문제는 항상 올바른 것을 확인하는 데 있습니다. 예를 들어, 한 번에 반환 비용을 확인하고 경로가 유효한지 확인했습니다. 물론 경로는 유효했습니다! 시작 노드뿐이었습니다! 따라서 경로 자체에 실제로 올바른 비용이 반환되도록 테스트를 변경해야했습니다. 어리석은 실수이지만, 이와 같은 상호 작용이 많을수록 더 많은 상호 작용을 할 수 있습니다.
LinearZoetrope

내 관점에서 @Jsor, 그것은 테스트의 지속적인 개선 혜택입니다. 처음에 솔루션의 모든 정확성 속성을 파악한 다음 언젠가는 어떤 실패로 가고 테스트를 개선하는 등의 일을 할 수 없습니다.
sansuiso

이 답변은 정답의 특성에 대한 테스트를 권장하지만 중요한 것은 좋은 특성을 갖는 특성 을 선택 하는 것입니다 . 이 예에서 답이 A에서 B까지의 경로이고 비용 함수가 최소값과 같은지 확인하면 모든 정답이 충족하는 두 가지 기준이 제공되지만 오답은 두 기준을 모두 만족하지 않습니다. 이 답변이 아직 제공되지 않았다면 비슷한 것을 추천했을 것입니다. 물론 어떤 특성을 테스트해야하는지 알기가 쉽지 않은 경우가 많습니다.
David K

0

귀하의 질문에 대한 직접적인 대답은 더 나은 테스트 사례를 선택하는 것입니다. 사용중인 테스트 사례가 궁금합니다. 사용하는 그래프는 사람이 예상 응답을 결정하기가 비교적 쉬운 CANNED 그래프 일 수 있습니다. 알고리즘이 처리하고 있는지 확인하려는 "가장자리"사례를 파악하고 사람이 계산하기 쉬운 각 특정 사례에 대해 미리 준비된 그래프를 만듭니다. 예를 들어, Djikstra 알고리즘의 경우 실제 시스템이 500x500이더라도 모든 엣지 사례를 포함하는 5x5 또는 7x7 그래프를 만들 수 있습니다.

그런 다음 최종 상태 점검으로보다 현실적인 그래프 테스트 사례를 만들 수 있습니다. 그러나 어쨌든, 나는 산수 이소가 당신이 올바른 재산을 테스트하고 있는지 확인해야한다고 지적한 곳을 발견했다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.