Algoritmo probabilístico de enrutamiento de la ruta más corta para redes ópticas

Las operaciones de transferencia de datos son un aspecto crucial en el caso de redes y enrutamiento. Por lo tanto, las operaciones de transferencia de datos eficientes son una necesidad, con el mínimo costo de hardware (cables ópticos, componentes de red WDM, decodificadores, multiplexores) y también en el mínimo tiempo posible. Por lo tanto, la necesidad es proponer un algoritmo que encuentre el camino más corto entre dos Nodes (Node de origen y Node de destino). Veamos un algoritmo completamente nuevo a diferencia del Camino más corto de Dijkstra o cualquier otro algoritmo para encontrar el Camino más corto. Dado un gráfico y dos Nodes (Node de origen y Node de destino), encuentre el camino más corto entre ellos. Calculemos la relación de distancia para cada enlace:

Distancia del enlace AB [indicada por d(AB)] = 10 Distancia del enlace AC [indicada por d(AC)] = 12 Para el enlace AB , Relación de distancia de AB = d(AB) / (d(AB) + d( AC)) Para enlace AC , relación de distancia de AC = d(AC) / (d(AB) + d(AC))

Algoritmo:

Given a graph and two nodes -

1. Find all the paths connecting the two nodes.
2. For each path calculate probability = (Distance Ratio). 
3. After looping over all such paths, find the path for
   which the probability turns out to be minimum.

Ejemplos:

Input : 
Output : Shortest Path is [A -> B]


Explanation :
All possible paths are
P1 = [A->B]
P2 = [A->C->B]
P3 = [A->D->B] 

total distance D = d(P1) + d(P2) + d(P3) 
                 = (3) + (2 + 5) + (4 + 3)
                 = 17

distance ratio for P1 = d(P1) / D = 3/17
distance ratio for P2 = d(P2) / D = 7/17
distance ratio for P3 = d(P3) / D = 7/17

So the shortest path is  P1 = [A->B]




Input : 
Output : Shortest Path is [A -> B]

  

Ilustremos el algoritmo con una red de 7 Nodes y descubramos la ruta probabilística más corta entre el Node 1 y el Node 5. A continuación se muestra la implementación: 

Python3

# Python program to find Probabilistic
# shortest path routing algorithm for
# optical networks
 
# importing random module
import random
 
# Number of nodes
NODES = 7
 
# very small invalid
# when no link exists
INVALID = 0.001 
 
 
distance_links = [[INVALID for i in range(NODES)]
                           for j in range(NODES)]
# distance of each link                          
distance_links[0][1] = 7
distance_links[1][0] = 7
distance_links[1][2] = 8
distance_links[2][1] = 8
distance_links[0][2] = 9
distance_links[2][0] = 9
distance_links[3][0] = 9
distance_links[0][3] = 9
distance_links[4][3] = 4
distance_links[3][4] = 4
distance_links[5][4] = 6
distance_links[4][5] = 6
distance_links[5][2] = 4
distance_links[2][5] = 4
distance_links[4][6] = 8
distance_links[6][4] = 8
distance_links[0][6] = 5
distance_links[6][0] = 5
 
 
 
# Finds next node from current node
def next_node(s):
    nxt = []
     
    for i in range(NODES):
        if(distance_links[s][i] != INVALID):
            nxt.append(i)
    return nxt
 
# Find simple paths for each
def find_simple_paths(start, end):
    visited = set()
    visited.add(start)
 
    nodestack = list()
    indexstack = list()
    current = start
    i = 0
 
    while True:
         
        # get a list of the neighbors
        # of the current node
        neighbors = next_node(current)
 
        # Find the next unvisited neighbor
        # of this node, if any
        while i < len(neighbors) and neighbors[i] in visited:
            i += 1
 
        if i >= len(neighbors):
            visited.remove(current)
             
            if len(nodestack) < 1:
                break
                 
            current = nodestack.pop()
            i = indexstack.pop()
             
        elif neighbors[i] == end:
            yield nodestack + [current, end]
            i += 1
             
        else:
            nodestack.append(current)
            indexstack.append(i + 1)
            visited.add(neighbors[i])
            current = neighbors[i]
            i = 0
 
# Find the shortest path
def solution(sour, dest):
 
    block = 0
    l = []
    for path in find_simple_paths(sour, dest):
        l.append(path)    
 
    k = 0
    for i in range(len(l)):
        su = 0
        for j in range(1, len(l[i])):
            su += (distance_links[l[i][j-1]]
                                 [l[i][j]])
        k += su
         
    # print k
    dist_prob = []
    probability = []
 
    for i in range(len(l)):
        s, su = 0, 0
     
        for j in range(1, len(l[i])):    
                 
            su += (distance_links[l[i][j-1]]
                                 [l[i][j]])
                                  
        dist_prob.append(su/(1.0 * k))
         
     
    for m in range(len(dist_prob)):
        z = (dist_prob[m])
        probability.append(z)
 
    for i in range(len(probability)):
        if(probability[i] == min(probability)):
 
            z = l[i]
            print("Shortest Path is", end = " ")
            print(z)
             
# Driver Code
if __name__ == '__main__' :
    source, dest = 1, 5
     
    # Calling the solution function
    solution(source, dest)

Producción :

Shortest Path is [1, 2, 5]

  Ventaja sobre los algoritmos de ruta más corta comunes: la mayoría de los algoritmos de ruta más corta son algoritmos codiciosos. Por lo tanto, se basa en el hecho de que una solución óptima conduce a una solución globalmente óptima. En la mayoría de los casos, debido a la propiedad codiciosa, es posible que no siempre conduzca a una solución óptima. Pero usando este algoritmo, siempre se puede garantizar una solución óptima y, por lo tanto, la precisión es del 100 %.

Publicación traducida automáticamente

Artículo escrito por Prateek Chanda y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *