Forum
>>
Programmazione Python
>>
Web e Reti
>>
Aiuto script simulatore grafo di rete
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
|
Scritto da eng.jack's |
2019-05-24 17:06:10 - Aiuto script simulatore grafo di rete
|
|
Salve, sto lavorando ad uno script python a scopo didattico.
Lo script implementa un grafo che rappresenta una piccola rete internet di 4 nodi(router) i nodi sono uniti da archi. Nodi e archi sono rappresentati con liste. Il mio obiettivo è ampliare questo script con una classe matrice che implementi una matrice quadrata pari al numero dei nodi della rete e i suoi elementi rappresentano le quantità di traffico scambiata dai percorsi end to end tra i nodi, successivamente devo aggiungere un metodo alla classe grafo che dia in output le quantita di traffico totali scambiate in ogni link del grafo. Per il calcolo dell'instradamento è presente un metodo dijkstra che calcola i percorsi a costo minimo, inoltre c'è un altro metodo che realizza la costruzione di tutti i percorsi per arrivare agli altri nodi a costo minimo partendo da un nodo sorgente. la classe che implementa la matrice suddetta sono riuscito a crearla, ma sono bloccato sul metodo che assegni le giuste quantita di traffico per ogni link che è coinvolto nei percorsi da uno dei 4 nodi sorgente. Non riesco a trovare un modo per mettere in collegamento gli elementi della matrice con i nodi che devono essere presi in considerazione in un dato percorso. Chi mi potrebbe dare aiuto nella realizzazione di questo metodo? Vi ringrazio anticipatamente. Ci sto lavorando da settimane e non riesco a trovare un modo. SONO DISPERATO. Precisamente questo è quello che dovrei fare: Modificare lo script simulatore_rete.py fornito includendo un modello per il traffico scambiato tra i nodi. In particolare si richiede di creare un (o più) oggetto che rappresenti la Matrice di Traffico ( TM ) della rete. Una TM è una struttura dati in forma matriciale che descrive le relazioni di traffico esistenti tra i nodi di una rete. Tale matrice è quadrata, con dimensione N pari al numero di nodi che compongono la rete. L’indice di riga è in relazione con il nodo che genera la domanda di traffico (sorgente), mentre l’indice di colonna rappresenta il nodo ricevente (destinazione). Pertanto, il generico elemento t s,d della TM rappresenta la quantità di traffico inviata dalla sorgente s alla destinazione d . Dal momento che i nodi non scambiano traffico con se stessi, la diagonale di questa matrice risulta essere composta da soli 0 . Una volta definito l’oggetto TM in Python, è richiesta l’implementazione di una funzione che assegni in maniera automatica gli elementi della matrice. SUGGERIMENTO: un tipico modello di traffico prevede l’estrazione casuale del valore della domanda di traffico in un intervallo finito. Una volta generato la TM si chiede ulteriormente di aggiungere un metodo alla classe Grafo che fornisca in output la quantità di traffico instradata su ciascun link della rete. Per il calcolo dell’instradamento deve essere utilizzato l’algoritmo di Dijkstra. I numeri rappresentano la quantità totale di traffico trasportata da ciascun link della rete, utilizzando l’instradamento Shortest Path calcolato con Dijkstra e avendo come input la TM mostrata in figura. Di seguito è spiegato come sono stati ottenuti i valori di traffico per i link della rete: Link A-B → t A,B + t A,C = 4 + 1 = 5 Link B-C → t A,C + t B,C = 1 + 2 = 3 Link C-B → t C,B + t C,A = 3 + 0 = 3 Link B-A → t B,A + t C,A = 2 + 0 = 2 Le equazioni scritte sopra sono diretta conseguenza del routing nella rete (cioè dei percorsi end to end seguiti dai flussi di traffico). Questo è il codice: import numpy
import random
class Nodo:
routingTable = {} # <key:destinazione;value:next_hop>
SPT = {} # <key:destinazione;value:percorso>
def __init__(self, nome):
self.nome = nome #stringa
def setGrafo(self, rete):
self.grafo = rete
def dijkstra(self, grafo):
visitati = self
nonVisitati = grafo.listaNodi[:]
nonVisitati.remove(self)
costi = {}
self.pred = {}
vicini = grafo.trovaVicini(self)
for nodo in grafo.listaNodi:
if nodo in vicini:
arco = grafo.trovaArco(self, nodo)
costi[nodo.nome] = arco.costo
else:
costi[nodo.nome] = 1000000000
costi[self.nome] = 0
while len(nonVisitati) > 0:
costoMinimo = 1000000000
for nodo in visitati:
costoTmp = costi[nodo.nome]
vicini = grafo.trovaVicini(nodo)
for vicino in vicini:
if vicino not in visitati:
arco = grafo.trovaArco(nodo, vicino)
if costoTmp + arco.costo < costoMinimo:
costoMinimo = costoTmp + arco.costo
visitCand = vicino
predCand = nodo
visitati.append(visitCand)
nonVisitati.remove(visitCand)
costi[visitCand.nome] = costoMinimo
self.pred[visitCand.nome] = predCand
vicini = grafo.trovaVicini(visitCand)
for vicino in vicini:
if vicino not in visitati:
arco = grafo.trovaArco(visitCand, vicino)
if costoMinimo + arco.costo < costi[vicino.nome]:
costi[vicino.nome] = costoMinimo + arco.costo
def costruisciPercorso(self, destinazione, grafo):
path = Percorso(self, destinazione)
path.addNodo(destinazione)
print ("calcolo percorso da " + self.nome + " a " + destinazione.nome)
nodoCorrente = destinazione
while nodoCorrente != self:
predecessore = self.pred[nodoCorrente.nome]
arcoCorrente = grafo.trovaArco(predecessore, nodoCorrente)
path.addLink(arcoCorrente)
nodoCorrente = predecessore
path.addNodo(nodoCorrente)
path.invertiPercorso()
return path
def scriviRoutingTable(self, grafo):
for nodo in grafo.listaNodi:
nodo.dijkstra(grafo)
if nodo != self:
path = self.costruisciPercorso(nodo, grafo)
print ("Path da " + self.nome + " a " + nodo.nome)
path.stampaPercorso()
print ("Il costo del percorso e' " + str(path.getCosto()))
print ("Il throughput del percorso e' " + str(path.getThroughput()))
self.routingTable[nodo.nome] = path.getNextHop().nome
else:
self.routingTable[nodo.nome] = "direttamente connesso"
class Arco:
def __init__(self, da, a, costo = 1, banda = 100):
self.da = da
self.a = a
self.id = da.nome + "_" + a.nome
self.costo = costo
self.banda = banda
def setBanda(self, banda):
self.banda = banda
def setCosto(self, costo):
self.costo = costo
class Grafo:
listaNodi = []
listaArchi = []
def __init__(self, nome):
self.nome = nome
def addNodo(self, nodo):
self.listaNodi.append(nodo)
def addArco(self, arco):
self.listaArchi.append(arco)
def trovaVicini(self, nodo):
vicini = []
for arco in self.listaArchi:
if arco.da == nodo:
vicini.append(arco.a)
return vicini
def trovaArco(self, da, a):
for arco in self.listaArchi:
if arco.da == da and arco.a == a:
return arco
class Percorso:
def __init__(self, sorgente, destinazione):
self.pathID = sorgente.nome + "-" + destinazione.nome
self.sorgente = sorgente
self.destinazione = destinazione
self.costo = 0
self.pathLength = 0
self.throughput = 0
self.listaNodi = []
self.listaArchi = []
def addNodo(self, nodo):
self.listaNodi.append(nodo)
def addLink(self, arco):
self.listaArchi.append(arco)
def getCosto(self):
costo = 0
for arco in self.listaArchi:
costo += arco.costo
self.costo = costo
return costo
def getThroughput(self):
throughput = 1000000000
for arco in self.listaArchi:
if arco.banda < throughput:
throughput = arco.banda
self.throughput = throughput
return throughput
def getPathLength(self):
self.pathLength = len(listaNodi)
return self.pathLength
def invertiPercorso(self):
self.listaNodi.reverse()
self.listaArchi.reverse()
def getNextHop(self):
return self.listaNodi1
def stampaPercorso(self):
stringa = ""
for nodo in self.listaNodi:
stringa = stringa + nodo.nome + "->"
print (stringa[:len(stringa)-2])
return [nodo.nome for nodo in self.listaNodi]
class MatriceTraffico():
def __init__(self,nome,m,n):
self.nome=nome
self.righe=m
self.colonne=n
TM = numpy.zeros((m,n))
self.matrix=TM
print("Matrice di traffico\n")
print(TM)
def assegna_Unita Traffico(self,TM):
for i in range(len(TM)):
for j in range(len(TM0)):
TMj = random.randint(1,10)
TM=0
TMjj=0
print("Matrice di traffico con quantita di traffico tra i nodi\n")
print(TM)
if __name__ == "__main__":
grafo = Grafo("Rete_4_nodi")
nodoA = Nodo("A")
grafo.addNodo(nodoA)
nodoB = Nodo("B")
grafo.addNodo(nodoB)
nodoC = Nodo("C")
grafo.addNodo(nodoC)
nodoD = Nodo("D")
grafo.addNodo(nodoD)
arco1 = Arco(nodoA, nodoB, 10, 100)
grafo.addArco(arco1)
arco2 = Arco(nodoA, nodoC, 1, 100)
grafo.addArco(arco2)
arco3 = Arco(nodoB, nodoA, 1, 100)
grafo.addArco(arco3)
arco4 = Arco(nodoB, nodoD, 1, 100)
grafo.addArco(arco4)
arco5 = Arco(nodoC, nodoA, 1, 100)
grafo.addArco(arco5)
arco6 = Arco(nodoC, nodoD, 1, 10)
grafo.addArco(arco6)
arco7 = Arco(nodoD, nodoB, 1, 100)
grafo.addArco(arco7)
arco8 = Arco(nodoD, nodoC, 1, 100)
grafo.addArco(arco 8)
nodoA.dijkstra(grafo)
nodoA.scriviRoutingTable(grafo)
print (nodoA.routingTable)
nodoB.dijkstra(grafo)
nodoB.scriviRoutingTable(grafo)
print (nodoB.routingTable)
matrice = MatriceTraffico("Matrice MxN",4,4)
print(matrice.assegna_Unita Traffico(matrice.matrix)) Inoltre allego il link del codice in pastebin: https://pastebin.com/k4trkrJ4
--- Ultima modifica di eng.jack's in data 2019-05-24 17:30:00 --- |
Pagina: 1
Esegui il login per scrivere una risposta.
