gpt4 book ai didi

python:表示包裹自身的方形网格(圆柱体)

转载 作者:行者123 更新时间:2023-11-28 16:52:58 26 4
gpt4 key购买 nike

我正在对发生在自身包裹的方形网格上的事物进行建模(即,如果您向上走过最高点,您最终会到达最低点,就像一个圆柱体;如果您向右走,您只是击中边界)。我需要跟踪各种代理的位置,不同点的资源量,并根据一定的规则计算代理移动的方向。

对此建模的最佳方法是什么?

我是否应该创建一个表示点的类,该类具有返回每个方向上相邻点的方法?如果是这样,我可能需要使其可哈希,以便我可以将它用作包含完整网格的字典的键(我假设这样的网格应该是字典?)

或者我应该创建一个描述整个网格的类,而不是将各个点公开为独立对象?

或者我应该只使用常规 (x, y) 元组并在其他地方使用允许查找邻居的方法?

我需要建模的很多内容尚未明确定义。此外,我预计表面的几何形状可能有一天会发生变化(例如,它可以在两个方向上 self 包裹)。

编辑:一个额外的问题:我应该将有关资源数量的信息附加到每个 Point 实例吗?还是我应该有一个单独的类,其中包含由 Point 索引的资源映射?

最佳答案

如果您想要一个可散列的 Point 类而不需要太多工作,请将元组子类化并添加您自己的邻居方法。

class Point(tuple):
def r_neighbor(self):
return Point((self[0] + 1, self[1]))
def l_neighbor(self):
[...]

x = Point((10, 11))
print x
print x.r_neighbor()

元组构造函数需要一个可迭代对象,因此 Point((10, 11)) 中的双括号;如果你想避免这种情况,你总是可以覆盖 __new__ (覆盖 __init__ 是没有意义的,因为元组是不可变的):

def __new__(self, x, y):
return super(Point, self).__new__(self, (x, y))

这也可能是应用模块化算法的地方——尽管这实际上取决于您在做什么:

def __new__(self, x, y, gridsize=100):
return super(Point, self).__new__(self, (x % gridsize, y % gridsize))

或启用任意维度网格,并返回到在 __new__ 中使用元组:

def __new__(self, tup, gridsize=100):
return super(Point, self).__new__(self, (x % gridsize for x in tup))

关于您关于资源的问题:由于 Point 是一个不可变的类,因此它不是存储有关可能更改的资源信息的好地方。 defaultdict 会很方便;你不必初始化它。

from collections import defaultdict

grid = defaultdict(list)
p = Point((10, 13))
grid[(10, 13)] = [2, 3, 4]
print grid[p] # prints [2, 3, 4]
print grid[p.r_neighbor] # no KeyError; prints []

如果你想要更大的灵 active ,你可以使用字典而不是 defaultdict 中的列表;但是 defaultdict(defaultdict) 不会工作;您必须创建一个新的 defaultdict 工厂函数。

def intdict():
return defaultdict(int)

grid = defaultdict(intdict)

或更简洁

grid = defaultdict(lambda: defaultdict(int))

然后

p = Point((10, 13))
grid[(10, 13)]["coins"] = 50
print grid[p]["coins"] # prints 50
print grid[p.r_neighbor]["coins"] # prints 0; again, no KeyError

关于python:表示包裹自身的方形网格(圆柱体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4773934/

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