Pagina 1 di 1

[risolto][python] Attributo di un grafo

MessaggioInviato: sabato 20 ottobre 2018, 11:12
da minat09
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?

Re: [python] Attributo di un grafo

MessaggioInviato: sabato 20 ottobre 2018, 19:41
da rai
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

>>>

Re: [python] Attributo di un grafo

MessaggioInviato: domenica 21 ottobre 2018, 10:05
da minat09
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

Re: [python] Attributo di un grafo

MessaggioInviato: domenica 21 ottobre 2018, 12:02
da rai
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

Re: [python] Attributo di un grafo

MessaggioInviato: martedì 23 ottobre 2018, 15:34
da minat09
perfetto, grazie!