Esempio n. 1
0
def menu_principal():
    clear_screen()
    print("Menu de opciones:")
    print("1) Resolver un problema de transporte")
    print("2) Resolver un problema de redes")
    print("3) Resolver un problema de programación entera")
    print("q) Salir")
Esempio n. 2
0
def menu_ingresar_matriz_costos(msg: str = "TRANSPORTE", ppl: bool = False):
    while True:
        clear_screen()

        matriz = None
        objeto = 'un PPL' if ppl else 'una matriz'
        extension = 'JSON' if ppl else 'csv'
        print(f'PROBLEMAS DE {msg}')
        print("Opciones para ingresar datos:")
        print(f"1) Ingresar {objeto} manualmente")
        print(f"2) Ingresar {objeto} desde un archivo {extension}")
        print("q) Regresar al menú anterior.")

        while True:
            opcion = input('¿Qué desea hacer?: ')
            if opcion == 'q' or (check_int(opcion) is not None
                                 and 0 < check_int(opcion) <= 2):
                break
            else:
                print('Ingrese una opción válida...')
        if opcion == '1':
            matriz = datos.ingresar_ppl_manualmente(
            ) if ppl else datos.ingresar_matriz_manualmente()
        elif opcion == '2':
            matriz = datos.ingresar_ppl_json(
            ) if ppl else datos.ingresar_matriz_csv()
        elif opcion == 'q':
            matriz = 0
        if matriz is not None:
            return matriz
Esempio n. 3
0
def mostrar_problema(prob_redes):
    while True:
        clear_screen()
        print("Información del problema de redes:")
        print("1) Adyacencia del problema")
        print("2) Costos del problema")
        print("3) Capacidades de los nodos")
        print("4) Solucion")
        print("q) Regresar")
        opcion = input("¿Qué desea ver?: ")

        if opcion == '1':
            imprimir_adyacencia(prob_redes)
        elif opcion == '2':
            imprimir_costos(prob_redes)
        elif opcion == '3':
            imprimir_capacidades(prob_redes)
        elif opcion == '4':
            imprimir_solucion(prob_redes)
        elif opcion == 'q':
            break
        else: 
            print("Opcion inválida...")
            input("\n\nPresione Enter para continuar...")
    return
def solucion_inicial_manual(adyacencia, costos, capacidades, nombres):
    clear_screen()
    if np.sum(capacidades) != 0:
        print(
            """Dado que su problema no está balanceado, para evitar algún inconveniente \n
		No permitimos una asignación manual de variables básicas, le pedimos que \n
		utilice la opción del método de M grande""")
        return None

    matriz_variables_basicas = np.tile(False, adyacencia.shape)
    matriz_variables_decision = np.zeros(adyacencia.shape)

    capacidades_aux = capacidades.copy()

    num_nodos = adyacencia.shape[0] - 1

    for i in range(0, num_nodos, 1):
        print("Ingresando variables básicas")
        opcion = 'S'
        while opcion == 'S' or opcion == 's':
            i = int(input("Ingrese el nodo desde el que surje el flujo: ")) - 1
            j = int(input("Ingrese el nodo al que se dirige el flujo: ")) - 1
            flujo = float(
                input("Ingrese el flujo de  {0} a {1}: ".format(
                    nombres[i], nombres[j])))
            opcion = input("¿Está seguro de los valores?(S/n): ")
            if (i < 0 or i > num_nodos or j < 0 or j > num_nodos or flujo < 0):
                print("Ingresó un valor inválido, inténtelo de nuevo")
                opcion = 'S'
            elif not adyacencia[i][j]:
                print("El flujo que ingresó no existe, inténtelo de nuevo")
            else:
                matriz_variables_basicas[i][j] = True
                matriz_variables_decision[i][j] = flujo
                break

    for i, renglon in enumerate(matriz_variables_basicas):
        for j, elemento in enumerate(renglon):
            if i < j and matriz_variables_basicas[i][j]:
                capacidades_aux[
                    i] = capacidades_aux[i] - matriz_variables_decision[i][j]
                capacidades_aux[
                    j] = capacidades_aux[j] + matriz_variables_decision[i][j]
            elif i > j and matriz_variables_basicas[i][j]:
                capacidades_aux[
                    j] = capacidades_aux[j] - matriz_variables_decision[j][i]
                capacidades_aux[
                    i] = capacidades_aux[i] + matriz_variables_decision[j][i]

    if (capacidades_aux == 0).sum() == num_nodos + 1:
        prob_redes = ProblemaRedes(adyacencia, costos, capacidades, nombres)
        prob_redes.matriz_variables_basicas = matriz_variables_basicas.flatten(
        )
        prob_redes.matriz_variables_decision = matriz_variables_decision.flatten(
        )
        return simplex_redes(prob_redes)
    else:
        print("***Error*** La solución que ingresó no es factible...")
        input("Presione Enter para continuar...")
        return None
