2012-04-05 15 views
1

Ich schreibe ein Paket für das Experimentieren mit evolutionären Algorithmen, und es versteht sich von selbst, dass es viele stochastische Methoden beinhaltet. Nun möchte ich einige (doc) Tests für dieses Paket schreiben, damit ich überprüfen kann, ob alles funktioniert, aber ich stoße in Situationen, in denen der Test "meistens" wahr sein sollte. Es fühlt sich an, als ob ich mich dem wahrscheinlich in die falsche Richtung nähern würde, aber ich würde trotzdem gerne einige deiner Gedanken dazu hören.Schreibtests für stochastische Funktionen

Zum Beispiel, ich habe so etwas in meinem Doctests:

>>> a = Genome() 
>>> b = Genome() 
>>> a.mutate() 
>>> a != b 
True # Well, most of the time. 

Implementierung von Tests wie das würde bedeuten, dass der Test wird manchmal fehlschlagen, während alles funktioniert.

Ich lese den Vorschlag, die RNG Samen zu beheben, bevor Tests zu tun, aber dann würde ich dafür sorgen, dass alles funktioniert vor ich den Test schreiben kann, da der Test das erwartete Ergebnis enthalten soll.

+1

Wissen Sie, was Sie am meisten '' 'wollen? Wenn es mindestens 1% ist, können Sie in Ihrer Einheit 100 Antworten generieren und sicherstellen, dass nicht mehr als 1 oder 2 von dem abweichen, was Sie möchten. – Zenon

+0

@Zenon Aber statistisch gesehen ist es manchmal kleiner als dieser Mindestprozentsatz, so dass die Tests immer noch fehlschlagen. – noio

+0

Sie sollten Ihre Tests auf stochastischen Funktionen identifizieren, und wenn einer fehlschlägt, führen Sie den Test ein zweites Mal mit angemessenen Schwellenwerten aus. – Zenon

Antwort

1

Sie könnten die Wahrscheinlichkeit, dass es vernachlässigbar ausfällt, z.B.

a = Genome() 
genomes = [] 
for i in range(100): 
    b = Genome() 
    b.mutate() 
    genomes.append(b) 
assert any(a != b for b in genomes) 

Wenn Ihr ursprünglicher Test die meiste Zeit erfolgreich war, wird dieser immer für alle praktischen Zwecke erfolgreich sein.

Dieser Test könnte auch angemessene Grenzen für die Anzahl der Genome festlegen, die übereinstimmen dürfen.

Der Test liest sich weniger schön als das Original. Vielleicht ist die Verwendung von Doctests hier der falsche Ansatz, und Sie sollten separate Komponententests schreiben.

+0

Also die Tatsache, dass es möglich ist (obwohl unwahrscheinlich), dass es ohne guten Grund versagt, ist verzeihlich? – noio

+0

@Noio: Dies ist eher eine praktische als eine theoretische Frage. Wenn Ihr ursprünglicher Test in etwa 10% der Fälle fehlgeschlagen ist, wird dieser in einem von 10^100 Fällen fehlschlagen. In der Praxis ist das nie. –

Verwandte Themen