
s'arrête, il faut que l'estimation de h, h* soit strictement inférieur au chemin optimal" Ainsi, nous
avons travaillé sur trois heuristiques différentes, décrites ci-dessous : l’heuristique « line »,
l’heuristique « column » et la plus optimale, l’heuristique « maximum ».
Description détaillée de notre programme
Nous avons, dans un premier temps, adapté la structure C qui nous était
fournie pour utiliser les fonctionnalités d’un langage objet tel que Python et créé un classe Node.
Cette classe contient comme attribut : son score g et h, le nombre d’affectation déjà réalisées
avec une liste de couple (i,j) (avec i, le i-ème employé et j, le j-ème poste,), ainsi que le nombre
totale d’affectation. Nous avons aussi définis quelques fonctions de base pour modifier les
attributs d’un nœud et redéfinis des fonctions systèmes comme __eq__(self, other) qui permet
de définir lorsqu’un nœud est ou non équivalent à un autre. Cela nous permet ainsi de
déterminer si un nœud est déjà ou non dans une liste (ici la liste OUVERT)
Nous avons ensuite mis en place le calcul des scores de chaque
nœud en fonction des différentes heuristiques que nous avions préalablement trouvées. Il était
très facile de trouver la valeur de g. Il suffit de récupérer toutes les affectations qui ont été
réalisées au nœud correspondant et de récupérer la valeur de ces dernières dans la matrice des
coûts. Dans un même temps nous créons deux listes qui contiennent tous les i et j (employés et
poste) qui ont été affectés, elles nous servirons pour le calcul de l’estimation de h.
En fonction de l’heuristique choisie nous devons maintenant définir la valeur de h*. On rappelle
que nos heuristiques, pour garantir l’optimalité du résultat, doivent donner un h* inférieur au
chemin optimal. Pour cela nous avons donné trois heuristiques différentes.
Tout d’abord l’heuristique ‘Line’ qui prend le minimum de chaque ligne sur la sous matrice des
employés et des postes qui n’ont pas encore été affectés. C’est dans cette partie que nos deux
listes des i et j nous servent. Nous parcourons toute la matrice en prenant en compte que les i et
j non affectés. Nous créons une liste pour chaque ligne et prenons le score minimum de chaque
ligne. Nous incrémentons alors l’estimation de h et passons à la ligne suivante. Nous observons
bien évidemment le même déroulement pour l’heuristique ‘Column’.
L’heuristique la plus optimale est de prendre le maximum des scores pour l’heuristique
‘Column’’ et ‘Line’. Nous devons calculer le score de h* pour les deux heuristiques et à chaque
noeud prendre celui qui est le plus élevé des deux.
Nous devons pour chaque état du GRP donner tous les
successeurs de ce nœud node, ainsi que tous les états suivants possibles.
Dans un premier temps nous avions mis en place un GRP qui prenait en compte tous les états
possibles à chaque profondeur : Au premier état du graphe, nous pouvions affecter tous les