eng.jack's
Profilo di
Nome | eng.jack's |
---|---|
Indirizzo email | n/a |
Avatar | |
Messaggi | 1 |
-
- 2019-05-24 17:06:10
- Aiuto script simulatore grafo di rete
- Forum >> Programmazione Python >> Web e Reti
- 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 ---