Pregunta

Descargo de responsabilidad: Esto es para un proyecto semestre en el que estoy trabajando actualmente. Mi pregunta es sobre un detalle de nivel de implementación y no es parte del esquema de calificación. Solo estoy escribiendo este código como una forma de probar la teoría que propongo para el documento que escribiré.

Además, he considerado las respuestas para esta pregunta con poca suerte, así que por favor no considere esto como un duplicado de esa pregunta

El problema:

Tengo un gráfico (g = (v, e)). En algún momento de mi algoritmo, necesito convertir esto en un hipergrafo (en cierto sentido) "colapsando" múltiples nodos (digamos, v_1, v_2, ..., v_n) en un nodo (digamos, v). En el contexto del problema, esto implica que necesito cambiar los bordes en E tal que cualquier ventaja e entre cualquiera de v_1, v_2, v_n y cualquier otro nodo u en V se cambiará de tal manera que e es ahora entre u y v.

Para capturar que ahora puede existir múltiples bordes distintos entre cualquier par de nodos, necesito hacer un identificador único para cada borde. He tratado de hacer esto por medio e ID, que actualmente no puedo implementar correctamente.

Esto es lo que he probado:

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

Sin embargo, cuando intento instanciar una nueva ventaja, recibo el siguiente error:

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

EDITAR:

Con las sugerencias de algunas respuestas, he podido corregir el error de tiempo de instancia. Sin embargo, persiste otro error. Aquí está mi código y los errores:

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

Error:

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

Agradecería cualquier ayuda

Gracias

¿Fue útil?

Solución

Todavía puedes usar self para llegar al _ID.

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

Si estás usando CPython, puedes tener una identificación de hombre perezoso:

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

Otros consejos

Su código editado está tratando _ID Como si fuera una variable de instancia, no una variable de clase. Basado en la respuesta de Matt Joiner, lo que creo que quieres decir es esto:

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

Cuando ejecuto tus ejemplos con esta definición de Edge, Yo obtengo:

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

Cual es el resultado deseado. Sin embargo, otros han señalado que su código original funcionó para ellos, al igual que este código funciona para mí, por lo que sospecho que el verdadero problema está en otro lugar de su código.

Antes de instanciar cualquier borde, puede establecer la variable de clase explícitamente en 0 como así:

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

Y las identificaciones se establecerán correctamente.

Si bien las otras respuestas ofrecidas son responder la pregunta hecha (por eso no estoy inaceptando la que originalmente acepté), la forma correcta de hacer esto sería usar itertools.count como sigue:

class Edge:
    _ID = itertools.count()
def __init__(self, u, v, w, c,f=0):
    self.id = self._ID.next()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top