Exemplo n.º 1
0
 def ruta_a_bummer(self):
     '''
     Se busca la ruta mas corta por amplitud, de modo que se van
     agregando a una pila todos los puertos más proximos al actual
     y si alguno de ellos es el final, se retorna la ruta hasta ese
     momento, sino, se van agregando todos los caminos siguientes.
     El algoritmo es el BFS basado en lo encontrado en internet:
     http://stackoverflow.com/a/8922151
     :return: List de puertos con la Ruta más corta hasta bummer
     '''
     inicio = self.puertos.raiz
     final = Puerto(st.puerto_final())
     print('Obteniendo ruta a Bummer (%s).' % final)
     rutas = List()
     rutas.append(List(inicio))
     while len(rutas) > 0:
         ruta_actual = rutas.popleft()
         puerto = ruta_actual[-1]
         if puerto == final:
             self.ruta_bummer = Ruta(ruta_actual)
             print('Ruta a Bummer obtenida.')
             return ruta_actual
         for puerto_destino in puerto.puertos:
             nuevo_camino = List(*ruta_actual)
             nuevo_camino.append(puerto_destino)
             rutas.append(nuevo_camino)
Exemplo n.º 2
0
def menu():
    punto_inicio = sistema.puerto_inicio()
    punto_final = sistema.puerto_final()
    lista = camino(punto_inicio, punto_final)
    vuelta = camino2(punto_final, punto_inicio, lista)
    d = 0
    while d != 4:
        if d % 2 == 0:
            vuelta = camino2(punto_inicio, punto_final=punto_final, lista=vuelta)
        else:
            vuelta = camino2(punto_final, punto_final=punto_inicio, lista=vuelta)
        print('funciona', d)
        d += 1
    listota = rellernar_el_mapa(lista)
    red(listota)
    ciclos(listota)
Exemplo n.º 3
0
def menu():
    punto_inicio = sistema.puerto_inicio()
    punto_final = sistema.puerto_final()
    lista = camino(punto_inicio, punto_final)
    vuelta = camino2(punto_final, punto_inicio, lista)
    d = 0
    while d != 4:
        if d % 2 == 0:
            vuelta = camino2(punto_inicio,
                             punto_final=punto_final,
                             lista=vuelta)
        else:
            vuelta = camino2(punto_final,
                             punto_final=punto_inicio,
                             lista=vuelta)
        print('funciona', d)
        d += 1
    listota = rellernar_el_mapa(lista)
    red(listota)
    ciclos(listota)
Exemplo n.º 4
0
 def rutas_cortas(self, cantidad):
     '''
     Inspecciona la red para obtener "cantidad" rutas a bummer, de
     modo que se obtengan rutas cortas (porque es más probable que sean
     de capacidad máxima). Si alguna de estas rutas tiene como flujo la
     capacidad del puerto final o inicial se retorna esta como la ruta
     por razones obvias.
     :return: List de las primeras "cantidad" rutas cortas a bummer
     '''
     rutas_totales = List()
     inicio = self.puertos.raiz
     final = Puerto(st.puerto_final())
     rutas = List()
     if self.ruta_bummer is not None:
         rutas.append(self.ruta_bummer.camino)
     else:
         rutas.append(List(inicio))
     iteraciones = 0
     print('Obteniendo rutas a Bummer...')
     while (len(rutas) > 0 and len(rutas_totales) < cantidad
            and iteraciones < 200000):
         ruta_actual = rutas.popleft()
         puerto = ruta_actual[-1]
         if puerto == final:
             nueva_ruta = Ruta(ruta_actual)
             rutas_totales.append(nueva_ruta)
             print('.', end='')
             stdout.flush()
             if (nueva_ruta.flujo == nueva_ruta.flujos[-1]
                     or nueva_ruta.flujo == nueva_ruta.flujos[0]):
                 print('\nRutas obtenidas.')
                 return rutas_totales
         for puerto_destino in puerto.puertos:
             nuevo_camino = List(*ruta_actual)
             nuevo_camino.append(puerto_destino)
             rutas.append(nuevo_camino)
         iteraciones += 1
     print('\nRutas obtenidas.')
     return rutas_totales
Exemplo n.º 5
0
def generar_red():
    """
    La idea es abrcar lo mas que se pueda la red que desconocemos e ir guardando el camino que vamos tomando para que
    efectivamente el programa pueda tarminar. Mi programa se dentendra cuando hayamos visitado el puerto de bummer
    un numero determinado de veces. Los problemas que tiene este algoritmo son que el tiempo de ejecucion es variable
    y que se segura que hayamos visto el 100% de los nodos, sin embargo, si la red tiene al rededor de 1200 nodos,
    al pasar 5 veces por bummer habremos encontrado aprox el 99% de los nodos.
    """
    red = Red()
    puerto_final_ide = sis.puerto_final()
    puerto_actual = Puerto(sis.puerto_inicio(), sis.posibles_conexiones(),
                           sis.get_capacidad())
    i = 0
    red.agregar_puerto(puerto_actual)

    while i < 10:

        n = puerto_actual.proxima_conexion
        sis.hacer_conexion(n)
        puerto_anterior = puerto_actual
        m = sis.preguntar_puerto_actual()[0]
        atrapado = sis.preguntar_puerto_actual()[1]

        if m in red.puertos:
            puerto_actual = red.puertos[m]  # 1
        else:
            puerto_actual = Puerto(m, sis.posibles_conexiones(),
                                   sis.get_capacidad())

        red.agregar_puerto(puerto_actual, puerto_anterior, n, atrapado)  # 2

        if puerto_actual.ide == puerto_final_ide:
            puerto_actual.bummer = True
            print('Encontramos Bummer')
            i += 1

    print('Red Generada')
    return red
Exemplo n.º 6
0
 def __init__(self):
     self.lista_puertos = puerto.ListaPuertos()
     self.bummer = sis.puerto_final()