NI在Python中的Set中遇到了一些问题。
我有一个可以运行的测试脚本:
class node:
def __init__(self, pos, parent, g , h):
self.pos = pos
self.parent = parent
self.g = g
self.h = h
self.f = g+h
openlist=set()
openlist.add(node((1,1),None,1,5))
for node in openlist: print node.pos
我的实际代码不起作用
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.cm as cm
class node:
def __init__(self, pos, parent, g , h):
self.pos = pos
self.parent = parent
self.g = g
self.h = h
self.f = g+h
class NewAMap(object):
def __init__(self, size, start, target):
self.size = size
self.start = start
self.target = target
self.openlist = set()
self.closedlist = set()
self.EmptyValue = 0
self.clear()
self.addStart(self.start)
self.addTarget(self.target)
def clear(self):
#self.OccMap = [[self.EmptyValue for i in xrange(self.sizeY)] for j in xrange(self.sizeX)]
self.OccMap = np.zeros(shape=(self.size[0],self.size[1]),dtype=int)
def display(self):
print np.swapaxes(self.OccMap,0,1)
#print self.open
print self.closed
self.PicMap = np.zeros(shape=(self.size[0],self.size[1]),dtype=(float,3))
for x in xrange(0,self.size[0]):
for y in xrange(0,self.size[1]):
if self.OccMap[x][y] == 0:
self.PicMap[y][x]=(1,1,1)
elif self.OccMap[x][y] == -1:
self.PicMap[y][x]=(0,0,0)
elif self.OccMap[x][y] == -2:
self.PicMap[y][x]=(1,0,0)
elif self.OccMap[x][y] == -3:
self.PicMap[y][x]=(0,0,1)
#print self.PicMap
plt.imshow(self.PicMap, interpolation='nearest')
plt.show()
def addBlocked(self, blockposs):
self.OccMap[blockposs[0]][blockposs[1]]=-1
def addStart(self, start):
self.OccMap[start[0]][start[1]]=-2
def addTarget(self, target):
self.OccMap[target[0]][target[1]]=-3
def calcRoute(self):
self.openlist.add(node(self.start, None, 0, 0))
for node in elfopenlist: print node.pos, node.parent, node.g, node.h, node.f
def main():
AMap = NewAMap((20,20),(1,12),(12,12))
for y in range(8,17): AMap.addBlocked((8,y))
AMap.calcRoute()
AMap.display()
if __name__ == '__main__':
main()
失败并显示错误:UnboundLocalError:赋值前引用的局部变量'node' AMap.calcRoute()中发生错误:
self.openlist.add(node(self.start, self.none, 0, 0))
我认为那是因为我尝试使用NewAMap对象中的节点对象。但是我该怎么做呢?
我也想知道我:
1:检查对象是否在集合中
我想检查一个带有node.pos的对象是否在集合中。
2:搜索具有最低node.f值的集合中的对象。
我想在Set中搜索具有最低node.f值的对象。 Eventuelly将其从Set中删除或更新值。
我该怎么做?这是/正确的方法吗?
感谢
罗伯特
答案 0 :(得分:0)
对于第一个问题,您可以做的是在文件顶部创建一个名为node_object的全局变量。您可以使用动态创建的节点对象重复引用它,并将其添加到开放列表中。
至于第二个,当然你可以做到这一点。查看sets in python的文档。但是,恕我直言,最好使用一种使用类似序列行为的不同数据结构 - 可能是一个列表,除非你想要处理元素的唯一性。