示例#1
0
 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...")
示例#3
0
    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 : ")
示例#4
0
 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()
示例#5
0
 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()
示例#7
0
 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
示例#8
0
 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")
示例#9
0
 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
示例#10
0
 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
示例#11
0
# 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())
示例#13
0
    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()