Esempio n. 5
0
def init():
    clear_screen()
    print(
        'Bienvenido al programa para hallar mejor política de un Proceso Markoviano de Decisión.'
    )
    problema = set_problema()
    menu = Menu(problema)
    menu.start()
Esempio n. 6
0
def imprimir_capacidades(prob_redes):
    clear_screen()
    print("Las capacidades de cada nodo son: ")
    cabecera = prob_redes.nombres
    tabla = []
    tabla.append(prob_redes.recursos)
    print(tabulate(tabla, cabecera, tablefmt = "fancy_grid"))
    input("\n\nPresione Enter para continuar...")
    return
Esempio n. 7
0
def imprimir_solucion(prob_redes):
    clear_screen()
    print("Los flujos que minimizan el costo son:")
    for i,renglon in enumerate(prob_redes.matriz_variables_basicas):
        for j, elemento in enumerate(renglon):
            if elemento and prob_redes.matriz_variables_decision[i][j] != 0:
                print(prob_redes.nombres[i] + " -> " + prob_redes.nombres[j] +" flujo de " + str(prob_redes.matriz_variables_decision[i][j]))
    print("Con un costo de: {0}".format(prob_redes.z))
    input("\n\nPresione Enter para continuar...")
Esempio n. 8
0
def imprimir_solucion(prob_asignacion):
    clear_screen()
    print("La asignación que minimiza el costo es: ")
    print("Nombre -> Actividad")
    for i,renglon in enumerate(prob_asignacion.matriz_variables_decision):
        for j, elemento in enumerate(renglon):
            if elemento:
                print(prob_asignacion.nombres_oferta[i] + " -> " + prob_asignacion.nombres_demanda[j])
    print("Con un costo de: {0}".format(prob_asignacion.z))
    input("\n\nPresione Enter para continuar...")
Esempio n. 9
0
 def menu(self):
     self.resolver()
     while True:
         clear_screen()
         opc = self.get_opc()
         if opc == 5:
             print('Saliendo del método...')
             break
         self.switcher(opc)
         input('\nPulse enter para continuar...')
Esempio n. 10
0
def imprimir_adyacencia(prob_redes):
    clear_screen()
    print("La adyacencia de cada nodo es: ")
    for i, nodo in enumerate(prob_redes.matriz_adyacencia):
        adyacencia = []
        for j, elemento in enumerate(nodo):
            if elemento:
                adyacencia.append(prob_redes.nombres[j])
        print("El nodo " + prob_redes.nombres[i] + " manda flujo a: " + ','.join(adyacencia))
    input("\n\nPresione Enter para continuar...")
    return
 def menu(self):
     clear_screen()
     if not self.start_metodo():
         print('\nNo se pudo encontrar solución al problema')
     while True:
         opc = self.get_opc()
         if opc == 3:
             print('Saliendo del método...')
             break
         self.switcher(opc)
         input('\nPulse enter para continuar...')
         clear_screen()
