git.fiddlerwoaroof.com
wilson.py
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))