3

免責事項:これは私が現在取り組んでいる学期のプロジェクトのためのものです。私の質問は、実装レベルの詳細に関するものであり、評価スキームの一部ではありません。私が書く論文のために私が提案している理論を​​テストする方法として、このコードを書いているだけです。

また、私はこの質問の答えを少し運が悪かったので、これをその質問の複製と見なさないでください。

問題

グラフがあります(G =(V、E))。アルゴリズムのある時点で、複数のノード(たとえば、v_1, v_2, ..., v_n)を1つのノード(たとえば)に「折りたたむ」ことによって、これを(ある意味で)ハイパーグラフに変換する必要があります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、クラス変数ではなく、インスタンス変数であるかのように扱われます。マットジョイナーの答えに基づいて、私があなたが意味すると思うのはこれです:

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 に答える