def GetOptimo(capital: Capital): opt = 10000 capacum = 0 capini = 99 """Interacion entre capital el primer for """ for cap in range(len(capital) - 1): DistanciaHelper.InicialCuidadVisitada(capital) Heuristica.GetRecorrerCuidad(cap, capital) capacum = 0 """La cantidad KM recorrido """ for km in range(len(capital) - 1): capacum += int( DistanciaHelper.GetDistancia( DistanciaHelper.Capitales[Heuristica.recorrido[km]], DistanciaHelper.Capitales[Heuristica.recorrido[km + 1]])) """Camparando para buscar el optimo""" if capacum <= opt: opt = capacum capini = cap print("El optimo: ", capital[capini].Nombre) """Vuelve a inicial las cuidad para poder calcular el recorrido de nuevo cal la capital opt""" DistanciaHelper.InicialCuidadVisitada(capital) Heuristica.GetRecorrerCuidad(capini, capital) Heuristica.PrintRecorrido()
def Run(): """Ejecuta programa principal""" opt = 0 while opt != 5: print() Initial() opt = input("Ingrese opción: ") if opt == "1": ciudadElegida = int(input("Ciudad de partida: ")) recorrido = Heuristica.CalcularRecorridoIniciandoEn( DistanciaHelper.Capitales[ciudadElegida]) DistanciaHelper.PrintRecorrido(recorrido) MapHelper.DibujarMapa(recorrido) elif opt == "2": recorrido = Heuristica.CalcularMejorRecorrido() DistanciaHelper.PrintRecorrido(recorrido) MapHelper.DibujarMapa(recorrido) elif opt == "3": configuracion = IngresarConfiguracion() algoritmo = AlgoritmoGenetico(configuracion) algoritmo.Run() mejor = algoritmo.GetMejorCromosomaDeTodasLasPoblaciones() DistanciaHelper.PrintRecorrido(mejor[1].GetAllCiudades()) MapHelper.DibujarMapa(mejor[1].GetAllCiudades()) """algoritmo.ExportToExcel()""" elif opt == "5": break input("Presione Enter para continuar...")
def Run(self): exit = False DistanciaHelper.LoadTablaDistanicaYCapitales() cuidad = DistanciaHelper.Capitales DistanciaHelper.GetAllCuidad(cuidad) DistanciaHelper.InicialCuidadVisitada(cuidad) print() Initial() val = input("Ingrese Opcion : ") while True: """configuracion = IngresarConfiguracion() algoritmo = AlgoritmoGenetico(configuracion) algoritmo.Run() algoritmo.Print() algoritmo.ExportToExcel() line = "n" # input("Correr Nuevamente? [Y,N]: ") if line.lower() == "n": exit = True""" cuidadElegida = 0 if val == "1": cuidadElegida = int(input("Cuidad de partida : ")) if cuidadElegida < 0 or cuidadElegida > 23: print( "Vuelve a eligir una capital que esta dentro de las capitales" ) return True Heuristica.GetRecorrerCuidad(cuidadElegida, cuidad) Heuristica.PrintRecorrido() elif val == "2": Heuristica.GetOptimo(cuidad) input("Precione enter para continuar") Initial() val = input("Ingrese Opcion : ")
def Run(self): self.progress['value'] = 0 self.update_idletasks() config = self.ConfigurationViewModel.ToConfiguration() algoritmo = AlgoritmoGenetico(config) algoritmo.Run(self) mejor = algoritmo.GetMejorCromosomaDeTodasLasPoblaciones() DistanciaHelper.PrintRecorrido(mejor[1].GetAllCiudades()) MapHelper.DibujarMapa(mejor[1].GetAllCiudades()) self.progress['value'] = 0 self.update_idletasks()
def BuscarCiudadMasCercana(actual: Capital) -> Capital: """Busca la ciudad mas cercana a la actual de las que no se visitaron""" destino = None minimaDistancia = None for posibleDestino in list( filter( lambda capital: capital.Visitada is False and capital != actual, DistanciaHelper.Capitales)): distancia = DistanciaHelper.GetDistancia(actual, posibleDestino) if (minimaDistancia is None or distancia < minimaDistancia): minimaDistancia = distancia destino = posibleDestino return destino
def Run(self): nombreCiudadOrigen = self.Model.CiudadOrigen.get() recorrido = None if nombreCiudadOrigen != '': recorrido = Heuristica.CalcularRecorridoIniciandoEn( list( filter(lambda capital: capital.Nombre == nombreCiudadOrigen, DistanciaHelper.Capitales))[ 0], self) else: recorrido = Heuristica.CalcularMejorRecorrido(self) self.Model.DistanciaTotal.set(DistanciaHelper.GetDistanciaTotal(recorrido)) MapHelper.DibujarMapa(recorrido) self.progress['value'] = 0 self.update_idletasks()
def CalcularMejorRecorrido(ventana=None) -> []: mejorRecorrido = None minimaDistancia = None for capital in DistanciaHelper.Capitales: if ventana is not None: ventana.progress['value'] += (100 / len(DistanciaHelper.Capitales)) ventana.update_idletasks() recorrido = Heuristica.CalcularRecorridoIniciandoEn(capital) distancia = DistanciaHelper.GetDistanciaTotal(recorrido) if minimaDistancia is None or distancia < minimaDistancia: mejorRecorrido = recorrido minimaDistancia = distancia return mejorRecorrido
def PrintRecorrido(): reckm = 0 print("Indice" + ("Ciudad").center(30, " ")) for rec in range(len(Heuristica.recorrido)): print( repr(DistanciaHelper.Capitales[ Heuristica.recorrido[rec]].Indice) + repr(DistanciaHelper.Capitales[ Heuristica.recorrido[rec]].Nombre).center(40, " ")) for cap in range(len(DistanciaHelper.Capitales) - 1): reckm += int( DistanciaHelper.GetDistancia( DistanciaHelper.Capitales[Heuristica.recorrido[cap]], DistanciaHelper.Capitales[Heuristica.recorrido[cap + 1]])) print("El recorrido total es de " + repr(reckm) + " km")
def BuscarCiudad(actual): destino = 0 menor = 10000 for cap in range(len(DistanciaHelper.Capitales) - 1): """Revisando si ya no fue visitada""" if DistanciaHelper.Visitadas[cap] == 0: dis = int( DistanciaHelper.GetDistancia( DistanciaHelper.Capitales[actual], DistanciaHelper.Capitales[cap])) """Compara la distancia encuentrado y va guardando el menor""" if dis < menor: menor = dis destino = cap return destino
def CalcularRecorridoIniciandoEn(ciudadPartida: Capital, ventana=None) -> []: recorrido = [] DistanciaHelper.ResetVisitadas() # Saca el tilde de visitadas ciudadActual = ciudadPartida while ciudadActual is not None: if ventana is not None: ventana.progress['value'] += (100 / len(DistanciaHelper.Capitales)) ventana.update_idletasks() recorrido.append(ciudadActual) ciudadActual.SetVisitada(True) ciudadActual = Heuristica.BuscarCiudadMasCercana(ciudadActual) # Para volver a la ciudad origen recorrido.append(recorrido[0]) return recorrido
# Archivo al que llamamos para iniciar nuestro código # Simplemente crea una instancia de Program y llama al método Run() del mismo. # Si se desea interactuar con una interfaz gráfica, se puede prescindir de Program.py y utilizar AlgoritmoGeneticoView.py from Ejercicio3.DistanciaHelper import DistanciaHelper from Ejercicio3.Program import Program from Ejercicio3.ProgramView import ProgramView DistanciaHelper.LoadTablaDistanciaYCapitales() DistanciaHelper.GetAllCiudades() # Program().Run() ProgramView().Show()
def Distancia(self): return DistanciaHelper.GetDistanciaTotal(self.GetAllCiudades())
def DibujarMapa(recorrido: []): """Método que dibuja el recorrido recibido como parámetro en un mapa""" pg.init() NEGRO = (0, 0, 0) GRIS = (200, 200, 200) BLANCO = (255, 255, 255) ROJO = (255, 0, 0) CELESTE = (0, 255, 100) Dimensiones = (500, 892) pg.display.set_caption( 'Mejor recorrido - ' + repr(DistanciaHelper.GetDistanciaTotal(recorrido)) + ' Km') mapa = pg.display.set_mode(Dimensiones) mapa.fill(GRIS) mapa.blit(pg.image.load('map.png'), (0, 0)) posicionRefenciasX = 370 posicionReferenciaY = 470 font = pg.font.SysFont('calibri', 14) font.set_italic(True) rectReferencias = pg.Rect(295, 460, 150, 330) pg.draw.rect(mapa, BLANCO, rectReferencias) pg.draw.line(mapa, NEGRO, (295, 460), (295 + 150, 460), 2) pg.draw.line(mapa, NEGRO, (295 + 150, 460), (295 + 150, 460 + 330), 2) pg.draw.line(mapa, NEGRO, (295 + 150, 460 + 330), (295, 460 + 330), 2) pg.draw.line(mapa, NEGRO, (295, 460 + 330), (295, 460), 2) font.set_underline(True) text = font.render('Referencias:', True, NEGRO) textRect = text.get_rect() textRect.center = (posicionRefenciasX, posicionReferenciaY) mapa.blit(text, textRect) font.set_underline(False) pg.display.update() font.set_italic(False) for indice in range(len(recorrido) - 1): pg.draw.circle(mapa, ROJO, (recorrido[indice].Lat, recorrido[indice].Long), 4) text = font.render( repr(indice + 1) + ". " + recorrido[indice].Nombre, True, NEGRO) textRect = text.get_rect() textRect.center = (posicionRefenciasX, posicionReferenciaY + (13 * (indice + 1))) mapa.blit(text, textRect) pg.display.update() font.set_bold(True) for indice in range(len(recorrido) - 1): pg.draw.aaline( mapa, CELESTE, (recorrido[indice].Lat, recorrido[indice].Long), (recorrido[indice + 1].Lat, recorrido[indice + 1].Long), 1) pg.display.update() time.sleep(0.1) font.set_bold(True) for indice in range(len(recorrido) - 1): text = font.render(repr(indice + 1), True, NEGRO) textRect = text.get_rect() textRect.center = (recorrido[indice].Lat + 8, recorrido[indice].Long - 8) mapa.blit(text, textRect) pg.display.update() EXIT = False while not EXIT: for event in pg.event.get(): if event.type == pg.QUIT: EXIT = True pg.quit()