Avviso: vi è stato un importante aggiornamento della piattaforma forum, si prega di visionare la discussione in merito: viewtopic.php?f=17&t=637551.

[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 » 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.

rai
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2276
Iscrizione: domenica 11 maggio 2008, 18:03
Distribuzione: 16.04
Località: Palermo

Re: [python] Attributo di un grafo

Messaggio da 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

>>>

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

Re: [python] Attributo di un grafo

Messaggio da 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

rai
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2276
Iscrizione: domenica 11 maggio 2008, 18:03
Distribuzione: 16.04
Località: Palermo

Re: [python] Attributo di un grafo

Messaggio da 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

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

Re: [python] Attributo di un grafo

Messaggio da minat09 » martedì 23 ottobre 2018, 16:34

perfetto, grazie!

Scrivi risposta

Torna a

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 3 ospiti