a9acab05 |
import numpy as np
class Traveller(object):
@property
def x(self): return self.pos[0]
@x.setter
def x(self, val): self.pos = val, self.pos[1]
@property
def y(self): return self.pos[1]
@y.setter
def y(self, val): self.pos = self.pos[0], val
def __init__(self, starting_cell):
self.pos = starting_cell
self.connections = []
self.visited = {self.pos}
def random_walk(self, array):
if len(self.visited) == array.size: return
steps = []
maxx, maxy = array.shape
sx,sy = None,None
while (sx,sy) == (None,None) or (sx,sy) in self.visited:
sx = np.random.random_integers(0,maxx-1)
sy = np.random.random_integers(0,maxy-1)
steps.append((sx,sy))
while True:
dx, dy = 0,0
r = np.random.random()
if r < 0.25: # x-1
dx = -1
elif r < 0.5: # x+1
dy = 1
elif r < 0.75: # y-1
dx = 1
else: # y+1
dy = -1
opos = self.pos
sx += dx
sy += dy
if sx < 0: sx = 0
elif sx >= maxx: sx = maxx-1
if sy < 0: sy = 0
elif sy >= maxy: sy = maxy-1
steps.append((sx,sy))
if (sx,sy) in self.visited:
met = set()
path = []
for x in steps:
if x in met:
path = path[:path.index(x)+1]
met = set(path)
else:
path.append(x)
met.add(x)
steps = deloop(path)
break
self.connections.extend(zip(steps, steps[1:]))
self.visited.update(steps)
def deloop(path):
result = []
idx = 0
while idx < len(path):
x = path[idx]
result.append(x)
try:
next_x = path[idx+1:].index(x)
idx = next_x + idx+1
except ValueError:
idx += 1
return(result)
x,y = 49,29
maze = np.array(range(1,x*y+1))
maze.shape = x,y
t = Traveller((x/2, y/2))
|