【发布时间】:2014-08-06 18:14:13
【问题描述】:
所以我正在写实现 ACO 算法的this Python program。简而言之,当蚂蚁进行下一步行动时,它知道(1)它在哪个节点上,以及(2)它还需要访问哪些节点。使用该信息,它会检查每个Edge 的属性,以选择接下来应该访问的Node。所以我让蚂蚁使用该信息来查找相应的Edge。
在内部,我使用dict 将Node 对映射到Edge 实例。最初,我同意 Node 必须是可散列的限制。但是,这一直是我不太喜欢施加的限制,如果可能的话,我想消除它。
目前,我有一个Node 类,它通过散列对象的__dict__.items() 的frozenset 来实现__hash__,但这仍然会在涉及可变值的情况下产生错误(到目前为止,这是我最少的最喜欢的课程 - 永远)。
到目前为止,我一直在考虑使用 2D 矩阵,但通常情况下,Edges 与 Nodes 相比很少,这将导致矩阵稀疏,因此浪费了很多空间。我曾考虑过使用一个简单的列表,但后来我失去了进行超快速查找的能力。
TL;DR:
我可以使用哪些数据结构(如果实现是可靠的则首选)或自我实现,它们可以在不涉及生成哈希的情况下从一对 Nodes 中快速查找 Edges?
【问题讨论】:
-
您需要从 pair 节点中查找边,还是只需要从给定节点开始遍历所有边?你要求前者,但你上面的用例描述似乎只做
for neighbor in current.neighbors: ... -
不,这是我试图避免的情况。我不想遍历所有的边缘,这就是我选择通过字典查找的原因。
-
所以有一个节点数组,并给蚂蚁节点索引。然后你的密钥变成两个整数。或单个 64 位整数,高 32 位有一个索引,低 32 位有一个索引。它仍然是基于哈希的,但实现起来非常简单。
-
@JimMischel 辉煌。正是我所追求的。我什至有点惭愧我没有看到那个简单的解决方案,但我知道这是太专注和太少的睡眠,哈哈!
标签: python optimization dictionary data-structures hash