- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
底部有一个 TLDR。我有一个如下的 python 类,用于为 D* 寻路创建节点(不包括寻路过程):
import numpy as np
from tqdm import tqdm
import sys
class Node():
"""A node class for D* Pathfinding"""
def __init__(self,parent, position):
self.parent = parent
self.position = position
self.tag = "New"
self.state = "Empty"
self.h = 0
self.k = 0
self.neighbours = []
def __eq__(self, other):
if type(other) != Node : return False
else: return self.position == other.position
def __lt__(self, other):
return self.k < other.k
def makenodes(grid):
"""Given all the enpoints, make nodes for them"""
endpoints = getendpoints(grid)
nodes = [Node(None,pos) for pos in endpoints]
t = tqdm(nodes, desc='Making Nodes') #Just creates a progress bar
for node in t:
t.refresh()
node.neighbours = getneighbours(node,grid,nodes)
return nodes
def getneighbours(current_node,grid,spots):
'''Given the current node, link it to it's neighbours'''
neighbours = []
for new_position in [(0, -1), (0, 1), (-1, 0), (1, 0)]: # Adjacent nodes
# Get node position
node_position = (int(current_node.position[0] + new_position[0]), int(current_node.position[1] + new_position[1]))
# Make sure within range
if node_position[0] > (len(maze) - 1) or node_position[0] < 0 or node_position[1] > (len(maze[len(maze)-1]) -1) or node_position[1] < 0:
continue
# Create new node
new_node = spots[spots.index(Node(None, node_position))]
neighbours.append(new_node)
return neighbours
def getendpoints(grid):
"""returns all locations on the grid"""
x,y = np.where(grid == 0)
endpoints = [(x,y) for (x,y) in zip(x,y)]
return endpoints
"""Actually Making The Nodes Goes as Follows"""
grid = np.zeros((100,100))
spots = makenodes(grid)
sys.setrecursionlimit(40000)
grid = np.zeros((100,100))
spots = makenodes(grid)
with open('100x100 Nodes Init 4 Connected', 'wb') as f:
pickle.dump(spots, f)
print('Done 100x100')
该程序运行良好,但此节点制作过程在 100x100 上需要 3 分钟,但在 1000x1000 上需要一个多星期。为了解决这个问题,我使用 pickle.dump()
保存所有节点,然后当我运行我的程序时,我可以使用 spots = pickle.load(...)
.在 grid=np.zeros((40,50))
我必须将递归限制设置为 16000 左右,在 100x100 上,我将递归限制增加到 40000 但内核死机了。
为了帮助您直观地了解节点是什么以及它们与邻居的连接方式,请参阅我绘制的图像,其中黑色:节点和白色:连接。
如果我改变,getneighbours()
返回 (x,y) 坐标的元组(而不是节点对象)然后我可以 pickle 节点,因为它们不再递归。这种方法会减慢程序的其余部分,因为每次我想引用一个节点时,我都必须重建它并在列表 spots
中搜索它。 . (我已经简化了这部分的解释,因为问题已经很长了)。
如何保存这些节点对象,同时将它们的邻居保持为更大网格的节点?
TLDR: 我有一个递归的节点类,因为每个节点都包含对其邻居的引用,使其高度递归。我可以使用 pickle 为 grid = np.zeros((40,50))
保存节点并设置相当高的递归限制 16000。对于较大的网格,我在调用 pickle.dump
时达到了最大系统递归的程度。
最佳答案
再次包含 TLDR(只是为了让您检查这是否适合您)。我找到了一种解决方法,它保留了 pickling 的省时优势,但允许节点即使在更大的尺寸下也能被 pickle。包括用于证明这一点的测试:
我更改了 makenodes()
中每个 Node() 的结构,通过剥离它的邻居来进行 pickle ,从而减少递归。使用问题中提到的方法,grid = np.zeros((40,50))
将需要 sys.setrecursionlimt(16000)
左右。使用这种方法,Python 的内置递归限制 1000 永远不会达到,并且可以在加载 pickle 文件时重建预期的结构。
基本上 pickle 时,遵循以下程序。
In [1]: nodes
Out [1]: [[0, <__main__.Node at 0x7fbfbebf60f0>],...]
In [2]: neighbours
Out [2]: [[0, [<__main__.Node at 0x7fbfbebf6f60>, <__main__.Node at 0x7fbfbec068d0>]],...]
以上是任何大小的迷宫的节点和邻居的外观示例。 '...'
表示列表会继续包含它所包含的尽可能多的元素,另外需要注意的是 len(nodes)
应该等于 len(neighbours
。索引不是必需的,但我已将其作为附加检查包括在内。
变化如下:
def makenodes(grid):
"""Given all the enpoints, make nodes for them"""
endpoints = getendpoints(grid)
spots = [Node(None,pos) for pos in endpoints]
neighbours = []
nodes = []
t = tqdm(spots, desc='Making Nodes')
i = 0
for node in t:
t.refresh()
neighbour = getneighbours(node,grid,spots)
nodes.append([i,node])
neighbours.append([i,neighbour])
i+=1
return nodes, neighbours
"""Actually Making the Nodes"""
grid = np.zeros((100,100))
nodes, neighbours = makenodes(grid)
arr = np.array([nodes,neighbours])
with open('100x100 Nodes Init 4 Connected.pickle', 'wb') as f:
pickle.dump(arr,f)
print('Done 100x100')
def reconstruct(filename):
'''Reconstruct the relationships by re-assigning neighbours'''
with open(filename, 'rb') as file:
f = pickle.load(file)
nodes = f[0]
neighbours = f[1]
reconstructed = []
for node in nodes:
i = node[0]
for neighbour in neighbours[i][1]:
node[1].neighbours.append(neighbour)
reconstructed.append(node[1])
return reconstructed
nodes_in = reconstruct('100x100 Nodes Init 4 Connected.pickle')
这实现了预期的输出,并且可以在重新加载(重建)时重新建立邻居/ child 关系。此外,每个节点的邻居列表中的对象直接指向它们对应的节点,这样如果您只在选取的数组上运行它而不重建它:
In [3]: nodes2[1][1] is neighbours2[0][1][0]
Out[3]: True
时差创建和保存 50x50 网格的平均时间是。这样做 60 次的平均时间:
平均加载时间:
两种文件大小:410KB
结论
适应的方式可以处理更大的尺寸并且从时代来看,具有相同的性能。这两种方法都会创建相同大小的文件,因为 pickle 只存储每个对象一次,请阅读相关文档。请注意,选择使用 50x50 网格是为了防止原始方法达到递归限制。我能够用适应的方式 pickle 的最大尺寸是 500x500。我没有做得更大,仅仅是因为节点制作过程在我的机器上花费了将近 2 天的时间。然而,加载 500x500 只需要不到 1 秒的时间,因此优势更加明显。
**TLDR:**我设法将节点及其相应的邻居保存为 np.array([nodes.neighbours]) 的数组,以便在 pickling 时,在取消 pickling 时重新建立关系所需的数据可用。本质上,必要的数据以不需要提高递归限制的方式计算和保存。然后,您可以在加载时快速重建数据。
关于python - 如何在不达到递归限制的情况下 pickle 具有子对象或邻居关系的 class() 对象并在加载时保留对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66663734/
下面的说法正确吗? “人最好的 friend 是狗。” public class Mann { private BestFriend dog; //etc } 最佳答案 我想说这样
我一直在 documentation 中查看 Laravel 4 中的关系我正在尝试解决以下问题。 我的数据库中有一个名为“事件”的表。该表具有各种字段,主要包含与其他表相关的 ID。例如,我有一个“
我的表具有如下关系: 我有相互链接的级联下拉框,即当您选择国家/地区时,该国家/地区下的区域将加载到区域下拉列表中。但现在我想将下拉菜单更改为基于 Ajax 的自动完成文本框。 我的问题是,我应该有多
我正在尝试弄清楚如何构建这个数据库。我之前用过Apple的核心数据就好了,现在我只是在做一个需要MySQL的不同项目。我是 MySQL 的新手,所以请放轻松。 :) 对于这个例子,假设我有三个表,Us
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。 文档间可以通过嵌入和引用来建立联系。 MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多)
您能解释一下 SQL 中“范围”和“分配单元”之间的区别或关系吗? 最佳答案 分配单元基本上只是一组页面。它可以很小(一页)或很大(很多页)。它在 sys.allocation_units 中有一个元
我有一个表 geoLocations,其中包含两列纬度和经度。还有第二个表(让我们将其命名为城市),其中包含每对唯一的纬度和经度对应的城市。 如何使用 PowerPivot 为这种关系建模?创建两个单
我想用 SQLDelight 建模关系,尤其是 一对多关系。 我有 2 张 table :recipe和 ingredient .为简单起见,它们看起来像这样: CREATE TABLE recipe
我是 Neo4J 新手,我有一个带有源和目标 IP 的简单 CSV。我想在具有相同标签的节点之间创建关系。 类似于... source_ip >> ALERTS >> dest_ip,或者相反。 "d
我正在创建一个类图,但我想知道下面显示的两个类之间是否会有任何关联 - 据我了解,对于关联,ClassA 必须有一个 ClassB 的实例,在这种情况下没有但是,它确实需要知道 ClassB 的一个变
是否可以显示其他属性,即“hasTopping”等? 如何在 OWLViz 中做到这一点? 最佳答案 OWLViz 仅 显示类层次结构(断言和推断的类层次结构)。仅使用“is-a”关系进行描述。 OW
public class MainClass { ArrayList mans = new ArrayList(); // I'm filling in this arraylist,
我想知道“多对二”的关系。 child 可以与两个 parent 中的任何一个联系,但不能同时与两个 parent 联系。有什么办法可以加强这一点吗?我也想防止 child 重复条目。 一个真实的例子
我有一个已经创建的Grails插件,旨在支持许多应用程序。该插件具有一个Employee域对象。问题在于,当在主应用程序中使用该应用程序中的域对象时,需要将其引用回Employee对象。因此,我的主应
我有一个类(class)表、类(class)hasMany部分和部分hasMany讲座以及讲座hasMany评论。如果我有评论 ID 并且想知道其类(class)名称,我应该如何在 LectureCo
我有一个模型团队,包含 ID 和名称。所有可能的团队都会被存储。 我的模型游戏有两列 team_1 和 team_2..我需要哪种关系? 我已经测试了很多,但它只适用于一列.. 最佳答案 也许你可以试
我读了很多关于 ICE 或 Corba 等技术中使用的仆人和对象的文章。有很多资源我可以读到这样的东西: 一个仆人可以处理多个对象(为了节省资源)。 一个对象可以由多个仆人处理(为了可靠性)。 有人可
嗨, 我有一个令人沮丧的问题,我在这方面有点生疏。我有两个这样的类(class): class A{ int i; String j ; //Getters and setters} class B
class Employee { private String name; void setName(String n) { name = n; } String getNam
如果您有这样的关系: 员工与其主管员工之间存在多对一关系 员工与其部门的多对一关系 部门与其经理一对一 我会在 Employee 实体中写入: @ManyToOne (cascade=CascadeT
我是一名优秀的程序员,十分优秀!