Question

Disclaimer : Ceci est un projet de semestre que je travaille actuellement. Ma question concerne un détail au niveau de la mise en œuvre et ne fait pas partie du système de classement. Je n'écris ce code comme un moyen de tester la théorie que je propose pour le papier que je vais écrire.

En outre, j'ai examiné les réponses cette question avec peu de chance, alors s'il vous plaît ne pas considérer cela comme un double de cette question

Le problème :

I ai un graphe (G = (V, E)). À un certain moment dans mon algorithme, je dois en faire un hypergraphe (dans un sens) par « l'effondrement » de multiples noeuds (disons, v_1, v_2, ..., v_n) dans un noeud (disons, v). Dans le contexte du problème, cela implique que je dois changer les bords de E tels que sera changé toute e de bord entre l'une des v_1, v_2, v_n et tout autre noeud u dans V tel que e est maintenant entre u et v.

Afin de saisir qu'il peut exister maintenant plusieurs arêtes distinctes entre une paire de noeuds, je dois faire un identifiant unique pour chaque bord. Je l'ai essayé de le faire au moyen et ID, que je suis actuellement incapable de mettre en œuvre correctement.

Voici ce que j'ai essayé :

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

Cependant, lorsque je tente de instancier un nouveau bord, je reçois l'erreur suivante:

>>> 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

EDIT :

Avec les suggestions de quelques réponses, j'ai pu corriger l'erreur instanciation temps. Cependant, une autre erreur persiste. Voici mon code et les erreurs:

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

Erreur:

>>> 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

Je serais reconnaissant toute aide

Merci

Était-ce utile?

La solution

Vous pouvez toujours utiliser self pour obtenir au _ID.

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

Si vous utilisez CPython, vous pouvez l'ID d'un homme paresseux:

class Edge(object):
    @property
    def id(self): return id(self)

Autres conseils

Votre code est édité traite _ID comme si elle était une variable d'instance, pas une variable de classe. Sur la base de la réponse de Matt Joiner ce que je pense vous dire est ceci:

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

Quand je lance vos exemples avec cette définition de Edge, je reçois:

>>> 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

Quel est le résultat souhaité. Cependant, d'autres ont souligné que votre code d'origine a travaillé pour eux, tout comme ce code fonctionne pour moi, donc je pense que le vrai problème est ailleurs dans votre code.

Avant instanciation tout bord, vous pouvez définir la variable de classe explicitement à 0 comme ceci:

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

Et les années id sera correctement réglé.

Alors que les autres réponses proposées sont répondre à la question posée (ce qui est la raison pour laquelle je ne suis pas celui unaccepting je l'ai accepté), la bonne façon de le faire serait d'utiliser itertools.count comme suit:

class Edge:
    _ID = itertools.count()
def __init__(self, u, v, w, c,f=0):
    self.id = self._ID.next()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top