Je dois trouver le plus court chemin dans un graphe non orienté dont les nœuds ont une pondération réelle (positive et négative). Ces poids sont comme des ressources que vous pouvez gagner ou perdre en entrant dans le nœud.
Le coût total (somme des ressources) du chemin n'est pas très important, mais il doit être supérieur à 0, et la longueur doit être la plus courte possible.
Par exemple, considérez un graphique comme celui-ci :
A-start node; D-end node
A(+10)--B( 0 )--C(-5 )
\ | /
\ | /
D(-5 )--E(-5 )--F(+10)
Le chemin le plus court serait A-E-F-E-D
L'algorithme de Dijkstra seul ne fait pas l'affaire, car il ne peut pas gérer les valeurs négatives. J'ai donc réfléchi à quelques solutions :
La première utilise l'algorithme de Dijkstra pour calculer la longueur du plus court chemin entre chaque nœud et le nœud de sortie, sans tenir compte des poids. Cela peut être utilisé comme une sorte de valeur heuristique comme dans A*. Je ne suis pas sûr que cette solution puisse fonctionner, et en plus elle est très coûteuse. J'ai également pensé à mettre en œuvre l'algorithme de Floyd-Warshall, mais je ne sais pas comment.
Une autre solution consistait à calculer le plus court chemin avec l'algorithme de Dijkstra sans tenir compte des poids, et si après avoir calculé la somme des ressources du chemin elle est inférieure à zéro, passer par chaque nœud pour trouver un nœud voisin qui pourrait rapidement augmenter la somme des ressources, et l'ajouter au chemin (plusieurs fois si nécessaire). Cette solution ne fonctionnera pas s'il y a un nœud qui pourrait suffire à augmenter la somme des ressources, mais qui est plus éloigné du plus court chemin calculé.
Par exemple :
A- start node; E- end node
A(+10)--B(-5 )--C(+40)
\
D(-5 )--E(-5 )
Pourriez-vous m'aider à résoudre ce problème ?
EDIT : Si, en calculant le chemin le plus court, vous atteignez un point où la somme des ressources est égale à zéro, ce chemin n'est pas valable, car vous ne pouvez pas continuer s'il n'y a plus d'essence.