나는 이 질문이 비슷 하다는 것을 서문하고 싶지만 , 내 질문에는 무작위성이 아니라 까다로운 결정론이 포함되어 있으므로 "알려진 씨앗 사용"이라는 대답은 실제로 적용되지 않습니다. 마찬가지로, 이 질문은 비슷하지만, 다시, 나는 지금까지 실패 할 알고리즘을 기대 아니에요 - 난 그냥이 올 것입니다 어떤 방법을 모르겠어요.
이 질문은 그래프 알고리즘을 테스트하는 동안 발생했습니다. 그러나 결코 그들에만 국한되는 것은 아닙니다. A *와 같은 일부 알고리즘에는 여러 정답이있을 수 있습니다. 정확한 구현에 따라 몇 가지 답변 중 하나를 얻을 수 있으며 각 답변은 똑같습니다. 그래도 어느 것이 미리 뱉어 질지 알지 못하기 때문에 손으로 답을 계산하는 데 시간이 많이 걸리기 때문에 테스트하기가 어려울 수 있습니다.
내 경우에는 Floyd-Warshall을 수정하여 가능한 한 가장 짧은 경로 를 뱉어 내고 테스트하는 데 시간을 보냈습니다. 그것은 그 자체로 좋은 기능이되는 이점이있었습니다. 그런 다음 FW에서 알려진 올바른 경로와 관련하여 다른 함수를 테스트 할 수 있습니다 (반환 된 경로가 해당 시작 / 종료 쌍에 대해 FW에서 반환 된 경로 중 하나 인 경우 정확합니다). 물론 이것은 FW 작동 방식으로 인해 밀도가 높은 그래프에서만 작동하지만 여전히 좋습니다.
그러나이 특성을 가진 모든 알고리즘에서 항상 실행 가능한 것은 아닙니다. 지금까지 내가 찾은 가장 좋은 대답은 정답 자체가 아니라 정답의 특성을 테스트하는 것입니다. 최단 경로 알고리즘으로 돌아가려면 반환 된 경로의 비용을 알려진 올바른 비용과 비교하여 경로가 유효한지 확인할 수 있습니다.
이것은 작동하지만, 검증 자체가 복잡한 경우 (예 를 들어 올바른 알고리즘이 존재하는 동안 최소 스패닝 트리를 검증하는 것은 알려진 어려운 문제입니다. MST 자체 구성),이 경우 테스트 코드를 광범위하게 테스트해야합니다. 최악의 경우 : 아마도 MST 검증 알고리즘을 테스트하기 위해 MST를 구성해야하므로 이제 MST 테스트가 MST 검증 알고리즘 작동에 의존하고 MST 검증 알고리즘 테스트가 MST 생성 코드 작동에 의존하는 훌륭한 시나리오를 갖게됩니다.
마지막으로, 출력을 관찰하고 직접 확인한 다음 테스트를 하드 코딩하여 방금 확인한 출력을 테스트하는 "저렴한 방법"이 있습니다. 그러나 매번 테스트를 수정해야 할 수도 있기 때문에 좋은 생각이 아닙니다. 구현을 약간 변경하십시오 (자동 테스트는 피해야합니다).
분명히 대답은 어느 정도 테스트하는 정확한 알고리즘에 달려 있지만, 결정적이고 결정적인 몇 가지 확실한 "출력"이있는 알고리즘을 검증하기위한 "모범 사례"가 있는지 궁금하지만 정확한 정확한 출력이 어렵다 미리 알고, 사실을 확인하기조차 어려울 수 있습니다.