试图弄清楚这种并行分配是如何工作的。完整代码可在here中找到。 (原始Github python文件)。这是我遇到的问题:
def assign_move(square):
# Parallel Assignment
target, direction = max(
((neighbor, direction) for direction, neighbor in enumerate(game_map.neighbors(square))
if neighbor.owner != myID),
default = (None, None),
key = lambda t: t[0].production)
我将尽我所能将其分解,但我可能做错了。
target, direction = max(iterable, default, key)
我们是否将目标和方向分配给同一件事?我认为并行分配类似于
x, y = 5, 6
现在,如果我们查看
iterable
,则如下所示:iterable = ((neighbor, direction) for direction, neighbor in enumerate(game_map.neighbors(square)) if neighbor.owner != myID)
在for循环之前如何拥有
(neighbor , direction)
?此处的if
语句有什么作用?在neighbor.owner != myID
的if块下面是否不需要任何内容?如果迭代器为空,我们将返回
None, None
,如下所示?default = (None, None),
这就是我们用来确定最大值的函数吗?
key = lambda t: t[0].production)
需要的背景:
这是要在游戏Halite中玩的机器人的代码。这是在此GitHub repo中找到的预建机器人。
最佳答案
这里的max
函数返回相对于tuple
的(direction , neighbors)
的最大neighbor.production
(据我们从key
理解),并且如果neighbor.owner != myID
发生以及是否存在迭代器,则允许邻居参与此迭代。为空default = (None, None)
将是target
和directions
值,因此target
是结尾处最多neighbor
的production
。