Sto lavorando ad una libreria di algoritmi di approssimazione open-source per grafici e reti usando come base alcuni pacchetti python popolari. L'obiettivo principale è comprendere algoritmi di approssimazione aggiornati per problemi NP-Complete su grafici e reti. La ragione di ciò è 1) Non ho visto un bel pacchetto (moderno) consolidato che copra questo e 2) sarebbe un bel strumento pedagogico per imparare ad algoritmi di approssimazione su problemi di ottimizzazione NP-Hard.Algoritmi di approssimazione del test delle unità
Nella creazione di questa libreria sto usando unit-test per verificare l'integrità (come farebbe uno sviluppatore corretto). Sono un po 'cauto riguardo ai miei test unitari in quanto, per loro stessa natura, gli algoritmi di approssimazione potrebbero non restituire la soluzione corretta. Attualmente sto risolvendo alcune piccole istanze a mano e poi assicurando che il risultato restituito corrisponda a quello, ma questo non è desiderabile, né scalabile in senso implementativo.
Quale sarebbe il modo migliore per testare gli algoritmi di approssimazione? Generare istanze casuali e assicurarsi che i risultati restituiti siano inferiori al limite garantito dall'algoritmo? Sembrerebbe avere falsi positivi (il test è stato solo fortunato in quel momento, non è garantito che tutte le istanze siano inferiori al limite).
Se si generano "istanze casuali" per problemi NP-completi, come sarebbe possibile conoscere la risposta reale al fine di testare i limiti? IMHO hai ancora bisogno di scegliere attentamente i casi di test. Scegli casi che puoi, in quanto umani, individuare la vera risposta, ma ciò può essere o meno un tentativo per l'algoritmo di approssimazione, o almeno per l'esercizio. Tali casi possono ancora essere generati in modo programmatico per essere sufficientemente grandi da essere realistici. Semplicemente non dovrebbero essere _random_. –
Espandendo sul commento di @Ray Toal, ci sono alcuni tipi di problemi complessi che sono facili se si genera il problema; ad esempio, factoring * pq * è difficile, a meno che tu non sappia già * p * e * q * perché li hai generati. È possibile applicare un principio simile ai problemi grafici/di rete? –
+1 Tom è esattamente ciò che intendo generando programmaticamente casi noti. Sono un po 'titubante di aggiungere una risposta al momento perché non sono un'autorità in questo settore; forse qualcuno può venire da chi ha esperienza qui. Stavo solo provando a mettere una bandiera rossa attorno alla parola "random". –