J'ai la grille suivante et j'essaie d'atteindre les 1 dans cette grille, l'obstacle est montré par 2. Le robot a priorisé le mouvement dans cet ordre: haut, droite, bas, gauche . La position de départ a un * à côté.Recherche de chemin DFS avec des obstacles
0 0* 0
0 2 0
1 1 0
Ce que je l'ai fait jusqu'à présent est de mettre la position de cette grille en une forme graphique, et aussi généré tous les mouvements possibles de chaque position dans l'ordre de priorité. Mais mon problème est que l'algorithme reste coincé dans une boucle quand il arrive à la dernière section de la deuxième rangée. J'essaie de mettre en place une sorte de détecteur de cycle afin que je ne sois pas coincé dans cette boucle.
Je devrais également mentionner que le robot peut visiter la même position deux fois plus longtemps que par des chemins différents. Donc ce que j'ai à ce jour est:
def dfs(grid,start):
#find the routes in U,R,D,L order
height = len(grid)
width = len(grid[0])
routes = {(i, j) : [] for j in range(width) for i in range(height)}
for row, col in routes.keys():
# Left moves
if col > 0:
routes[(row, col)].append((row , col - 1))
# Down moves
if row < height - 1:
routes[(row, col)].append(((row + 1, col)))
# Right moves
if col < width - 1:
routes[(row, col)].append(((row , col + 1)))
# Up moves
if row > 0:
routes[(row, col)].append(((row - 1, col)))
#find the blocked ones
blocked = {(i,j) for j in range(width) for i in range(height) if grid[i][j] == 2}
path = []
stack = [start]
while stack:
node = stack.pop()
if node not in blocked:
path.append(node)
stack = []
for x in routes[node]:
stack.extend([x])
return path
Où
grid = [[0, 0, 0], [0, 2, 0], [1, 1, 0]]
start = (0,1)
Faire cela à la main montre que le chemin doit aller comme suit: droite, bas, bas, gauche, droite, haut, haut, gauche, gauche, bas, bas
des suggestions sur la façon dont je peux mettre en œuvre le détecteur serait génial, je suis très nouveau à AI et python et j'ai essayé de comprendre cela toute la journée ... merci
Qu'est-ce qui fait que le chemin se termine à '(2, 0)'? Devrait-il se terminer lorsque toutes les cellules ont été visitées ou que toutes les 1 ont été visitées ou y a-t-il une autre condition? – niemmi
Est-ce que le robot ** doit ** prendre l'étape préférée avant d'essayer les autres options? Si le labyrinthe est '1 0 0 *', la bonne réponse est-elle à gauche, à gauche ou pas de chemin? – niemmi
Le chemin se termine lorsque tous les 1 ont été visités, et le robot prend l'étape dans l'ordre préféré, donc si le labyrinthe est 1 0 0 * il essayera, droit, bas, mais ce ne sont pas des mouvements possibles alors ça va left left – Ghazal