Je pense que le principal problème ici serait que la marche auto-évitante n'a pas toujours un nombre fixe de points qu'elle peut visiter. Par définition, tout point ne peut être visité qu'une seule fois, donc à chaque étape le nombre de directions viables varie, et dans votre code actuel il est fixe.
Vous devez absolument stocker l'historique des points visités dans plus d'une page. amical façon. Je dirais qu'une liste de tuples de la forme (x, y, z) est une voie à suivre. Cela vous permet de vérifier plus facilement si une direction que vous envisagez de choisir a déjà été visitée. En général, pour chaque étape, vous devez procéder comme suit :
- déterminer dans quel sens le marcheur peut aller.
- choisir la direction au hasard avec une probabilité égale.
- sauvegarder la position dans l'histoire, afin de ne plus la visiter à nouveau.
Vous trouverez ci-dessous un code simple à cet effet :
import random
def get_possible_directions(point):
"""Point is in form (x, y, z)"""
directions = [
(point[0]+1, point[1], point[2]), # right
(point[0]-1, point[1], point[2]), # left
(point[0], point[1]+1, point[2]), # forward
(point[0], point[1]-1, point[2]), # backward
(point[0], point[1], point[2]+1), # up
(point[0], point[1], point[2]-1) # down
]
return directions
def random_walk_3D(N):
Nsteps = range(N)
current_position = (0, 0, 0)
visited_points = []
for _ in Nsteps:
visited_points.append(current_position)
all_directions = get_possible_directions(current_position)
not_visited_directions = [direction for direction in all_directions if direction not in visited_points]
current_position = random.choice(not_visited_directions)
xp, yp, zp = zip(*visited_points)
return xp, yp, zp # returns tuples. If you want lists, just do list(xp), ...
if __name__ == "__main__":
x, y, z = random_walk_3D(10)
print(x)
print(y)
print(z)
Vous voudrez peut-être jeter un coup d'œil à documentation aléatoire . Quant à la dernière étape de la fonction este pourrait vous aider.