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")