저는 유명한 파이썬 패키지를 기본으로 그래프와 네트워크를위한 오픈 소스 근사 알고리즘 라이브러리를 만들고 있습니다. 주요 목표는 그래프 및 네트워크에 대한 NP-Complete 문제에 대한 최신 근사 알고리즘을 포괄하는 것입니다. 그 이유는 1) 이것을 다루는 멋진 (현대적인) 통합 패키지를 보지 못했고 2) NP-Hard 최적화 문제에 대한 근사 알고리즘에 대해 배울 수있는 좋은 교수법 도구가 될 것입니다.유닛 테스팅 근사 알고리즘
이 라이브러리를 구축 할 때 적절한 테스트를 수행하기 위해 단위 테스트를 사용하고 있습니다. 근사 알고리즘이 올바른 해결책을 반환하지 않을 수도 있다는 점에서 본인의 단위 테스트에 대해서는 다소 신중합니다. 현재 손으로 작은 인스턴스를 해결하고 리턴 된 결과가 그와 일치하는지 확인하고 있지만, 이는 구현의 관점에서 바람직하지 않으며 확장 할 수도 없습니다.
단위 테스트 근사 알고리즘의 가장 좋은 방법은 무엇입니까? 무작위 인스턴스를 생성하고 반환 된 결과가 알고리즘에 의해 보증 된 범위보다 작은 지 확인하십시오. 그건 거짓 긍정을 가진 것처럼 보일 것입니다. (이 테스트는 그 시간에 운이 좋았지 만, 모든 인스턴스가 묶여 있다는 보장은 없습니다).
NP 완성 문제에 대해 "임의 인스턴스"를 생성하는 경우 경계를 테스트하기 위해 실제 답변을 어떻게 알 수 있습니까? IMHO 당신은 여전히 신중하게 테스트 케이스를 선택해야합니다. 인간 답게 진짜 답을 찾아 낼 수는 있지만, 근사 알고리즘에 대해 까다로울 수는 없거나 적어도 연습 할 수는 없습니다. 이러한 경우는 사실적으로 충분히 커질 수 있도록 프로그래밍 방식으로 생성 될 수 있습니다. 그들은 단지 _random_해서는 안됩니다. –
@Ray Toal의 의견을 확대하면 문제가 발생했을 때 쉽게 해결할 수있는 몇 가지 어려운 문제가 있습니다. * p * 및 * q *를 이미 알고있는 경우를 제외하고는 * pq *를 분해하는 것은 어렵습니다. 비슷한 원칙을 그래프/네트워크 문제에 적용 할 수 있습니까? –
+1 Tom은 알려진 케이스를 프로그래밍 방식으로 생성하여 의미하는 바입니다. 나는이 지역의 권위가 아니기 때문에 잠시 대답을 추가하는 것을 조금 주저합니다. 누군가 여기에 경험이있는 사람이있을 수 있습니다. 나는 단지 "무작위"라는 단어 주위에 붉은 깃발을 올리려고했다. –