2016-05-30 11 views
1

解決策を継続的に検索するために私の迷路を更新しようとしています(これは迷路の単純な統一コスト検索です)。私はパイロットを使用してion()各ノードの訪問後に私の数字を更新しています。私の問題は、数値が約20回の反復で非常にゆっくりと更新されることです。私はpause()の値を減らそうとしましたが、効果がないようです。 私はそれが私のPCではないと確信しています。ここPython - matplotlib.pyplot ion()slow

import matplotlib.pyplot as plt 
from matplotlib import colors as c 
import math 
import numpy as np 

class Queue: 
    def __init__(self): 
     self.items = [] 

    def isEmpty(self): 
     return self.items == [] 

    def enqueue(self, item): 
     self.items.insert(0,item) 

    def dequeue(self): 
     return self.items.pop() 

    def size(self): 
     return len(self.items) 

def euclideanDistance(pos1, pos2): 
    return math.sqrt(math.pow((pos2[0]-pos1[0]),2) + math.pow((pos2[1]-pos1[1]),2)) 

def getChildren(node, maze): 
    children = [] 
    y = node[0] 
    x = node[1] 
    i = 0 
    if y-1 != -1 and maze[y-1][x] != 1 and maze[y-1][x] != 2: 
     children.append([]) 
     children[i].append(y-1) 
     children[i].append(x) 
     i += 1 
    if y-1 != -1 and x+1 != 12 and maze[y-1][x+1] != 1 and maze[y-1][x+1] != 2: 
     children.append([]) 
     children[i].append(y-1) 
     children[i].append(x+1) 
     i += 1 
    if x+1 != 12 and maze[y][x+1] != 1 and maze[y][x+1] != '.': 
     children.append([]) 
     children[i].append(y) 
     children[i].append(x+1) 
     i += 1 
    if y+1 != 12 and x-1 != -1 and maze[y+1][x-1] != 1 and maze[y+1][x-1] != 2: 
     children.append([]) 
     children[i].append(y+1) 
     children[i].append(x-1) 
     i += 1 
    if y+1 != 12 and maze[y+1][x] != 1 and maze[y+1][x] != '.': 
     children.append([]) 
     children[i].append(y+1) 
     children[i].append(x) 
     i += 1 
    if y+1 != 12 and x+1 != 12 and maze[y+1][x+1] != 1 and maze[y+1][x+1] != 2: 
     children.append([]) 
     children[i].append(y+1) 
     children[i].append(x+1) 
     i += 1 
    if x-1 != -1 and maze[y][x-1] != 1 and maze[y][x-1] != 2: 
     children.append([]) 
     children[i].append(y) 
     children[i].append(x-1) 
     i += 1 
    if y-1 != -1 and x-1 != -1 and maze[y-1][x-1] != 1 and maze[y-1][x-1] != 2: 
     children.append([]) 
     children[i].append(y-1) 
     children[i].append(x-1) 
     i += 1 
    return children 

def uniformCostSearch(root, goal, maze): 
    q = Queue() 
    path = maze 
    root.append(0) 
    q.enqueue(root) 
    while not q.isEmpty(): 
     temp = q.dequeue() 
     printMaze(path) 
     path[temp[0]][temp[1]] = 2 
     if temp[0] == goal[0] and temp[1] == goal[1]: 
      return path 
     else: 
      children = getChildren(temp, path) 
      cArray = [] 
      if len(children) != 0: 
       for child in children: 
        child.append(temp[2]+euclideanDistance(temp, child)) 
        cArray.append(child) 
       cArray.sort(key=lambda x:x[2]) 
       for child in cArray: 
        q.enqueue(child) 

def printMaze(maze): 
    y = [12,11,10,9,8,7,6,5,4,3,2,1,0] 
    x = [0,1,2,3,4,5,6,7,8,9,10,11,12] 
    x, y = np.meshgrid(x, y) 
    maze = np.array(maze) 
    plt.ion() 
    cMap = c.ListedColormap(['w','grey','green','red']) 
    plt.xticks([0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5], [0,1,2,3,4,5,6,7,8,9,10,11]) 
    plt.yticks([0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5], [0,1,2,3,4,5,6,7,8,9,10,11]) 
    plt.pcolormesh(x, y, maze, edgecolor='k',cmap=cMap) 
    plt.pause(0.000000001) 
    plt.show() 

maze = [[0,0,0,0,0,0,0,0,0,0,0,0], 
     [0,1,1,1,1,1,1,1,1,1,1,0], 
     [0,1,1,1,1,1,1,1,0,3,1,0], 
     [0,0,0,0,0,0,1,1,0,0,1,0], 
     [0,1,1,0,0,0,1,1,0,0,1,0], 
     [0,1,1,0,0,0,1,1,0,0,1,0], 
     [0,1,0,0,0,0,1,1,0,0,1,0], 
     [0,0,0,0,0,1,1,1,0,0,1,0], 
     [0,0,0,0,1,1,1,1,0,0,1,0], 
     [0,0,0,1,1,1,1,1,0,0,1,0], 
     [0,0,1,1,1,1,1,1,0,0,0,0], 
     [0,0,0,0,0,0,0,0,0,0,0,0]] 

root = [] 
root.append(11) 
root.append(0) 

goal = [] 
goal.append(2) 
goal.append(9) 

printMaze(maze) 
uniformCostSearch(root, goal, maze) 

答えて

2

は、pcolormeshによって返さとしてQuadmeshをアニメートする方法を示す基本的な例です。あなたがする必要があるのは(笑)stepを変更して、表示したい迷路を得ます。

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import matplotlib.animation as animation 

def step(): 
    while True: 
     yield np.random.randint(4, size=(N, N)) 

def animate(data, quadmesh): 
    quadmesh.set_array(data.ravel()) 
    return [quadmesh] 

N = 12 
maze = np.random.randint(4, size=(N, N)) 

fig, ax = plt.subplots() 
cmap = mcolors.ListedColormap(['w','grey','green','red']) 
x, y = np.meshgrid(np.arange(N), np.arange(N)) 
quadmesh = ax.pcolormesh(x, y, maze, edgecolor='k',cmap=cmap) 

ani = animation.FuncAnimation(
    fig, animate, step, 
    interval=10, fargs=(quadmesh,), repeat=True, blit=True) 
plt.show() 

フレームとの間の遅延を低減するFuncAnimationintervalパラメータを減らし。これにより、アニメーションが高速になります。 問題がないことがわかります。アニメーションをすばやく作成できます。

が、更新単一 quadmesh(上記行ったように) plt.ionは、あなたの アニメーションはゆっくり行く printMaze(path)が 同じ pathで何度も呼び出されるためである主な理由をオンにして pcolormeshを複数回呼び出すよりも高速です。

あなたは迷路が頻繁に1多くの 回同じで、端末に表示されます

def printMaze(maze): 
    print(maze) 
    print('-'*80) 

するprintMazeを変更することによって、この主張を確認することができます。したがって、アニメーションを高速化するには、 uniformCostSearchをスマートにする必要があります。

import math 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import matplotlib.animation as animation 

class Queue: 
    def __init__(self): 
     self.items = [] 

    def isEmpty(self): 
     return self.items == [] 

    def enqueue(self, item): 
     self.items.insert(0,item) 

    def dequeue(self): 
     return self.items.pop() 

    def size(self): 
     return len(self.items) 

def euclideanDistance(pos1, pos2): 
    return math.sqrt(math.pow((pos2[0]-pos1[0]),2) + math.pow((pos2[1]-pos1[1]),2)) 

