Sezgisel bir algoritmayı nasıl test ederim?


10

Diyelim ki rota bulma algoritmamız var:

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

Şimdi bunu birim test etmek istiyoruz:

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

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

Soru, sezgisel olmayan bir TSP algoritması için, çeşitli grafikler verebilir ve her zaman kesinlikle en kısa yolu döndürüp dönmediklerini kontrol edebiliriz.

Ancak, heurtistik bir algoritma, hala deterministik olsa da, daha az tahmin edilebilir olduğundan, algoritmanın nasıl çalıştığını anlaması ve bu uç vakaları bulması amaçlanmaktadır?


Yanıtlar:


11

İdeal olanı değil, "yeterince iyi" bir çözümü döndürmesi beklenen bir sezgisel algoritma için, çeşitli test durumları ve kontroller

  1. çözüm gerçekten geçerli mi? Kesinlikle rota bulma algoritmanızın imkansız olan veya aslında baştan sona yol açmayan yollar döndürmediğinden emin olmak istersiniz. Sen çözüm ideal olduğunu kanıtlamak için mümkün olmayabilir, ama en azından geri dönüş değeri aslında doğrulamak gerekir ise bir çözüm.
  2. çözüm "yeterince iyi" mi? İdeal çözümden algoritmanın ne kadar kötü olabileceğini tanımlayan bazı gereksinimleriniz olmalıdır. İdeal çözeltinin bilindiği (veya en azından bir karşılaştırma standardı olarak kullanılacak kadar iyi kabul edilen bir çözeltinin) olduğu test durumlarına sahip olmanız ve algoritma tarafından sağlanan çözeltinin% x'den daha kötü olmadığını doğrulamanız gerekir.
  3. Algoritma yeterince hızlı mı? Çok daha hızlı olmalarından dolayı hassasiyet eksikliklerini telafi ettiklerini varsayarak sezgisel bir yaklaşım kullanırsınız. Bunu doğrulamak için çalışma zamanını ölçmeli ve tam çözümü alan bir algoritmadan daha hızlı olduklarından emin olmalısınız. Çalışma zamanı ölçümleri her zaman biraz bulanıktır, bu nedenle beklenen çalışma zamanını aşmak bir hata değil, bir uyarı olmalıdır (birim test çerçeveniz uyarılar ve hatalar arasında farklılık göstermesine izin verdiğinde).

Belki de bir rotanın geçerli olduğunu nasıl belirleyeceğinizi test etmek için bir öneri verebilir misiniz?
dwjohnston

@dwjohnston Sadece grafiğinizi alın, yolunuzu kullanın ve yolu grafiğinizin üzerinden geçirmeye çalışın. Yolun her kenarının geçerli düğümden çıktığını ve yolun doğru düğümlerde başladığını ve bittiğini doğrulayın. Ayrıca, uç düğüme bitişten önce ulaşılmadığını da doğrulayabilirsiniz.
Philipp

Ayrıca yolunuzdaki hiçbir düğümün iki kez kullanılmadığını da doğrulayabilirsiniz, çünkü bu gereksiz bir döngüyü gösterir. Tabii ki, döngüleri kullanışlı kılan bazı özel kurallarınız yoksa, örneğin bir sola dönüşte üç sağ dönüşü tercih eden UPS rota bulma sistemi gibi .
Philipp

3

Çoğu optimizasyon algoritması (sezgisel tarama dahil) bazı yapılandırmalarda (örneğin bir rotada) üzerlerine işlemler uygulayarak çalışır. Operasyonların kendisi sadece geçerli konfigürasyonlar sunduklarını garanti etmelidir, bu yüzden önce her biri için birim testleri yapılmalıdır. Optimizasyon algoritmasının yalnızca bu işlemleri kullandığından emin olduğunuzda, algoritma sonucunun geçerlilik testine gerek yoktur.

Her türlü daha karmaşık algoritma için iyi birim testleri oluşturmak için, algoritmanın kendisini ayrıntılı olarak bilmek gerekir . "Tepeye tırmanma" gibi basit buluşsal yöntemler için genellikle küçük girdilerin sonucunu tahmin edebilirsiniz. Örneğin, 3 ila 5 puanlık ilk rotalar için, belirli bir sırayla verildiğinde, ne olacağını tahmin edebilirsiniz. Bu, bildiğim çoğu deterministik sezgisel algoritma için geçerli olacak, bu yüzden muhtemelen başlamak için iyi bir yer.

Daha karmaşık algoritmalar ve girdinin daha büyük boyutu için, girdiyi algoritmaya beslediğinizde ve çıktıyı kontrol etmeye çalıştığınızda, artık bir birim testi yapmıyorsunuz, kabul veya entegrasyon testi yapıyorsunuz. Böyle bir algo için "birim testi" yapmakta sorun yaşamanızın nedeni, tipik olarak bir avuç daha küçük parçadan (münferit birimler) oluşmasıdır. Yani böyle bir algoritmayı gerçekten birim test etmek için, bu parçaları tanımlamanız ve ayrı ayrı test etmeniz gerekecektir. Ayrıca, yeterli test vakasına sahip olduğunuzdan emin olmak için kod kapsamı veya şube kapsamı tekniklerini kullanabilirsiniz.

Birim testleri değil, otomatik kabul veya entegrasyon testleri arıyorsanız, @Phillip'in (2) veya (3) altında önerdiğini deneyebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.