PDA

View Full Version : [Python] costruire archi di un grafo


Ethoel88
27-12-2013, 15:30
Salve a tutti, devo fare un semplice programmino in python per l'università e, dato un file json con un elenco di film e per ogni film il produttore e gli attori, devo costruirci sopra un grafo e collegare tutti gli attori con i produttori in comune tra di loro (non necessariamente che hanno fatto anche lo stesso film).

Il problema ora è nella costruzione degli archi, nei test che mi sono stati forniti dal professore ho i "risultati" del programma, quindi ho anche il numero di archi del grafo che dovrei avere per ogni determinato file in input. Ovviamente il mio risultato è sempre inferiore dai 30 ai 1000 archi rispetto al risultato che dovrebbe uscire.

Vi incollo il codice scritto da me:

class Graph(object):
def __init__(self):
self._nodes = {}

def addNode(self, name, info=None):
'''Aggiunge un nodo name, se non esiste'''
if name not in self._nodes:
self._nodes[name] = (set(), info)

def addEdge(self, name1, name2):
'''Aggiunge un arco che collega i nodi name1 e name2'''
if name1 in self._nodes and name2 in self._nodes:
self._nodes[name1][0].add(name2)
self._nodes[name2][0].add(name1)

def adjacents(self, name):
'''Ritorna una lista dei nomi dei nodi adiacenti al nodo name,
se il nodo non esiste, ritorna None'''
if name in self._nodes:
return list(self._nodes[name][0])
return None

def nodes(self):
'''Ritorna una lista dei nomi dei nodi del grafo'''
return self._nodes.keys()

def nodeInfo(self, name):
'''Ritorna l'info del nodo name'''
return self._nodes[name][1] if name in self._nodes else None

import json

def actorDirGraph(filmfile):
'''Implementare qui la funzione'''
with open(filmfile,'U') as f:
films = json.load(f)

gd = Graph()

#costruisco il grafo
for film in films:
info = films[film]
for i in info['DIRECTORS']:
for j in info['ACTORS']:
gd.addNode(j,i)

#costruisco gli archi, gli adiacenti di ogni nodo sono gli attori con i produttori in comune all'attore del nodo corrente
for film in films:
info = films[film]
for i in gd.nodes():
for j in info['DIRECTORS']:
if gd.nodeInfo(i)==j:
for k in info['ACTORS']:
if not i==k:
gd.addEdge(i,k)


return gd

C'è sicuramente qualcosa che mi sfugge nella costruzione degli archi tra i nodi, ma non riesco a capire cosa.
Premesso che la classe del grafo non può essere modificata e la costruzione del grafo è corretta (controllato sul test da parte del professore), rimane solo la costruzione degli archi errata.
Da solo non riesco ad uscirne fuori (e sono 4-5 giorni che mi ci sto scervellando insieme al panettone di natale).
Richiedo consigli dal pubblico cortesemente ç_ç