휴리스틱 알고리즘을 단위 테스트하는 방법


10

경로 찾기 알고리즘이 있다고 가정 해 보겠습니다.

def myHeuristicTSP(graph):
    /*implementation*/
    return route

이제 우리는 이것을 단위 테스트하고 싶습니다 :

class TestMyHeuristicTSP:
    def testNullGraphRaiseValueError(self):
        self.assertRaises(ValueError, myHueristicTSP(None))

    def testSimpleTwoNodeGraphReturnsRoute:
        self.assertEquals(expectedResult, myHeuristicTSP(input))

휴리스틱 TSP 알고리즘의 경우 다양한 그래프를 제공하고 항상 최단 경로를 반환하는지 확인할 수 있습니다.

그러나 휴트 스틱 알고리즘은 여전히 ​​결정 론적이지만 예측하기 어렵 기 때문에 알고리즘의 작동 방식을 이해하고 이러한 최첨단 사례를 찾는 것입니까?


답변:


11

이상적인 것이지만 "충분한"솔루션을 반환해야하는 휴리스틱 알고리즘의 경우 다양한 테스트 사례와 검사가 필요합니다.

  1. 솔루션이 실제로 유효합니까? 경로 찾기 알고리즘이 불가능하거나 실제로 처음부터 끝까지 이어지는 경로를 반환하지 않도록해야합니다. 솔루션이 이상적임을 증명할 수는 없지만 최소한 반환 값이 실제로 솔루션 인지 확인할 수 있어야합니다 .
  2. 솔루션이 "충분히 좋은"것입니까? 알고리즘이 이상적인 솔루션보다 얼마나 나쁜지 정의하는 몇 가지 요구 사항이 있어야합니다. 이상적인 솔루션이 알려진 테스트 사례 (또는 비교 표준으로 사용하기에 충분하다고 생각되는 솔루션)가 있어야하며 알고리즘에서 제공하는 솔루션이 x % 이상 더 나쁘지 않은지 확인해야합니다.
  3. 알고리즘이 충분히 빠릅니까? 당신은 그들이 훨씬 더 빠르기 때문에 정확성이 부족하다고 생각할 때 휴리스틱 접근법을 사용합니다. 이를 확인하려면 런타임을 측정하고 정확한 솔루션을 얻는 알고리즘보다 실제로 더 빠른지 확인해야합니다. 런타임 측정은 항상 약간 희미하므로 예상 런타임을 초과하는 것은 오류가 아니라 경고 여야합니다 (단위 테스트 프레임 워크가 경고와 오류를 다르게 할 수있는 경우).

경로가 유효한지 어떻게 판단하는지 테스트하기위한 제안을 해 줄 수 있습니까?
dwjohnston

@dwjohnston 그냥 그래프를 가져 가서 경로를 따라 가서 그래프 위로 경로를 가로 지르십시오. 경로의 각 모서리가 현재 노드에서 시작하고 경로가 올바른 노드에서 시작하고 끝나는 지 확인하십시오. 또한 종료 전에 엔드 노드에 도달하지 않았는지 확인할 수도 있습니다.
Philipp

불필요한 루프를 나타 내기 때문에 경로의 노드가 두 번 사용되지 않았는지 확인할 수도 있습니다. 물론, 당신은 루프를 유용하게 만드는 특별한 규칙을 가지고 있지 않는 한, 하나의 좌회전보다 3 개의 우회전을 선호하는 UPS 경로 찾기 시스템 과 같습니다 .
Philipp

3

휴리스틱을 포함한 대부분의 최적화 알고리즘은 작업에 적용하여 일부 구성 (예 : 경로)에서 작동합니다. 자체적으로 작업을 수행하면 유효한 구성 만 제공 할 수 있으므로 먼저 각 구성에 대한 단위 테스트가 있어야합니다. 최적화 알고리즘이 해당 연산 만 사용하는지 확실하게 알면 일반적으로 알고리즘 결과의 유효성 테스트가 필요하지 않습니다.

더 복잡한 알고리즘에 대해 좋은 단위 테스트를 만들려면 실제로 알고리즘 자체 를 자세히 알아야합니다 . "힐 클라이밍"과 같은 간단한 휴리스틱의 경우 일반적으로 작은 입력의 결과를 예측할 수 있습니다. 예를 들어, 3 ~ 5 포인트의 초기 경로의 경우 특정 순서로 제공 될 때 발생하는 상황을 예측할 수 있습니다. 이것은 내가 아는 대부분의 결정 론적 휴리스틱 알고리즘에 적용되므로 시작하기에 좋은 곳일 것입니다.

더 복잡한 알고리즘과 더 큰 입력 크기의 경우 입력을 알고리즘에 공급하고 출력을 확인하려고 할 때 실제로 더 이상 단위 테스트를 수행하지 않고 수락 또는 통합 테스트를 수행합니다. 이러한 알고리즘을 "단위 테스트"하는 데 문제가있는 이유는 일반적으로 소수의 작은 부품 (개별 단위)으로 구성되어 있기 때문입니다. 따라서 이러한 알고리즘을 실제로 단위 테스트하려면 해당 부분을 식별하고 개별적으로 테스트해야합니다. 또한 코드 범위 또는 분기 범위 기술을 사용하여 충분한 테스트 사례를 확보 할 수 있습니다.

단위 테스트가 아닌 자동 수락 또는 통합 테스트를 찾고 있다면 @Phillip이 (2) 또는 (3)에서 제안한 것을 시도해 볼 수 있습니다 .

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