[risolto][python] Attributo di un grafo

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
minat09
Prode Principiante
Messaggi: 87
Iscrizione: domenica 12 maggio 2013, 11:32

[risolto][python] Attributo di un grafo

Messaggio 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?
Ultima modifica di minat09 il martedì 23 ottobre 2018, 16:35, modificato 1 volta in totale.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [python] Attributo di un grafo

Messaggio 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

>>>
minat09
Prode Principiante
Messaggi: 87
Iscrizione: domenica 12 maggio 2013, 11:32

Re: [python] Attributo di un grafo

Messaggio 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
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [python] Attributo di un grafo

Messaggio 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
minat09
Prode Principiante
Messaggi: 87
Iscrizione: domenica 12 maggio 2013, 11:32

Re: [python] Attributo di un grafo

Messaggio da minat09 »

perfetto, grazie!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti