gpt4 book ai didi

Python - matplotlib.pyplot ion() 慢

转载 作者:行者123 更新时间:2023-12-01 03:55:29 26 4
gpt4 key购买 nike

我正在尝试更新我的迷宫,因为对解决方案的搜索是连续的(这是一个简单的迷宫统一成本搜索)。我正在使用 pyplots ion() 在每次节点访问后更新我的图形。我的问题是该图更新非常慢,大约迭代 20 次。我尝试减小 pause() 的值,但似乎没有效果。我很确定这不是我的电脑。

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)

最佳答案

这是一个基本示例,展示了如何为 Quadmesh(例如 pcolormesh 返回的那个)设置动画。您需要做的就是(哈!)修改 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()

减少FuncAnimation中的interval参数以减少之间的延迟帧。这将使动画播放得更快。你会发现没有使动画运行得很快的问题。

尽管更新单个quadmesh(如上所述)比调用更快pcolormesh 多次且 plt.ion 打开,这是您的主要原因动画进展缓慢是因为 printMaze(path) 被多次调用相同的路径

您可以通过将 printMaze 修改为

来确认此声明
def printMaze(maze):
print(maze)
print('-'*80)

您会在终端中看到迷宫通常是同一个迷宫次。因此,为了让你的动画更快,你需要让你的uniformCostSearch 更智能。也许使用一组来记住具有以下特征的迷宫已经显示,在这种情况下不要再次调用 printMaze:

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()

关于Python - matplotlib.pyplot ion() 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37534431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com