Esempio n. 12
0
 def menu(self):
     clear_screen()
     self.nodo_inicial = get_param('el nodo inicial', 1, self.dim) - 1
     self.iniciar_algoritmo()
     while True:
         clear_screen()
         opc = self.get_opc()
         if opc == 4:
             print('Saliendo del método...')
             break
         self.switcher(opc)
         input('\nPulse enter para continuar...')
Esempio n. 13
0
def imprimir_oferta_demanda(prob_transporte):
    clear_screen()
    print("La oferta es: ")
    cabecera = prob_transporte.nombres_oferta.copy()
    tabla = [[]]
    for elemento in prob_transporte.oferta:
        tabla[0].append(elemento)
    print(tabulate(tabla, cabecera, tablefmt="fancy_grid"))
    print("La demanda es: ")
    cabecera = prob_transporte.nombres_demanda
    tabla = [[]]
    for elemento in prob_transporte.demanda:
        tabla[0].append(elemento)
    print(tabulate(tabla, cabecera, tablefmt="fancy_grid"))
    input("\n\nPresione Enter para continuar...")
    return
Esempio n. 14
0
 def menu(self):
     if not self.solucion.success:
         print(
             'No se pudo encontrar una solución factible al problema relajado...'
         )
         input(
             'Volviendo al menu anterior, presione enter para continuar...')
         return None
     self.start_branch_bound()
     while True:
         clear_screen()
         opc = self.get_opc()
         if opc == 3:
             print('Saliendo del método...')
             break
         self.switcher(opc)
         input('\nPulse enter para continuar...')
Esempio n. 15
0
def imprimir_costos(prob_transporte):
    clear_screen()
    cabecera = prob_transporte.nombres_demanda.copy()
    cabecera.insert(0, " ")
    tabla = []
    print("Mostrando la matriz de costos")
    for i, renglon in enumerate(prob_transporte.matriz_costos):
        renglon_tab = []
        renglon_tab.append(prob_transporte.nombres_oferta[i])
        for elemento in renglon:
            if elemento < 9999:
                renglon_tab.append(elemento)
            else:
                renglon_tab.append("-")
        tabla.append(renglon_tab)
    print(tabulate(tabla, cabecera, tablefmt="fancy_grid"))
    input("\n\nPresione Enter para continuar...")
    return
Esempio n. 16
0
 def get_opcion(cls) -> str:
     clear_screen()
     print(
         'Seleccione el método que desea emplear para resolver el problema:'
     )
     print('\t1) Enumeración exahustiva de políticas')
     print('\t2) Solución por programación lineal')
     print('\t3) Método de mejoramiento de políticas')
     print('\t4) Método de mejoramiento de políticas con descuento')
     print('\t5) Método de aproximaciones sucesivas')
     while True:
         opc = check_int(
             input('Ingrese el número del método que desea emplear: '))
         if opc is None or opc > 5 or opc < 1:
             print('Por favor ingrese un número entre 1 y 5')
         else:
             break
     return str(opc)
Esempio n. 17
0
def mostrar_problema(prob_asignacion):
    while True:
        clear_screen()
        print("Información del problema de asignacion:")
        print("1) Costos del problema")
        print("2) Solucion")
        print("q) Regresar")
        opcion = input("¿Qué desea ver?: ")

        if opcion == '1':
            imprimir_costos(prob_asignacion)
        elif opcion == '2':
            imprimir_solucion(prob_asignacion)
        elif opcion == 'q':
        	break
        else: 
            print("Opcion inválida...")
            input("\n\nPresione Enter para continuar...")
    return
