Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2015
    Messaggi
    4

    [Python] Problema archi

    Salve a tutti, sono nuova nel forum e poco esperta con Python, ho un problema con gli archi di un esercizio, per i primi due test il codice funziona, per gli altri tre mi dà un errore di qualche arco, questo è il grade che esce:
    test_program01_0 ok -> 2 points
    test_program01_1 ok -> 2 points
    test_program01_2 error -> AssertionError
    Grafo file01_02_in.json sim=0.5: numero archi errato, 697 invece di 698
    test_program01_3 error -> AssertionError
    Grafo file01_02_in.json sim=0.2: numero archi errato, 4477 invece di 4478
    test_program01_4 error -> AssertionError
    Grafo file01_03_in.json sim=0.4: numero archi errato, 1750 invece di 1760
    sapete quale potrebbe essere l'errore che faccio?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Mancano degli archi evidentemente.
    2) 1 arco
    3) 1 arco
    4) 10 archi

    Ma non descrivi il problema in nessun modo. Non sappiamo nemmeno di che cosa tu stia parlando, cosa modella il grafo, se è orientato o meno, a che constraint dovrebbe essere sottoposto, come è memorizzato, ...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2015
    Messaggi
    4
    codice:
    '''Un file film/registi e' un file in formato json che ha come chiavi titoli di 
    film e ad ognuno e' associato un dizionario con due chiavi:
    "DIRECTORS": la lista dei registi del film
    "GENRES": la lista dei generi del film
    Si veda ad esempio il file "file01_01_in.json". Rispetto a un certo file 
    film/registi, il dizionario dei generi di un regista e' il dizionario con 
    chiavi i generi dei film diretti dal regista (nel file) e ad ognuno di questi
    e' associato il numero di film di quel genere. Diciamo che due registi hanno 
    grado di similarita' sim se l'indice di Jaccard dei loro dizionari di genere
    e' >= sim. La funzione jaccard(d1, d2), sotto riportata, calcola l'indice di 
    Jaccard di due dizionari.
    Scrivere una funzione dir_graph(fname, sim) che preso in input il nome di un
    file film/registi, crea un grafo di tipo Graph (lo stesso tipo visto a lezione
    e riportato sotto) i cui nodi sono i registi nel file e due registi sono 
    connessi se hanno grado di similarita' sim. L'info di ogni nodo del grafo deve
    essere il dizionario dei generi del regista del nodo. Ecco un esempio:
    
    
    g = dir_graph('file01_01_in.json', 0.55)
    numero nodi di g: 135
    numero archi di g: 229
    g.nodeInfo('Derek Cianfrance') --> {u'Drama': 1, u'Romance': 1}
    set(g.adjacents('Derek Cianfrance')) == 
                      set([u'Yji Yamada', u'Richard Linklater', u'James Gray', 
                           u'Stephen Daldry']) 
    
    
    g.nodeInfo('Sidney Lumet') --> {u'Drama': 2, u'War': 1, u'Adventure': 1, 
                                    u'Thriller': 2, u'Crime': 1}
    set(g.adjacents('Sidney Lumet')) == 
                      set([u'Rick Rosenthal', u'Jee-woon Kim', u'Billy Ray', 
                           u'John Woo', u'Richard Kwietniowski', u'Jos Padilha', 
                           u'Stephen Frears'])
    g.nodeInfo('Jz Itami') --> {u'Comedy': 1}
    set(g.adjacents('Jz Itami')) == set([])
    
    
    AVVERTENZE: non usare caratteri non ASCII, come le lettere accentate; non
    importare moduli che non sono nella libreria standard o che non sono forniti
    nella cartella dell'homework; non modificare i moduli importati. Se questo file
    e' piu' grande di 100KB o il grader non termina entro 5 minuti, il punteggio
    dell'esercizio e' zero.
    '''
    
    
    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)
            else:
                adiacenti = self._nodes[name][0]
                info_attuali = info
                info_precedenti = self._nodes[name][1]
                lista = list()
                for gen_1 in info_attuali.keys():
                    lista.append(gen_1)
                for gen_2 in info_precedenti.keys():
                    lista.append(gen_2)
                d = dict()
                for gen in lista:
                    if gen not in d:
                        d[gen] = 1
                    else:
                        d[gen] += 1
                self._nodes[name] = (adiacenti, d)
    
    
        def addEdge(self, name1, name2):
            '''Aggiunge un arco che collega i nodi name1 e name2'''
            if not (name1 in self._nodes and name2 in self._nodes):
                return
            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
    
    
    def jaccard(d1, d2):
        '''Ritorna l'indice di Jaccard dei dizionari d1 e d2. Assume che i valori
        associati alle chiavi siano numeri non negativi.'''
        s1 = float(sum(d1.values()))
        s2 = float(sum(d2.values()))
        if s1 <= 0 or s2 <= 0:
            return 0.0 
        num, den = 0, 0
        for k in (set(d1.keys()) | set(d2.keys())):
            v1, v2 = d1.get(k, 0)/s1, d2.get(k, 0)/s2
            num += min(v1, v2)
            den += max(v1, v2)
        return num/den
    
    
    import json
    
    
    def dir_graph(fname, sim):
        '''Implementare qui la funzione'''
        g = Graph()
        with open(fname, 'U') as f:
            films = json.load(f)
        rrrr = set()
        for titolo_film in films:
            G = films[titolo_film]['GENRES']
            D = films[titolo_film]['DIRECTORS']
            dic = dict()
            rrrr.update(set(D))
            for genere in G:
                dic[genere] = 1
            for regista in D:
                g.addNode(regista, dic)
        for reg_1 in rrrr:
            for reg_2 in rrrr:
                if reg_1 != reg_2:
                    if jaccard(g.nodeInfo(reg_1), g.nodeInfo(reg_2)) >= sim:
                        g.addEdge(reg_1, reg_2)
        return g
    Ultima modifica di LeleFT; 15-12-2015 a 13:31 Motivo: Corretti i tag CODE

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    @Mlu: i tag HTML servono a postare codice HTML. Per il codice dei programmi si usa il tag CODE.
    Ho corretto io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2015
    Messaggi
    4
    Grazie, scusate

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2015
    Messaggi
    4
    questo è uno dei test che vengono errati:
    codice:
    def test_program01_2():
        test('file01_02_in.json', 0.5, 160, 698, '301c1ba68f1fa5cd84197e6eb2e468b1',
        {u'Jon Favreau': ({u'Action': 1, u'Adventure': 1, u'Sci-Fi': 1}, set([u'Barry Sonnenfeld', u'Michael Curtiz', u'J.J. Abrams', u'Michael Bay', u'Howard Hawks', u'Irvin Kershner', 
                           u'Joss Whedon', u'Kenneth Branagh', u'William Keighley'])), 
         u'Martin Scorsese': ({u'Drama': 2, u'Music': 1, u'Documentary': 1, u'Thriller': 1, u'Crime': 2}, set([u'Jos Padilha', u'Andrew Niccol', u'Sam Raimi'])), 
         u'John Madden': ({u'Drama': 1, u'Romance': 1, u'Comedy': 1}, set([u'Cameron Crowe', u'Terry Gilliam', u'Yilmaz Erdogan', u'Valerie Faris', u'Woody Allen', u'Percy Adlon', 
                           u'Will Gluck', u'George Cukor', u'Marc Forster', u'Ang Lee', u'Rob Reiner', u'Sofia Coppola', u'Aki Kaurismki', u'Marco Ferreri', u'Pedro Almodvar', u'Jonathan Dayton',
                           u'Mark Sandrich', u'Federico Fellini', u'Nicholas Stoller', u'Loveleen Tandan', u'Robert Mulligan', u'Giuseppe Tornatore', u'Samuel Turcotte', u'Wes Anderson', 
                           u'Charles Chaplin', u'Adam Shankman', u'Henry Koster', u'Anthony Minghella', u'Hal Ashby', u'Michael Winterbottom', u'Douglas McGrath', u'Bob Clark', u'Nikhil Advani', 
                           u'William Wyler', u'Kevin Smith', u'Baz Luhrmann']))})
        return 3

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.