Doğru veya doğru doğru yanıtları kanıtlamak için birden fazla veya zor olan test (deterministik) algoritmalar


11

Bu sorunun benzer olduğunu önceden söylemek isterim , ama sorum rastgele değil, titiz determinizm içermiyor, bu yüzden "bilinen bir tohum kullan" cevabı gerçekten geçerli değil. Benzer şekilde, bu soru benzer, ama yine, algoritmanın hiç başarısız olmasını beklemiyorum - sadece hangi yolun doğru olacağını bilmiyorum.

Bu soru grafik algoritmaları test edilirken ortaya çıktı. ancak hiçbir şekilde bunlarla sınırlı değildir. A * gibi bazı algoritmaların birden fazla doğru yanıtı olabilir. Tam uygulamanıza bağlı olarak, her biri eşit derecede doğru olan birkaç cevaptan herhangi birini alabilirsiniz. Bu onları test etmeyi zorlaştırabilir, çünkü hangisinin vaktinden tüküreceğini bilmiyorsunuz ve cevapları elle hesaplamak çok zaman alıyor.

Özel durumumda, Floyd-Warshall'ı mümkün olan en kısa yolu tükürmek için değiştirerek etrafta dolaştım ve bunu zaman testi yaparak harcadım. Kendi başına iyi bir özellik olma avantajına sahipti. Daha sonra FW'den bilinen doğru yollar açısından diğer işlevleri test edebilirim (döndürülen yol, bu başlangıç ​​/ bitiş çifti için FW tarafından döndürülen yollardan herhangi biri ise, doğrudur). Tabii ki, bu sadece FW'nin çalışması nedeniyle yoğun grafikler için çalışıyor, ama yine de güzel.

Ancak bu, bu özelliğe sahip tüm algoritmalar için her zaman geçerli olmayabilir. Şimdiye kadar bulduğum en iyi cevap, doğru cevabın kendisini değil, doğru cevabın özelliklerini test etmektir. En kısa yol algoritmalarına geri dönmek için, döndürülen yolun maliyetini bilinen doğru maliyetle karşılaştırabilir ve yolun geçerli olduğundan emin olabilirsiniz.

Bu işe yarar, ancak her şeyin doğru bir şekilde doğrulanmaması riskini, özellikle doğrulamanın kendisi karmaşıksa (örneğin doğru algoritmalar varken , minimum yayılan bir ağacın doğrulanması bilinen bir zor sorundur; muhtemelen daha zorsa) MST'nin kendisini oluşturmak), bu durumda test kodunuzu kapsamlı bir şekilde test etmeniz gerekir. Daha da kötüsü: Muhtemelen bir MST doğrulama algoritmasını test etmek için bir MST oluşturmanız gerekir, böylece MST testinizin MST doğrulama algoritmanızın çalışmasına ve MST doğrulama algoritması testinizin MST nesil kod çalışmanıza bağlı olduğu harika bir senaryoya sahipsiniz.

Son olarak, çıktıyı gözlemlemeyi, elle doğrulamayı, daha sonra az önce doğruladığınız çıktıyı test etmek için testi kodlamayı içeren "ucuz yol" vardır, ancak bu her seferinde testi revize etmeniz gerekebilir. uygulamayı biraz değiştirin (otomatik testlerden kaçınması gereken şey budur).

Açıkçası cevap, bir dereceye kadar test ettiğiniz tam algoritmaya bağlıdır, ancak birkaç kesin, belirleyici "doğru" çıktıya sahip algoritmaları doğrulamak için herhangi bir "en iyi uygulama" olup olmadığını merak ediyordum, ancak bu doğru doğru çıktıların zor önceden biliyorum ve hatta gerçeği sonra doğrulamak bile zor.


3
Dil buna izin veriyorsa , test etmek yerine doğruluğunu kanıtlayabilirsiniz
miniBill

Çok fazla metin var, ama soru yok. Peki, tam olarak ne soruyorsun?
BЈовић

@ BЈовић "Doğru çıktıları doğrulamak için çoklu ve / veya zor algoritma uygulamalarını nasıl test etmeliyim?" Bunu nasıl daha net hale getireceğimden emin değilim, üzgünüm. Bakış açınıza bağlı olarak biraz geniş olarak kabul edilebileceğini söyleyeceğim, ancak tanımsız olduğunu düşünmüyorum.
LinearZoetrope

Hala anlamıyorum. Algoritmanız rastgele değildir, ancak yine de farklı çıktılar üretebilir. Bu hiç mantıklı değil. Ayarlanan girişler için her algoritma aynı çıkışlara sahip olmalıdır. Ve birim testlerde yapılan ve test edilen budur. Bağladığınız kağıttaki algoritma bile.
BЈовић

@ BЈовић Elbette deterministik, ama aynı zamanda çok hassas, örneğin grafiğin bir düğümün ardıllarını döndürme sırası. Biraz kelebek etkisine neden olabilir. Tepe noktası B'yi tepe noktası B'den önce bir yığına itip itmemeniz, her ikisi de en kısa yola yol açarsa farklı bir çıktıya neden olur. Kararlı olmayan türler veya yığınlar gibi kütüphane işlevlerini kullanmak sorunu daha da kötüleştirir.
LinearZoetrope

