3

免责声明:这是我目前正在从事的一个学期项目。我的问题是关于实施级别的细节,而不是评分方案的一部分。我编写这段代码只是为了测试我为我将要写的论文提出的理论。

另外,我已经考虑了这个问题的答案,但运气不佳,所以请不要将其视为该问题的重复

问题

我有一个图表(G =(V,E))。在我的算法中的某个时刻,我需要通过将多个节点(例如 )“折叠”v_1, v_2, ..., v_n成一个节点(例如)来将其转换为超图(在某种意义上v)。在问题的上下文中,这意味着我需要更改边缘,以便更改任何和任何其他节点之间的E边缘,使得现在介于和之间。ev_1, v_2, v_nuVeuv

为了捕捉到任何一对节点之间现在可能存在多个不同的边,我需要为每条边创建一个唯一标识符。我试图通过 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

我会很感激任何帮助

谢谢

4

4 回答 4

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

这是期望的结果。但是,其他人指出您的原始代码适用于他们,就像这段代码适用于我一样,所以我怀疑真正的问题在您的代码中的其他地方。

于 2011-11-30T01:58:00.517 回答
3

您仍然可以self使用_ID.

self.id = self._ID 
self.__class__._ID += 1

如果你使用 CPython,你可以有一个懒人的 ID:

class Edge(object):
    @property
    def id(self): return id(self)
于 2011-11-30T01:11:14.257 回答
2

在实例化任何 Edge 之前,您可以将类变量显式设置为 0,如下所示:

Edge._ID = 0
e = Edge(1,3,5,10,0)
f = Edge(2,3,4,5,0)

并且 id 将被正确设置。

于 2011-11-30T01:21:17.197 回答
1

虽然提供的其他答案是回答所提出的问题(这就是为什么我不会不接受我最初接受的那个),但正确的方法是使用itertools.count如下:

class Edge:
    _ID = itertools.count()
def __init__(self, u, v, w, c,f=0):
    self.id = self._ID.next()
于 2012-06-30T00:43:00.480 回答