Les tas sont représentés par la classe priority_queue dans la STL. Cette classe est caractérisée par les éléments suivants :
Les séquences de Bean offrent un codage particulièrement efficace pour la résolution par algorithme génétique du problème du voyageur de commerce (TSP).
Rappelons brièvement que le principe des algorithmes génétiques consiste à disposer d'une population de chromosomes codant différentes solution d'un problème. A chaque itération, ces chromosomes sont croisés par paires pour donner une nouvelle génération.
La plus commune des techniques de croisement imite le processus naturel du cross over. Les deux chromosomes sont coupés en un certain nombre d'endroits et leurs différentes parties sont recopiées. La figure suivante illustres des cross overs à 1 et 2 points.
Utiliser des séquences de villes pour coder un TSP ne convient pas car l'application des cross overs ne donne pas toujours des solutions réalisables (c'est à dire correspondant à une solution du problème). L'exemple suivant illustre ce problème pour un TSP à 6 villes sur un cross over à 1 point.
Bean a eu l'idée d'utiliser un générateur de nombres aléatoires pour pallier cette difficulté. Le principe des séquences de Bean consiste à associer un nombre aléatoire à chaque ville en fonction de sa position dans la tournée.
Voici l'algorithme de codage d'une séquence de villes vers une séquence de Bean.
Lorsque vous effectuez un cross over sur de telles séquences, vous êtes sur d'obtenir une solution réalisable car chaque ville sera représentée une et une seule fois.
Voici l'algorithme de décodage de la séquence de Bean en une séquence de villes :
1 |
3 |
2 |
5 |
4 |
0.13 |
0.36 |
0.56 |
0.58 |
0.91 |
1 |
2 |
3 |
4 |
5 |
0.13 |
0.56 |
0.36 |
0.91 |
0.58 |
3 |
1 |
4 |
2 |
5 |
0.27 |
0.41 |
0.63 |
0.66 |
0.88 |
1 |
2 |
3 |
4 |
5 |
0.41 |
0.66 |
0.27 |
0.63 |
0.88 |
1 |
2 |
3 |
4 |
5 |
0.13 |
0.56 |
0.36 |
0.63 |
0.88 |
1 |
2 |
3 |
4 |
5 |
0.41 |
0.66 |
0.27 |
0.91 |
0.58 |
0.13 |
0.36 |
0.56 |
0.63 |
0.88 |
1 |
3 |
2 |
4 |
5 |
0.27 |
0.41 |
0.58 |
0.66 |
0.91 |
3 |
1 |
5 |
2 |
4 |
1 |
3 |
2 |
4 |
5 |
3 |
1 |
5 |
2 |
4 |
On vous demande d'utiliser la STL pour réaliser le codage et le décodage d'une séquence de villes vers une séquence de Bean.
Elle est axée sur les trois fichiers sources suivants :
Je vous concède que le code n'est pas simple à suivre. En effet, il utilise des template de tous les côtés ainsi que des astuces propres à l'utilisation de la STL.
Codez un algorithme génétique minimal pour chercher la solution d'un problème de voyageur de commerce. Pour cela, il faut disposer des coordonnées géographiques des villes pour calculer la longueur d'une tournée. Les opérateurs de XOvers peuvent aussi être codés sous la forme de classes foncteurs.