#include "viterbi.h" #include "../tuning.h" #include #include #include using std::vector; static double s_infini = std::numeric_limits::infinity() ; Viterbi::Viterbi() { } Viterbi::~Viterbi() { } std::list Viterbi::minimise( const vector & premier_arc, const vector & noeud_fin, const vector & couts, double * cout_minimal ) { size_t nb_noeuds = premier_arc.size(); std::list meilleur_chemin[nb_noeuds] ; // taille : nb_noeuds vector meilleurs_couts(nb_noeuds, s_infini) ; // taille : nb_noeuds // le coût du premier nœud est fixé à 0 meilleurs_couts[0] = 0 ; meilleur_chemin[0] = std::list(0) ; // Pour chaque noeud, on met à jour les meilleurs chemins for ( size_t noeud=0 ; noeud+1"<< noeud_fin[arc] << "\t" << couts[arc] << std::endl; #endif double cout = meilleurs_couts[noeud] + couts[arc] ; if (cout::iterator it=meilleur_chemin[ nb_noeuds - 1 ].begin(); it!=meilleur_chemin[ nb_noeuds - 1 ].end(); it++) { std::cout << "\n(arc " << *it << " vers noeud " << noeud_fin[*it] <<")"; } std::cout << std::endl ; #endif // on renvoie la liste des arcs arrivant au dernier noeud if (cout_minimal!=NULL) *cout_minimal = meilleurs_couts[ nb_noeuds - 1 ] ; return meilleur_chemin[ nb_noeuds - 1 ] ; } #ifdef TEST_VITERBI #include #include int main() { #define nb_noeuds 5 #define nb_arcs_par_noeud 1000000 #define cout_max 10 vector noeuds(nb_noeuds); vector arcs (nb_noeuds * nb_arcs_par_noeud); vector cout (nb_noeuds * nb_arcs_par_noeud); for (int i=0; i meilleur = Viterbi().minimise(noeuds, arcs, cout); for (std::list::iterator it=meilleur.begin(); it!=meilleur.end(); it++) { std::cout << "\n(" << *it << "," << cout[*it] << ") "; } std::cout << std::endl ; } #endif