def getChildren(node, maze): 
    children = [] 
    y = node[0] 
    x = node[1] 
    i = 0 
    if y-1 != -1 and maze[y-1][x] != 1 and maze[y-1][x] != 2: 
     children.append([]) 
     children[i].append(y-1) 
     children[i].append(x) 
     i += 1 
    if y-1 != -1 and x+1 != 12 and maze[y-1][x+1] != 1 and maze[y-1][x+1] != 2: 
     children.append([]) 
     children[i].append(y-1) 
     children[i].append(x+1) 
     i += 1 
    if x+1 != 12 and maze[y][x+1] != 1 and maze[y][x+1] != '.': 
     children.append([]) 
     children[i].append(y) 
     children[i].append(x+1) 
     i += 1 
    if y+1 != 12 and x-1 != -1 and maze[y+1][x-1] != 1 and maze[y+1][x-1] != 2: 
     children.append([]) 
     children[i].append(y+1) 
     children[i].append(x-1) 
     i += 1 
    if y+1 != 12 and maze[y+1][x] != 1 and maze[y+1][x] != '.': 
     children.append([]) 
     children[i].append(y+1) 
     children[i].append(x) 
     i += 1 
    if y+1 != 12 and x+1 != 12 and maze[y+1][x+1] != 1 and maze[y+1][x+1] != 2: 
     children.append([]) 
     children[i].append(y+1) 
     children[i].append(x+1) 
     i += 1 
    if x-1 != -1 and maze[y][x-1] != 1 and maze[y][x-1] != 2: 
     children.append([]) 
     children[i].append(y) 
     children[i].append(x-1) 
     i += 1 
    if y-1 != -1 and x-1 != -1 and maze[y-1][x-1] != 1 and maze[y-1][x-1] != 2: 
     children.append([]) 
     children[i].append(y-1) 
     children[i].append(x-1) 
     i += 1 
    return children 

def step(): 
    seen = set() 
    q = Queue() 
    path = maze 
    root.append(0) 
    q.enqueue(root) 
    while not q.isEmpty(): 
     temp = q.dequeue() 
     frozen = tuple(map(tuple, path)) 
     if frozen not in seen: 
      seen.add(frozen) 
      yield path 
     path[temp[0]][temp[1]] = 2 
     if temp[0] == goal[0] and temp[1] == goal[1]: 
      return path 
     else: 
      children = getChildren(temp, path) 
      cArray = [] 
      if len(children) != 0: 
       for child in children: 
        child.append(temp[2]+euclideanDistance(temp, child)) 
        cArray.append(child) 
       cArray.sort(key=lambda x:x[2]) 
       for child in cArray: 
        q.enqueue(child) 


def animate(data, quadmesh): 
    quadmesh.set_array(data.ravel()) 
    return [quadmesh] 

maze = np.array([[0,0,0,0,0,0,0,0,0,0,0,0], 
       [0,1,1,1,1,1,1,1,1,1,1,0], 
       [0,1,1,1,1,1,1,1,0,3,1,0], 
       [0,0,0,0,0,0,1,1,0,0,1,0], 
       [0,1,1,0,0,0,1,1,0,0,1,0], 
       [0,1,1,0,0,0,1,1,0,0,1,0], 
       [0,1,0,0,0,0,1,1,0,0,1,0], 
       [0,0,0,0,0,1,1,1,0,0,1,0], 
       [0,0,0,0,1,1,1,1,0,0,1,0], 
       [0,0,0,1,1,1,1,1,0,0,1,0], 
       [0,0,1,1,1,1,1,1,0,0,0,0], 
       [0,0,0,0,0,0,0,0,0,0,0,0]]) 
root = [11, 0] 
goal = [2, 9] 

fig, ax = plt.subplots() 
x = np.arange(13) 
y = x[::-1] 
X, Y = np.meshgrid(x, y) 
plt.xticks([0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5], [0,1,2,3,4,5,6,7,8,9,10,11]) 
plt.yticks([0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5], [0,1,2,3,4,5,6,7,8,9,10,11]) 

cmap = mcolors.ListedColormap(['w','grey','green','red']) 
quadmesh = ax.pcolormesh(X, Y, maze, edgecolor='k',cmap=cmap) 

ani = animation.FuncAnimation(
    fig, animate, step, 
    interval=10, fargs=[quadmesh], repeat=False, blit=True) 
plt.show() 
:おそらく が既に表示されており、その場合には、再び printMazeを呼び出すことはありません mazeのを覚えているセットを使用