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)
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)
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
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
def __init__(self): self.lista_puertos = puerto.ListaPuertos() self.bummer = sis.puerto_final()