Esempio n. 18
0
def menu_programacion_entera():
    while True:
        ppl_ingresado = menu_ingresar_matriz_costos('PROGRAMACIÓN ENTERA',
                                                    True)
        if ppl_ingresado is None:
            continue
        if ppl_ingresado is 0:
            return
        else:
            break
    while True:
        clear_screen()
        print("METODOS PARA PROBLEMAS DE PROGRAMACIÓN ENTERA")
        print("¿Qué método desea utilizar?:")
        print("1) Resolver por Branch and Bound")
        print("2) Resolver por enumeración implícita (sólo binario)")
        print("m) Utilizar otro ppl")
        print("q) Regresar al menu anterior")

        opc = input('¿Qué desea hacer?: ')
        if opc == 'q':
            break
        elif opc == 'm':
            ppl_ingresado = menu_ingresar_matriz_costos(
                'PROGRAMACIÓN ENTERA', True)
            continue
        num = check_int(opc)
        if num is not None and num < 3:
            z, tipo_ppl, restricciones, lado_derecho, binario = ppl_ingresado
            if num == 2 and not binario:
                print(
                    '** Escogió enumeración implícita, pero el problema no es binario... **'
                )
                print(
                    '** Si continua se resolverá como un problema binario. **')
                print('** Si desea otro metodo, escoja no continuar. **')
                if confirmacion('¿Desea resolver como problema binario?'):
                    binario = True
                else:
                    continue
            switcher_metodos_entera[opc](z, tipo_ppl, restricciones,
                                         lado_derecho, binario).menu()
Esempio n. 19
0
def menu_sol_bas_fact_inicial_red():
    adyacencia, costos, capacidades, nombres = menu_ingresar_red()
    if adyacencia is 0:
        return
    while True:
        clear_screen()
        print(f'SOLUCIONAR RED POR SIMPLEX')
        print("Opciones para SOLUCIÓN BÁSICA FACTIBLE INICIAL:")
        print(f"1) Método de la M grande")
        print(f"2) Dar una solución básica factible")
        print(f"o) Dar otro MCFP")
        print("q) regresar al menú anterior.")
        opcion = input('¿Qué desea hacer?: ')
        if opcion == 'q':
            break
        elif opcion == '1':
            prob_redes = m_grande(adyacencia, costos, capacidades, nombres)
            ms.mostrar_problema(prob_redes)
            continue
        elif opcion == '2':
            prob_redes = solucion_inicial_manual(adyacencia, costos,
                                                 capacidades, nombres)
            if prob_redes is None:
                continue
            else:
                ms.mostrar_problema(prob_redes)
        elif opcion == 'o':
            adyacencia_aux, costos_aux, capacidades_aux = menu_ingresar_red()
            if not (adyacencia_aux is 0):
                matriz_adyacencia = adyacencia_aux
                matriz_costos = costos_aux
                capacidades = capacidades_aux
            continue
        elif opcion == 'q':
            break
        else:
            print('Ingrese una opción válida...')
            input('Presione enter para continuar...')
    return
Esempio n. 20
0
def mostrar_problema(prob_transporte):
    while True:
        clear_screen()
        print("Información del problema de transporte:")
        print("1) Costos del problema")
        print("2) Oferta y demanda")
        print("3) Solucion")
        print("q) Regresar")
        opcion = input("¿Qué desea ver?: ")

        if opcion == '1':
            imprimir_costos(prob_transporte)
        elif opcion == '2':
            imprimir_oferta_demanda(prob_transporte)
        elif opcion == '3':
            imprimir_solucion(prob_transporte)
        elif opcion == 'q':
            break
        else:
            print("Opcion inválida...")
            input("\n\nPresione Enter para continuar...")
    return
