免责声明:这是我目前正在进行的一个学期项目。我的问题是关于实施级别的细节,而不是评分方案的一部分。我只是编写这段代码,以此来测试我将为我将要撰写的论文提出的理论。
此外,我已经考虑了this question的答案,运气不佳,所以请不要将此视为该问题的副本
问题:
我有一张图(G =(V,E))。在我的算法中的某个时刻,我需要通过将多个节点(例如,v_1, v_2, ..., v_n
)“折叠”到一个节点(例如,v
)将其转换为超图(在某种意义上)。在问题的上下文中,这意味着我需要更改E
中的边缘,以便e
中的任何一个v_1, v_2, v_n
与任何其他节点u
之间的任何边V
{1}}将被更改为e
现在介于u
和v
之间。
为了捕获任何节点对之间现在可能存在多个不同的边,我需要为每个边创建一个唯一的标识符。我试图通过ID和ID来做到这一点,我目前无法正确实施。
这就是我尝试过的:
class Edge:
_ID = 0
def __init__(self, u, v, w, c,f=0):
self.id = Edge._ID
Edge._ID += 1
self.src = u
self.dest = v
self.weight = w
self.capacity = c
self.flow = f
但是,当我尝试实例化一个新边时,我收到以下错误:
>>> e = Edge(1,3,5,10,0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "UnsplittableFlow.py", line 14, in __init__
self.id = Edge._ID; Edge._ID += 1
UnboundLocalError: local variable '_ID' referenced before assignment
修改:
根据一些答案的建议,我已经能够修复实例化时间错误。但是,另一个错误仍然存在。这是我的代码和错误:
class Edge:
_ID = 0
def __init__(self, u, v, w, c,f=0):
self.id = self._ID; self._ID += 1
self.src = u
self.dest = v
self.weight = w
self.capacity = c
self.flow = f
错误:
>>> e = Edge(1,3,5,10,0)
>>> e.id
0
>>> Edge._ID
0
>>> f = Edge(2,3,5,10,0)
>>> f.id
0
>>> Edge._ID
0
我很感激任何帮助
谢谢
答案 0 :(得分:4)
您编辑的代码正在将_ID
视为实例变量,而不是类变量。根据Matt Joiner的回答,我认为你的意思是:
class Edge:
_ID = 0
def __init__(self, u, v, w, c,f=0):
self.id = self._ID; self.__class__._ID += 1
self.src = u
self.dest = v
self.weight = w
self.capacity = c
self.flow = f
当我使用Edge
的定义运行示例时,我得到:
>>> e = Edge(1,3,5,10,0)
>>> e.id
0
>>> Edge._ID
1
>>> f = Edge(2,3,5,10,0)
>>> f.id
1
>>> Edge._ID
2
这是期望的结果。但是,其他人已经指出你的原始代码适用于他们,就像这段代码适合我一样,所以我怀疑真正的问题是你代码中的其他地方。
答案 1 :(得分:2)
您仍然可以使用self
来_ID
。
self.id = self._ID
self.__class__._ID += 1
如果你正在使用CPython,你可以拥有一个懒人ID:
class Edge(object):
@property
def id(self): return id(self)
答案 2 :(得分:2)
在实例化任何Edge之前,您可以将类变量显式设置为0,如下所示:
Edge._ID = 0
e = Edge(1,3,5,10,0)
f = Edge(2,3,4,5,0)
并且id将被正确设置。
答案 3 :(得分:1)
虽然提供的其他答案都是回答问题(这就是为什么我并不接受我最初接受的那个),但正确的方法是使用itertools.count
如下:
class Edge:
_ID = itertools.count()
def __init__(self, u, v, w, c,f=0):
self.id = self._ID.next()