Test di algoritmi (deterministici) con risposte corrette corrette multiple o difficili da dimostrare


11

Vorrei premettere che questa domanda è simile, ma la mia domanda non riguarda la casualità, ma solo il determinismo pignolo, quindi la risposta di "usa un seme conosciuto" non si applica davvero. Allo stesso modo, questa domanda è simile, ma ancora una volta, non mi aspetto che l'algoritmo fallisca mai, ma non so in che modo sarà corretta.

Questa domanda è nata durante il test degli algoritmi grafici. ma non si limita affatto a loro. Alcuni algoritmi come A * possono avere più risposte corrette. A seconda della tua esatta implementazione potresti ricevere una delle diverse risposte, ognuna delle quali è ugualmente corretta. Questo può renderli difficili da testare, perché non sai quale verrà sputato in anticipo, ed è molto dispendioso calcolare le risposte a mano.

Nel mio caso specifico, ho aggirato il problema modificando Floyd-Warshall per sputare ogni possibile percorso più breve e ho trascorso il tempo a testarlo. Ha avuto il vantaggio di essere una buona caratteristica a sé stante. Quindi ho potuto testare altre funzioni in termini di percorsi corretti noti da FW (se il percorso restituito è uno dei percorsi restituiti da FW per quella coppia iniziale / finale, è corretto). Ovviamente, questo funziona solo con grafici densi a causa del funzionamento di FW, ma è comunque bello.

Tuttavia, ciò potrebbe non essere sempre praticabile per tutti gli algoritmi con questa caratteristica. Finora, la migliore risposta che ho trovato è quella di testare le caratteristiche di una risposta corretta, piuttosto che la risposta corretta stessa. Per tornare agli algoritmi del percorso più breve, è possibile verificare il costo del percorso restituito rispetto al costo corretto noto e assicurarsi che il percorso sia valido.

