[risolto][python] Attributo di un grafo

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[risolto][python] Attributo di un grafo

Messaggioda minat09 » sabato 20 ottobre 2018, 12:12

Sto usando networkx e sto cercando di creare un grafo che abbia associato ad ogni arco un set di colori.
Ho creato il grafo ed aggiunto nodi e archi.

Codice: Seleziona tutto
G = nx.Graph()
G.add_nodes_from ([1,2,3,4,5])

G.add_edge(1,2)
G.add_edge(1,4)
G.add_edge(1,5)
G.add_edge(2,3)
G.add_edge(4,2)
G.add_edge(3,1)
G.add_edge(5,4)
G.add_edge(3,5)

# list of nodes
U = list(G.nodes)

# variable with number of edges
K = G.number_of_edges()
Z = []

# creating a set of available colors. We assume that K = {0, 1, . . . , K − 1}and K ≤ |E|
def nrofCol():
Z.clear()
z = 0
while z < K - 1:
    Z.append(z)
    z = z+1
return Z


il set di colori è quindi z=[0,1,2,3,4,5,6] e questo è il risultato che vorrei ottenere:

Codice: Seleziona tutto
G[u][v][z] = 1,2,0
G[u][v][z] = 1,2,1
G[u][v][z] = 1,2,2
G[u][v][z] = 1,2,3
G[u][v][z] = 1,2,4
G[u][v][z] = 1,2,5
G[u][v][z] = 1,2,6
G[u][v][z] = 1,4,0
G[u][v][z] = 1,4,1
......
cioè ad ogni arco vanno associati tutti i colori possibili, dove u e v sono i nodi e z è il colore. Questo è ciò che ho implementato:
[code]for u,v in G.edges():
for z in Z:
    G[u][v]['color'] = z


ma non va bene poichè viene assegnato un unico colore, cioè l'ultimo. Come posso fare?
Ultima modifica di minat09 il martedì 23 ottobre 2018, 16:35, modificato 1 volta in totale.
minat09
Prode Principiante
 
Messaggi: 81
Iscrizione: maggio 2013

Re: [python] Attributo di un grafo

Messaggioda rai » sabato 20 ottobre 2018, 20:41

Ciao
da quello che capisco, per non stare ad installarmi networkx, devi combinare due liste, una delle quali ha come elementi delle tuple.

Lo strumento giusto (quello più efficiente) per fare questo genere di cose è il modulo itertools (che ti suggerisco caldamente di studiare) e in particolare la funzione product()
Ma nel tuo caso, con un numero ridotto di permutazioni, puoi fare artigianalmente un generatore con due for annidati:

Codice: Seleziona tutto
>>> G_edges = [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (3, 5), (4, 5)]
>>> Z = [0, 1, 2, 3, 4, 5, 6]
>>> for colored_arc in ((u,v,z) for u,v in G_edges for z in Z):
   print(colored_arc)

(1, 2, 0)
(1, 2, 1)
(1, 2, 2)
(1, 2, 3)
(1, 2, 4)
(1, 2, 5)
(1, 2, 6)
(1, 3, 0)
(1, 3, 1)
(1, 3, 2)
(1, 3, 3)
(1, 3, 4)
(1, 3, 5)
(1, 3, 6)
(1, 4, 0)
(1, 4, 1)
(1, 4, 2)
(1, 4, 3)
(1, 4, 4)
(1, 4, 5)
(1, 4, 6)
(1, 5, 0)
(1, 5, 1)
(1, 5, 2)
(1, 5, 3)
(1, 5, 4)
(1, 5, 5)
(1, 5, 6)
(2, 3, 0)
(2, 3, 1)
(2, 3, 2)
(2, 3, 3)
(2, 3, 4)
(2, 3, 5)
(2, 3, 6)
(2, 4, 0)
(2, 4, 1)
(2, 4, 2)
(2, 4, 3)
(2, 4, 4)
(2, 4, 5)
(2, 4, 6)
(3, 5, 0)
(3, 5, 1)
(3, 5, 2)
(3, 5, 3)
(3, 5, 4)
(3, 5, 5)
(3, 5, 6)
(4, 5, 0)
(4, 5, 1)
(4, 5, 2)
(4, 5, 3)
(4, 5, 4)
(4, 5, 5)
(4, 5, 6)
>>>

Quindi l'attributo 'colore' che vuoi dare al tuo oggetto G lo dovresti ottenere con
Codice: Seleziona tutto
>>> for colored_arc in ((u,v,z) for u,v in G_edges for z in Z):
   G[u][v]['color'] = colored_arc

>>>
rai
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 2111
Iscrizione: maggio 2008
Località: Palermo
Distribuzione: 16.04

Re: [python] Attributo di un grafo

Messaggioda minat09 » domenica 21 ottobre 2018, 11:05

il primo for

Codice: Seleziona tutto
for colored_arc in ((u,v,z) for u,v in G_edges for z in Z):
   print(colored_arc)


funziona e stampa proprio quello di cui avrei bisogno. Il secondo

Codice: Seleziona tutto
for colored_arc in ((u,v,z) for u,v in G.edges() for z in Z):
    G[u][v]['color'] = colored_arc


non funziona e restituisce quest'errore.

Codice: Seleziona tutto
----> 9     G[u][v]['color'] = colored_arc

NameError: name 'u' is not defined
minat09
Prode Principiante
 
Messaggi: 81
Iscrizione: maggio 2013

Re: [python] Attributo di un grafo

Messaggioda rai » domenica 21 ottobre 2018, 13:02

puoi usare lo slicing per fare le assegnazioni nel corpo del ciclo
Codice: Seleziona tutto
>>> for colored_arc in ((u,v,z) for u,v in G.edges() for z in Z):
        G[colored_arc[0]][colored_arc[1]][colored_arc[2]] = colored_arc
rai
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 2111
Iscrizione: maggio 2008
Località: Palermo
Distribuzione: 16.04

Re: [python] Attributo di un grafo

Messaggioda minat09 » martedì 23 ottobre 2018, 16:34

perfetto, grazie!
minat09
Prode Principiante
 
Messaggi: 81
Iscrizione: maggio 2013


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 8 ospiti