En tous cas je vois qu'il y a toujours autant d'activité et que les "anciens" sont toujours présents!
Je vous expose mon problème. J'ai repris mon projet d'implémentation de l'algorithme A* (recherche de chemins) et je cherche à l'optimiser.
Le bilan fourni par l'outil Callgrind après une recherche me précise que la majorité du temps utilisé pour le calcul d'un chemin consiste en la recherche du meilleur nœud. Cette fonction est appelée tant que le chemin n'est pas trouvé et tant qu'il reste des nœuds à explorer ; autrement dit c'est une des fonctions les plus sollicitées.
Mes nœuds sont une structure :
typedef struct { size_t parent; size_t object; long double F; long double G; long double H; bool isClosed; } NODE;
Ces nœuds sont enregistrés dans une liste dynamique : NODE** nodesList
* parent correspond au parent du nœud consulté. Seul le premier nœud n'a pas de parent. Cette information permet de récupérer le chemin complet (en remontant les parents du dernier nœud jusqu'au le premier). Par exemple, pour connaître le parent du nœud X, il faut simplement faire nodesList[X]->parent
* object est la référence du nœud sur la carte où est effectuée la recherche de chemin.
* F, G et H sont les valeurs de l'heuristique. F = G + H (où G est la distance entre le nœud courant et son parent; H est la distance entre le nœud courant et l'arrivée).
* si isClosed vaut false alors ce nœud a déjà été consulté lors de la recherche.
Cette façon de stocker les nœuds n'est pas géniale :
* je ne peux pas trier sinon les valeurs de parent n'ont plus de sens
* les nœuds consultées sont dans la même liste que ceux qui ne le sont pas
Comment faire pour
* stocker efficacement les NODE?
* les trier tout en gardant les références vers le parent de chacun d'entre eux?
* trouver le meilleur nœud de la liste rapidement (celui ayant le F le plus petit)?
Merci pour votre aide.
Je tiens le code source à dispo pour ceux que ça intéresse (sous licence Gnu/GPLv3)