Yanıtlar:


5

Doğru mülkü test etmeye çalıştığınızdan emin değilim ve bu da belirsizliğinize neden oluyor.

Grafik algoritmaları yok değil bir bulma amacı en kısa yol (bu bir yan etkisi), ama en aza indirmek ya da maliyet fonksiyonu maksimize kenarları ve köşeleri setinde tanımlanmaktadır. Böylece, bu işlevselliğin son değerini test ederek ve ilk ve son düğümlerin gerçekte gerekli olanlar olduğunu söyleyerek bir çözümün doğruluğunu kontrol edebilirsiniz.

Her olası yol için (genellikle gerçekçi olmayan) nihai maliyet fonksiyonu değerini önceden hesaplayabiliyorsanız, test edilen uygulama tarafından sağlanan çözümün maliyetinin bu set arasındaki minimum maliyete eşit olduğunu kontrol etmeniz gerekir (mutlak karşılaştırma) ). Altın standart algoritmaya ve / veya uygulamaya "sadece" sahipseniz, çıktı maliyetini test edilen algoritma ile karşılaştırmalısınız (göreceli karşılaştırma)

Örneğin, saf bir test kurulumu şöyle olur:

  1. Açgözlü bir algoritma ile test grafiğinde Va ve Vb arasındaki tüm olası yolları hesaplayın.
  2. Bu yolların her biri için maliyet işlevini (örneğin, tüm kenar ağırlıklarınız 1'e eşitse uzunluk) hesaplayın ve minimum değeri bulun.
  3. Test edilen algoritmayı uygulayın.
  4. Birim testinizde, test edilen algoritma maliyet değerinin açgözlü çözümlerin minimum değerine eşit olduğunu iddia edin.

Eğer grafik tabanlı optimizasyonu hakkında daha fazla bilgi edinmek istiyorsanız, Yuri Boykov yayınları bir göz olabilir burada olsa başka bir bağlamda (Bilgisayar Görme sorunları) içinde.


Kaldırdım, ama kabul etmek için biraz bekleyeceğim. Bu, soruda bahsettiğim "doğru cevabın özellikleri testi" dir. Sorun her zaman doğru olanı doğruladığınızdan emin olmaktır. Örneğin, bir kerede iade edilen maliyeti kontrol ediyor ve yolun geçerli olduğundan emin oluyordum. Tabii ki yol geçerliydi! Sadece başlangıç ​​düğümü! Bu yüzden, yolun kendisinin geri döndüğü, doğru maliyete sahip olduğundan emin olmak için testleri değiştirmek zorunda kaldım. Aptalca bir hata, elbette, ama bunun gibi etkileşimler ne kadar çok etkileşime girerse, o kadar olasıdır.
LinearZoetrope

Benim görüşüme göre, testin sürekli iyileştirme avantajı: ilk önce çözümün tüm doğruluk özelliklerini anlayamazsınız, daha sonra bir gün başarısızlığa uğrayamazsınız, testinizi geliştiremezsiniz.
sansuiso

Bu cevap, doğru cevabın özellikleri için test yapılmasını önerir, ancak önemli olan hangi özelliklerin iyi bir test yapacağını seçmektir . Bu örnekte, cevabın A'dan B'ye bir yol olduğunu ve maliyet fonksiyonunun minimum değere eşitlendiğini doğrulamak, tüm doğru cevapların karşılayacağı iki kriter verirken, yanlış cevapların her iki kriteri de karşılamayacağını gösterir. Bu cevap henüz verilmemiş olsaydı, benzer bir şey tavsiye ederdim. Kuşkusuz hangi özellikleri test edeceğinizi bilmek kolay değildir.
David K

0

Sorunuzun doğrudan cevabının daha iyi test örnekleri seçmek olduğunu düşünüyorum. Kullandığınız test senaryolarını merak ediyorum. Kullandığınız grafikler, bir insanın beklenen yanıtı belirlemesinin nispeten kolay olduğu CANNED grafikleri olabilir. Algoritmanızın işlediğinden emin olmak istediğiniz "kenar" durumlarını anlamaya çalışın ve bir insanın hesaplaması kolay olan belirli kenar durumlarının her biri için hazır bir grafik oluşturun. Örneğin, Djikstra algoritması durumunda, gerçek sisteminiz 500x500 olsa bile, muhtemelen tüm kenar durumlarınızı kapsayan 5x5 veya 7x7 grafikler oluşturabilirsiniz.

Daha sonra son bir akıl sağlığı kontrolü olarak daha gerçekçi bir grafik test durumu veya iki tane oluşturabilirsiniz. Ancak her durumda, sansuiso'nun doğru mülk için test ettiğinizden emin olmanız gerektiğine işaret ettiği yere sahip olduğunu düşünüyorum.

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.