File size: 8,286 Bytes
6d78255 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
import streamlit as st
# ######################
# Configuración de página
# ######################
st.set_page_config(
page_title="LupercAI",
page_icon= "🚛",
layout="centered", #"wide" or "centered"
initial_sidebar_state="collapsed", #"auto" or "expanded" or "collapsed"
menu_items={
'Get Help': "https://www.inta.es/INTA/es/index.html",
'Report a bug': "https://www.inta.es/INTA/es/index.html",
'About': "Si necesitas ayuda, puedes dirigirte a *[email protected]*."
}
)
######################
# Page Title
######################
if "alg_genetico" in st.session_state: del st.session_state["alg_genetico"]
st.title("LupercAI 🚛")
st.header("Entrada de archivos")
import pandas as pd
tab1, tab2 = st.tabs(["Excel", "Manual"])
with tab1:
uploaded_file = st.file_uploader("Elige un archivo", accept_multiple_files=False, type=["xlsx"], help="Solo acepta excel")
if uploaded_file is not None:
st.write(uploaded_file.name)
datos = pd.read_excel(uploaded_file, sheet_name=None)
nombres_hojas = list(datos.keys())
if "Distancias" not in nombres_hojas or "Demandas_clientes" not in nombres_hojas or "Capacidad_vehiculos" not in nombres_hojas:
st.error("Falta una hoja", icon = "❌")
else:
#names permite añadir nombres, si no pandas añade directamente int desde 0.
valores = dict()
for hoja in ["Num_nodos", "Distancias", "Demandas_clientes", "Num_vehiculos", "Capacidad_vehiculos"]: # Usa 'openpyxl' como motor para leer archivos xlsx
#dataframe = pd.read_excel('6. Algoritmo genético.py\Datos.xlsx', sheet_name= hoja, header=None, names=[]) #Si el archivo estuviera en la carpeta, no cargado
if hoja in nombres_hojas:
dataframe = pd.read_excel(uploaded_file, engine='openpyxl', sheet_name=hoja, header=None, names=[])
matriz = dataframe.values.tolist()
valores[hoja] = matriz
if "Num_nodos" in nombres_hojas: num_nodos = valores["Num_nodos"][0][0]
distancias = valores["Distancias"]
demandas_clientes = [valor[0] for valor in valores["Demandas_clientes"]]
if "Num_vehiculos" in nombres_hojas: num_vehiculos = valores["Num_vehiculos"][0][0]
capacidad_vehiculos = [valor[0] for valor in valores["Capacidad_vehiculos"]]
with tab2:
left_column, right_column = st.columns(2)
with left_column:
form1 = st.form("Grafo")
num_nodosB = form1.number_input('Número de paradas', value = 1, help="Incluye el almacén")
form1.form_submit_button("OK")
st.subheader("Demandas")
form2 = st.form("Demanda de cada parada")
demandas_clientesB = []
demandas_clientesB.append(form2.number_input('Demanda del Almacén', value = 0, max_value=0, min_value=0))
for i in range(1, num_nodosB):
demandas_clientesB.append(form2.number_input('Demanda de la parada ' + str(i), value = 1))
boton2 = form2.form_submit_button("OK")
if boton2:
form2.success("Demandas actualizado")
with right_column:
form3 = st.form("número de vehiculos")
num_vehiculosB = form3.number_input('Número de vehiculos', value = 1)
form3.form_submit_button("OK")
st.subheader("Vehiculos")
form4 = st.form("Carga de vehiculos")
capacidad_vehiculosB = []
for i in range(1, num_vehiculosB + 1):
capacidad_vehiculosB.append(form4.number_input('Carga del vehiculo ' + str(i), value = 1))
boton4 = form4.form_submit_button("OK")
if boton4:
form4.success("Cargas actualizado")
st.subheader("Distancias")
form5 = st.form("Distancias")
data_inicial = [dict([(str(i),None) for i in range(num_nodosB)])] * num_nodosB #los elementos están vinculados
data_df = pd.DataFrame(data_inicial)
for i in range(num_nodosB): data_df[str(i)][i] = 0
edited_df = form5.data_editor(data_df)
(fila, columna) = (0, 0)
favorite_command = edited_df[str(columna)][fila]
form5.write(f"Fila {fila} Columna {columna}: **{favorite_command}** ")
distanciasB = edited_df.values.tolist()
boton5 = form5.form_submit_button("OK")
if boton5:
form5.success("Distancias actualizado")
if boton2 or boton4 or boton5:
uploaded_file = None
if uploaded_file == None:
num_nodos = num_nodosB
distancias = distanciasB
demandas_clientes = demandas_clientesB
num_vehiculos = num_vehiculosB
capacidad_vehiculos = capacidad_vehiculosB
st.header("Variables genéticas")
chosen = st.radio(
'¿Desea incluir alguna variable genética?',
("Variables predefinidas", "Escoger variables"),
0)
if not chosen == "Escoger variables":
st.session_state["activar_generaciones"] = False
else:
c1, c2, c3 = st.columns(3)
with c1:
tamano_poblacion_bool = st.checkbox('Tamaño poblacion')
tamano_poblacion = 50
if tamano_poblacion_bool: tamano_poblacion = st.number_input('Tamaño poblacion', value = 50, min_value = 1, label_visibility = "hidden")
tamano_torneo_bool = st.checkbox('Tamaño torneo')
tamano_torneo = 5
if tamano_torneo_bool: tamano_torneo = st.number_input('Tamaño poblacion', value = 5, min_value = 1,
help = 'El tamaño del torneo debe ser menor al tamaño de la población', label_visibility = "hidden")
if tamano_poblacion <= tamano_torneo:
st.warning('El tamaño del torneo debe ser menor al tamaño de la población.', icon="⚠️")
tamano_torneo = 1
with c2:
generaciones_bool = st.checkbox('Generaciones')
generaciones = 100
if generaciones_bool: generaciones = st.number_input('Generaciones', value = 100, min_value = 1, label_visibility = "hidden")
st.session_state['generaciones'] = generaciones
with c3:
crossover_prob_bool = st.checkbox('Probabilidad de cruce')
crossover_prob = 0.8
if crossover_prob_bool: crossover_prob = st.number_input('Probabilidad de cruce', value = 0.8, min_value = 0.0, max_value = 1.0, label_visibility = "hidden")
mutation_prob_bool = st.checkbox('Probabilidad de mutación')
mutation_prob = 0.2
if mutation_prob_bool: mutation_prob = st.number_input('Probabilidad de mutación', value = 0.2, min_value = 0.0, max_value = 1.0, label_visibility = "hidden")
if tamano_poblacion_bool or tamano_torneo_bool or generaciones_bool or crossover_prob_bool or mutation_prob_bool:
st.session_state["activar_generaciones"] = True
st.session_state["tamano_poblacion"] = tamano_poblacion
st.session_state["tamano_torneo"] = tamano_torneo
st.session_state["generaciones"] = generaciones
st.session_state["crossover_prob"] = crossover_prob
st.session_state["mutation_prob"] = mutation_prob
else:
st.session_state["activar_generaciones"] = False
st.header("Guardar")
boton = st.button("¿Guardar variables?", type="primary")
if boton:
if distancias == None or demandas_clientes == None or capacidad_vehiculos == None: st.error(f"Falta un valor fundamental")
elif len(distancias) != len(demandas_clientes): st.error(f"Distancias: {distancias} no coincide con Demandas: {demandas_clientes}")
else:
st.session_state["distancias"] = distancias
st.session_state["demandas_clientes"] = demandas_clientes
st.session_state["capacidad_vehiculos"] = capacidad_vehiculos
if num_nodos != None:
if num_nodos != len(distancias): st.warning(f"Número de paradas: {num_nodos} no coincide con Distancias: {distancias}")
else: st.session_state["num_nodos"] = num_nodos
if num_vehiculos != None:
if num_vehiculos != len(capacidad_vehiculos): st.warning(f"Número de vehiculos: {num_vehiculos} no coincide con Cargas Vehiculos: {capacidad_vehiculos}")
else: st.session_state["num_vehiculos"] = num_vehiculos
st.success(f"Valores actualizados") |