Funziona, ma può correre il rischio di non verificare tutto correttamente, più sono i criteri per la correttezza, soprattutto se la verifica è essa stessa complessa (es. Mentre esistono algoritmi corretti , verificare che un albero di spanning minimo sia un problema difficile noto; probabilmente più difficile di costruzione dell'MST stesso), nel qual caso ora è necessario testare ampiamente il codice di test. Peggio ancora: presumibilmente devi costruire un MST per testare un algoritmo di verifica MST, quindi ora hai un ottimo scenario in cui il tuo test MST si basa sul funzionamento dell'algoritmo di verifica MST e il test dell'algoritmo di verifica MST si basa sul funzionamento del codice di generazione MST.

Infine, esiste il "modo economico", che prevede l'osservazione dell'output, la verifica manuale, quindi la codifica del test per testare l'output appena verificato, ma non è una buona idea poiché potrebbe essere necessario rivedere il test ogni volta che cambiare un po 'l'implementazione (che è ciò che dovrebbe evitare il testing automatizzato).

Ovviamente la risposta dipende dall'algoritmo esatto che stai testando fino a un certo punto, ma mi chiedevo se esistessero delle "migliori pratiche" per verificare algoritmi che hanno diversi output "corretti" definiti e deterministici, ma questi output corretti e precisi sono difficili da sapere in anticipo, e possibilmente difficile persino verificare dopo il fatto.


3
Se la lingua lo consente, potresti provare la correttezza invece di
provarla

C'è molto testo, ma nessuna domanda. Allora, cosa stai chiedendo esattamente?
BЈовић,

@ BЈовић "Come devo testare le implementazioni di algoritmi con output multipli e / o difficili da verificare?" Non sono sicuro di come renderlo molto più chiaro, scusa. Concederò che potrebbe essere considerato un po 'ampio a seconda della tua prospettiva, ma non penso che sia indefinito.
LinearZoetrope,

Ancora non capisco. Il tuo algoritmo non dipende dalla casualità, eppure può ancora produrre output diversi. Non ha affatto senso. Ogni algoritmo, per gli input impostati, deve avere gli stessi output. E questo è ciò che viene fatto e testato nei test unitari. Anche l'algoritmo nel documento che hai collegato.
BЈовић,

@ BЈовић Naturalmente è deterministico, ma è anche molto sensibile, ad esempio l'ordine in cui il grafico restituisce i successori di un nodo. Può causare un po 'di effetto farfalla. Se spingi il vertice A su uno stack prima del vertice B, otterrai un output diverso se entrambi porteranno a un percorso più breve. L'uso di funzioni di libreria come ordinamenti non stabili o min-heap non fa che aggravare il problema.
LinearZoetrope,

Risposte:


5

Non sono sicuro che stai provando a testare la proprietà corretta e questo causa la tua ambiguità.

Gli algoritmi grafici non mirano a trovare un percorso più breve (questo è un effetto collaterale), ma a minimizzare o massimizzare alcune funzioni di costo definite sull'insieme di spigoli e vertici. Pertanto, è possibile verificare la correttezza di una soluzione verificando il valore finale di questo funzionale e affermando che il primo e l'ultimo nodo sono quelli effettivamente richiesti.

Se è possibile pre-calcolare il valore della funzione di costo finale per ogni possibile percorso (in genere non realistico), è sufficiente verificare che il costo della soluzione fornita dall'implementazione sotto test sia uguale al costo minimo tra questo set (confronto assoluto ). Se hai "solo" un algoritmo e / o un'implementazione gold standard, allora dovresti confrontare il costo del suo output con quello dell'algoritmo sotto test (confronto relativo)

Ad esempio, un'impostazione di test ingenua sarebbe:

  1. Calcola tutti i possibili percorsi tra Va e Vb nel grafico del test con un algoritmo avido.
  2. Calcola la funzione di costo (ad esempio, la lunghezza se tutti i tuoi pesi del bordo sono uguali a 1) per ciascuno di questi percorsi e trova il valore minimo.
  3. Applica l'algoritmo sotto test.
  4. Fai una dichiarazione nel tuo test unitario che il valore di costo dell'algoritmo testato è uguale al minimo delle soluzioni avide.

Se vuoi saperne di più sull'ottimizzazione basata sui grafici, puoi dare un'occhiata alle pubblicazioni di Yuri Boykov qui , anche se in un altro contesto (problemi di Computer Vision).


Ho votato a favore, ma aspetterò un po 'per accettare. Questo è il "test per le caratteristiche di una risposta corretta" che ho citato nella domanda. Il problema arriva sempre assicurandoti di verificare la cosa giusta. Ad esempio, subito controllavo il costo restituito e mi assicuravo che il percorso fosse valido. Ovviamente il percorso era valido! Era solo il nodo iniziale! Quindi ho dovuto modificare i test per assicurarmi che il percorso stesso avesse effettivamente restituito il costo corretto. Scemo errore, certo, ma più interazioni come questa ha il tuo risultato, più è probabile che lo siano.
LinearZoetrope,

@Jsor dal mio punto di vista, è il vantaggio del miglioramento continuo dei test: all'inizio non puoi capire tutte le proprietà di correttezza della soluzione, quindi un giorno fallire, migliorare il test e così via.
sansuiso,

Questa risposta raccomanda di testare le caratteristiche della risposta corretta, ma l'importante è scegliere quali caratteristiche rendono un buon test. In questo esempio, verificando che la risposta sia un percorso da A a B e che la funzione di costo sia uguale al valore minimo, si ottengono due criteri che soddisfano tutte le risposte corrette, mentre nessuna risposta errata soddisfa entrambi i criteri. Se questa risposta non fosse già stata data, avrei raccomandato qualcosa di simile. Certo, spesso non è facile sapere quali caratteristiche testare.
David K,

0

Penso che la risposta diretta alla tua domanda sia scegliere casi di test migliori. Mi chiedo i casi di test che stai utilizzando. I grafici che usi possono essere grafici CANNED in cui è relativamente facile per un essere umano determinare la risposta prevista. Prova a capire i casi "limite" di cui vuoi essere sicuro che il tuo algoritmo gestisca e crea un grafico fisso per ciascuno dei casi limite particolari che è facile da calcolare per un essere umano. Ad esempio, nel caso dell'algoritmo Djikstra, probabilmente puoi creare alcuni grafici 5x5 o 7x7 che coprono tutti i casi limite, anche se il tuo sistema reale potrebbe essere 500x500.

Quindi come controllo di integrità finale è possibile creare uno o due casi di test grafici più realistici. Ma in ogni caso, penso che sansuiso abbia il punto giusto in cui viene sottolineato che è necessario essere sicuri che si sta testando la proprietà corretta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.