ヒューリスティックアルゴリズムを単体テストするにはどうすればよいですか?


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、2015年

@dwjohnstonちょうどあなたのグラフを取り、あなたのパスを取り、そしてあなたのグラフ上でパスをトラバースすることを試みてください。パスの各エッジが現在のノードから進んでいること、およびパスが正しいノードで開始および終了していることを確認します。終了前に終了ノードに到達していないことを確認することもできます。
フィリップ

また、不要なループを示しているため、パス内のノードが2回使用されていないことも確認できます。もちろん、1つの左折より3つの右折を優先するUPSルート検索システムのようにループを有用にする特別なルールがない限り。
フィリップ

3

ほとんどの最適化アルゴリズム(ヒューリスティックを含む)は、それらに操作を適用することにより、いくつかの構成(例ではルート)で機能します。オペレーション自体は、有効な構成のみを提供することを保証する必要があるため、最初にそれぞれのユニットテストを行う必要があります。最適化アルゴリズムがこれらの演算のみを使用することが確実である場合は、通常、アルゴリズムの結果の有効性テストは必要ありません。

より複雑なアルゴリズムの適切な単体テストを作成するには、実際にアルゴリズム自体を詳細に知る必要があります。「山登り」のような単純なヒューリスティックの場合、通常、小さな入力の結果を予測できます。たとえば、3〜5ポイントの初期ルートの場合、特定の順序で指定すると、何が起こるかを予測できます。これは、私が知っているほとんどの確定的ヒューリスティックアルゴリズムに当てはまるので、これから始めるのが良いでしょう。

より複雑なアルゴリズム、および入力のサイズが大きい場合、入力をアルゴリズムにフィードして出力を確認しようとすると、実際には単体テストが行​​われなくなり、受け入れまたは統合テストが行​​われます。このようなアルゴを「ユニットテスト」するのに問題があるのは、アルゴは通常、少数の小さなパーツ(個々のユニット)で構成されているためです。そのため、このようなアルゴリズムを実際にユニットテストするには、それらの部分を特定して個別にテストする必要があります。さらに、コードカバレッジまたはブランチカバレッジの手法を使用して、十分なテストケースがあることを確認できます。

単体テストではなく自動受け入れまたは統合テストを探している場合は、@ Phillipが(2)または(3)で提案したことを試すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.