2 votes

Comment changer la marche aléatoire en marche aléatoire auto-évitante ?

Quelqu'un pourrait-il m'aider à changer la marche aléatoire en marche aléatoire auto-évitante ? J'ai essayé de le faire mais sans succès. Voici le code de la marche aléatoire.

VOICI MON CODE DE TRAVAIL.

def random_walk_3D(N):
    Nsteps = range(N)
    xp,yp,zp = [0],[0],[0]
    pos = [0,0,0]
    rand = np.random.uniform(0,1,N)
    for i in Nsteps:
        # depending on the random number go right
        # left, up or down
        if 0.00000 <= rand[i] < 1.0/6.0: pos[0] = pos[0]+1
        if 1.0/6.0 <= rand[i] < 2.0/6.0: pos[0] = pos[0]-1
        if 2.0/6.0 <= rand[i] < 3.0/6.0: pos[1] = pos[1]+1
        if 3.0/6.0 <= rand[i] < 4.0/6.0: pos[1] = pos[1]-1
        if 4.0/6.0 <= rand[i] < 5.0/6.0: pos[2] = pos[2]+1
        if 5.0/6.0 <= rand[i] < 6.0/6.0: pos[2] = pos[2]-1
        xp.append(pos[0])
        yp.append(pos[1])
        zp.append(pos[2])

    return xp,yp,zp

0voto

TheDecks Points 86

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 :

  1. déterminer dans quel sens le marcheur peut aller.
  2. choisir la direction au hasard avec une probabilité égale.
  3. 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X