[pyar] Sobre grafos, nodos y objetos

Jose Jachuf jjachuf en gmail.com
Vie Nov 5 21:39:45 ART 2010


Hola,

El código [1] que envié está simplificado, el original incluye otros
tipos de nodos y algunos cálculos. Todo lo que podía meter ruido lo
quité. Simplemente creo el grafo y luego obtengo los nodos de dos
maneras diferentes:
1) iterando sobre los nodos
2) iterando sobre los arcos

El grafo lo creo a partir de los datos contenidos en el archivo
grafo.csv [2] (_agregar_nodos_simples).


Cuando llamo a nodos_simples

def nodos_simples(self):
    for n in self._grafo.obtener_nodos_simples():
        print n.id, id(n)

obtengo:

103 916876524
104 916876716
105 918590252
106 916877132
107 918591244
108 918590028
109 916876908
110 918590668
111 916876556
112 916877068
113 916876460
114 918590796
115 916877292
116 916876780
117 918589964
118 916876492
119 918589708


la llamada a arcos

def arcos(self):
    for e in self._grafo.edges_iter():
	nodo1 = e[0]
	nodo2 = e[1]
	print 'arco %d-%d ->'%(nodo1.id, nodo2.id), nodo1.id, id(nodo1),
nodo2.id, id(nodo2)

imprime:

arco 103-116 -> 103 916876524 116 916877004
arco 103-104 -> 103 916876524 104 916876716
arco 103-108 -> 103 916876524 108 918590028
arco 103-111 -> 103 916876524 111 916876556
arco 105-108 -> 105 918590252 108 918590188
arco 106-112 -> 106 916877132 112 916877068
arco 106-115 -> 106 916877132 115 916877292
arco 106-109 -> 106 916877132 109 918590572
arco 106-114 -> 106 916877132 114 918590796
arco 107-119 -> 107 918591244 119 918591180
arco 108-110 -> 108 918590028 110 918590668
arco 108-112 -> 108 918590028 112 918590476
arco 109-116 -> 109 916876908 116 918589484
arco 109-118 -> 109 916876908 118 916877228
arco 109-117 -> 109 916876908 117 918589964
arco 110-119 -> 110 918590668 119 918591084
arco 112-116 -> 112 916877068 116 918590316
arco 112-119 -> 112 916877068 119 918590892
arco 113-116 -> 113 916876460 116 916876780
arco 113-118 -> 113 916876460 118 916876492
arco 115-119 -> 115 916877292 119 918589708


No sé que estoy haciendo mal o que está pasando.

Si por ejemplo analizamos el nodo 119 vemos que el id en el primer
listado es 918589708. En el segundo listado aparece con id 918591180 y
918591084. Algo similar pasa con el nodo 112: primer listado id
916877068, segundo listado 916877068 (que se corresponde al primero) y
918590476.

¿Por qué se están creando objetos diferente?
¿Está mal algo referente a __eq__ y __hash__ en la clase Nodo?

Desde ya muchas gracias.

Jose


para probar el código se necesita tener instalado networkx [3]

[1] http://pastebin.com/wK63nQuw
[2] http://pastebin.com/AUchfdni
[2] http://networkx.lanl.gov/



More information about the pyar mailing list