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")
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
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
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()
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
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...")
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...")
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...')
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()
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...')
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
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...')
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
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)
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
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()
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
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
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
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