Chemin le plus court sur un graphique non orienté?

19

J'ai donc pensé que cette question (quoique quelque peu basique) appartenait ici:

Disons que j'ai un graphique de taille 100 nœuds disposés en 10x10 (pensez à l'échiquier). Le graphique est non orienté et non pondéré. Se déplacer dans le graphique implique de déplacer trois espaces vers l'avant et un espace à droite ou à gauche (semblable à la façon dont un chevalier d'échecs se déplace sur une planche).

Étant donné un nœud de début fixe, comment trouver le chemin le plus court vers un autre nœud sur la carte?

J'ai imaginé qu'il n'y aurait qu'un bord entre les nœuds qui sont des mouvements viables. Donc, étant donné ces informations, je voudrais trouver le chemin le plus court d'un nœud de départ à un nœud de fin.

Ma pensée initiale était que chaque bord est pondéré avec le poids 1. Cependant, le graphique n'est pas orienté, donc Djikstras ne serait pas un ajustement idéal. Par conséquent, j'ai décidé de le faire en utilisant une forme modifiée d'une première recherche approfondie.

Cependant, je ne pouvais pas pour la vie de moi visualiser comment obtenir le chemin le plus court en utilisant la recherche.

Une autre chose que j'ai essayée était de mettre le graphique sous forme d'arbre avec le nœud de départ comme racine, puis de sélectionner le résultat le moins profond (numéro de ligne le plus bas) qui m'a donné le nœud final souhaité ... cela a fonctionné, mais était incroyablement inefficace, et donc ne fonctionnerait pas pour un graphique plus grand.

Quelqu'un a-t-il des idées qui pourraient me diriger dans la bonne direction à ce sujet?

Merci beaucoup.

(J'ai essayé de mettre une visualisation du graphique, mais je n'ai pas pu le faire en raison de ma faible réputation)

gfppaste
la source

Réponses:

19

Si les bords du graphique ne représentent que des mouvements valides entre certaines positions, l'utilisation de Dijkstra fonctionnerait très bien. Cependant, comme le graphique n'est pas pondéré, il serait exagéré. Une simple recherche en largeur donnera la réponse optimale.

Nicholas Mancuso
la source
ohhhhhh mec je ne pensais même pas à un BFS! Merci beaucoup!
gfppaste
Comment c'est exagéré? peut être la mise en œuvre est un peu plus difficile rien d'autre.
Je voudrais également ajouter que BFS est plus efficace. BFS l'a fait O(|E|), tandis que Dijkstra l'a fait O(|E| + |V|log(|V|).
Doug Ramsey
@ user742 BFS est plus rapide que Djikstras. Djikstra est O(mn)alors que BFS estO(V + E)
CodyBugstein
13

Nicolas a déjà fourni une réponse parfaite. Cependant, permettez-moi d'aborder votre tentative initiale d'utiliser la recherche en profondeur d'abord.

Tout d'abord, soit Dijkstra (qui fonctionne très bien avec des nœuds non pondérés comme l'a noté Nicholas Mancuso), soit une recherche en premier lieu entraîne un gaspillage exponentiel de votre mémoire. Leur avantage, cependant, est qu'ils ne ré-étendent jamais aucun nœud alors qu'ils sont assurés de trouver des solutions optimales. Malheureusement, leur limitation est assez importante et il ne faut pas s’attendre à ce qu’elles s’élargissent raisonnablement.

muneXkjemuneX+je×kmuneX=k=1 alors vous êtes assuré de trouver la solution optimale tout en utilisant la mémoire linéaire dans la profondeur de la solution.

bb-1b

À votre santé,

Carlos Linares López
la source