Esempio n. 21
0
def menu_redes():
    while True:
        clear_screen()

        print("METODOS PARA PROBLEMAS DE REDES")
        print("¿Qué método desea utilizar?:")
        print("1) Camino más corto, Dijkstra")
        print("2) Floyd-Warshal")
        print("3) Árbol de Expansión Mínima")
        print("4) Flujo Máximo ")
        print("5) Método simplex para redes")
        print("q) Regresar al menu anterior")

        opc = input('¿Qué desea hacer?: ')

        if opc == 'q':
            break
        elif opc == '1' or opc == '2':
            matriz = menu_ingresar_matriz_costos('REDES')
            if matriz is not None and matriz is not 0:
                switcher_metodos_redes[opc](matriz).menu()
            continue
        elif opc == '5':
            menu_sol_bas_fact_inicial_red()
            continue
        elif opc == '3':
            data = inputMatrix()
            expansionMinima(data)
            wait = input('\n Presiona cualquier tecla para continuar.')
            continue
        elif opc == '4':
            data = inputMatrix()
            objectMFS = flujoMaximo(data)
            objectMFS.solverFlujoMaximo()
            print('\nFlujo Máximo de la red, F =', objectMFS.FM)
            print('\nLista de Rutas: ', objectMFS.resultados)
            wait = input('\n Presiona cualquier tecla para continuar.')
            continue
Esempio n. 22
0
def menu_transporte():
    clear_screen()
    opcion = input("¿Desea ingresar un problema de asignacion?(S/n): ")
    if opcion.lower() == 's':
        problema_transporte = menu_ingresar_transporte(True)
        if problema_transporte is None:
            return
        matriz_costos, nombres_origen, nombres_destino = problema_transporte
        asignacion = True
    else:
        problema_transporte = menu_ingresar_transporte()
        if problema_transporte is None:
            return
        matriz_costos, oferta, demanda, nombres_origen, nombres_destino = menu_ingresar_transporte(
        )
        asignacion = False

    if matriz_costos is 0:
        return

    while True:
        clear_screen()
        print("METODOS PARA PROBLEMAS DE TRANSPORTE")
        print("1) Esquina Noroeste")
        print("2) Costo minimo")
        print("3) Aproximacion de Voguel")
        print("4) Método húngaro (Asignacion)")
        print("m) Utilizar otra matriz")
        print("q) Regresar al menu anterior")

        opc = input('¿Qué desea hacer?: ')
        if opc == 'q':
            break
        elif opc == '1' and not asignacion:
            prob_transporte = metodo_esquina_NE(matriz_costos, oferta, demanda,
                                                nombres_origen,
                                                nombres_destino)
            mt.mostrar_problema(prob_transporte)
        elif opc == '2' and not asignacion:
            prob_transporte = metodo_costo_minimo(matriz_costos, oferta,
                                                  demanda, nombres_origen,
                                                  nombres_destino)
            mt.mostrar_problema(prob_transporte)
        elif opc == '3' and not asignacion:
            prob_transporte = metodo_MAV(matriz_costos, oferta, demanda,
                                         nombres_origen, nombres_destino)
            mt.mostrar_problema(prob_transporte)
        elif opc == '4' and asignacion:
            problema_asignacion = metodo_hungaro(matriz_costos, nombres_origen,
                                                 nombres_destino)
            ma.mostrar_problema(problema_asignacion)
        elif opc == 'm':
            opcion = input("¿Desea ingresar un problema de asignacion?(S/n): ")
            if opcion == 'S' or opcion == 'S':
                costos_aux, nombres_origen_aux, nombres_destino_aux = menu_ingresar_transporte(
                    True)
                asignacion = True
            else:
                costos_aux, oferta_aux, demanda_aux, nombres_origen_aux, nombres_destino_aux = menu_ingresar_transporte(
                )
                asignacion = False
            if not (costos_aux is 0) and not asignacion:
                matriz_costos = costos_aux
                oferta = oferta_aux
                demanda = demanda_aux
                nombres_origen = nombres_origen_aux
                nombres_destino = nombres_destino_aux
            else:
                matriz_costos = costos_aux
                nombres_origen = nombres_origen_aux
                nombres_destino = nombres_destino_aux
            continue
        else:
            print('Ingrese una opción válida...')
            input('Presione enter para continuar...')
            continue
    return