Skip to content

Commit 217488f

Browse files
committed
nou operador reduir bicis
1 parent 2a5f6e1 commit 217488f

14 files changed

+135
-79
lines changed
163 Bytes
Binary file not shown.
30 Bytes
Binary file not shown.
655 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
1009 Bytes
Binary file not shown.

benefits.png

16.6 KB
Loading

furgoneta_bicing.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ def __init__(self, id_furgoneta: int, \
88
id_estacion_destino_2: Union[int,None] = None, \
99
bicicletas_cargadas: int = 0, \
1010
bicicletas_descargadas_1: int = 0, \
11-
bicicletas_descargadas_2: int = 0) -> None:
11+
bicicletas_descargadas_2: int = 0, \
12+
reducir_bicicletas_carga: int = 0) -> None:
1213
self.id = id_furgoneta
1314
self.id_est_origen = id_estacion_origen
1415
self.id_est_dest1 = id_estacion_destino_1
1516
self.id_est_dest2 = id_estacion_destino_2
1617
self.bicicletas_cargadas = bicicletas_cargadas
1718
self.bicicletas_descargadas_1 = bicicletas_descargadas_1
1819
self.bicicletas_descargadas_2 = bicicletas_descargadas_2
20+
self.reducir_bicicletas_carga = reducir_bicicletas_carga
1921

2022
def __eq__(self, other: 'Furgoneta') -> bool:
2123
return self.id == other.id \
@@ -24,7 +26,8 @@ def __eq__(self, other: 'Furgoneta') -> bool:
2426
and self.id_est_dest2 == other.id_est_dest2 \
2527
and self.bicicletas_cargadas == other.bicicletas_cargadas \
2628
and self.bicicletas_descargadas_1 == other.bicicletas_descargadas_1 \
27-
and self.bicicletas_descargadas_2 == other.bicicletas_descargadas_2
29+
and self.bicicletas_descargadas_2 == other.bicicletas_descargadas_2 \
30+
and self.reducir_bicicletas_carga == other.reducir_bicicletas_carga
2831

2932
def __repr__(self) -> str:
3033
return f"F[{self.id}]: C={self.id_est_origen} (num={self.bicicletas_cargadas}) | D1={self.id_est_dest1} (num={self.bicicletas_descargadas_1}) | D2={self.id_est_dest2} (num={self.bicicletas_descargadas_2})"
@@ -36,5 +39,6 @@ def copy(self) -> 'Furgoneta':
3639
self.id_est_dest2, \
3740
self.bicicletas_cargadas, \
3841
self.bicicletas_descargadas_1, \
39-
self.bicicletas_descargadas_2)
42+
self.bicicletas_descargadas_2, \
43+
self.reducir_bicicletas_carga)
4044

generate_initial_state_bicing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ def generate_initial_state(opt: int = 0, semilla: Union[int, None] = None, opera
1111
'CambiarEstacionDescarga', \
1212
'IntercambiarEstacionDescarga', \
1313
'QuitarEstacionDescarga', \
14-
'ReasignarFurgoneta'}}) -> EstadoBicing:
14+
'ReasignarFurgoneta', \
15+
'ReducirNumeroBicicletasCarga'}}) -> EstadoBicing:
1516
rng = random.Random(semilla)
1617

1718
n_estaciones = params.n_estaciones

main.py

Lines changed: 84 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ def comparar_resultados(opt: int = 0, iteraciones: int = 10, semilla: Union[int,
1919
'CambiarEstacionDescarga', \
2020
'IntercambiarEstacionDescarga', \
2121
'QuitarEstacionDescarga', \
22-
'ReasignarFurgoneta'}}) -> None:
22+
'ReasignarFurgoneta', \
23+
'ReducirNumeroBicicletasCarga'}}) -> None:
2324

24-
tiempo_default, tiempo_modificado = 0, 0
25+
tiempo_default, tiempo_modificado, soluciones_expandidas_default, soluciones_expandidas_modificado = 0, 0, 0, 0
2526
beneficios_default, beneficios_modificado = [], []
2627
distancias_default, distancias_modificado = [], []
2728
rng = random.Random(semilla)
@@ -32,78 +33,78 @@ def comparar_resultados(opt: int = 0, iteraciones: int = 10, semilla: Union[int,
3233
state1 = generate_initial_state(opt=opt, semilla=seed)
3334
state2 = generate_initial_state(opt=opt, semilla=seed, operadores_activos=operadores_activos)
3435

35-
inici = time.time()
36-
hill_climbing_1 = hill_climbing(ProblemaBicing(initial_state=state1))
37-
tiempo_default += time.time() - inici
36+
problema1 = ProblemaBicing(initial_state=state1)
37+
inici1 = time.time()
38+
hill_climbing_1 = hill_climbing(problema1)
39+
tiempo_default += time.time() - inici1
3840

41+
soluciones_expandidas_default += problema1.solutions_checked
3942
beneficios_default.append(hill_climbing_1.heuristic(coste_transporte=params.coste_transporte))
4043
distancia_total_default = sum([hill_climbing_1.get_distancias_furgoneta(id_f)[2] for id_f in range(params.n_furgonetas)])
4144
distancias_default.append(distancia_total_default)
4245

43-
inici = time.time()
44-
hill_climbing_2 = hill_climbing(ProblemaBicing(initial_state=state2))
45-
tiempo_modificado += time.time() - inici
46+
problema2 = ProblemaBicing(initial_state=state2)
47+
inici2 = time.time()
48+
hill_climbing_2 = hill_climbing(problema2)
49+
tiempo_modificado += time.time() - inici2
4650

51+
soluciones_expandidas_modificado += problema2.solutions_checked
4752
beneficios_modificado.append(hill_climbing_2.heuristic(coste_transporte=params.coste_transporte))
4853
distancia_total_modificado = sum([hill_climbing_2.get_distancias_furgoneta(id_f)[2] for id_f in range(params.n_furgonetas)])
4954
distancias_modificado.append(distancia_total_modificado)
5055

51-
print(f"\nHEURISTIC: {2 if params.coste_transporte else 1} | OPT {opt} | ITERACIONES\n")
52-
print(f"MEDIA DEFECTO: {sum(beneficios_default)/iteraciones} | TIEMPO DEFAULT: {(tiempo_default/iteraciones)*1000} ms | DISTANCIA DEFAULT: {sum(distancias_default)/iteraciones} | VARIANZA BENEF. DEFAULT: {sum([(beneficio - (sum(beneficios_default)/iteraciones))**2 for beneficio in beneficios_default])/iteraciones}")
53-
print(f"MEDIA MODIFICADO: {sum(beneficios_modificado)/iteraciones} | TIEMPO MODIFICADO: {(tiempo_modificado/iteraciones)*1000} ms) | DISTANCIA MODIFICADO: {sum(distancias_modificado)/iteraciones} | VARIANZA BENEF.MODIFICADO: {sum([(beneficio - (sum(beneficios_modificado)/iteraciones))**2 for beneficio in beneficios_modificado])/iteraciones}\n")
56+
print(f"\nHEURISTIC: {2 if params.coste_transporte else 1} | OPT: {opt} | ITERACIONES: {iteraciones}\n")
57+
print(f"MEDIA DEFECTO: {sum(beneficios_default)/iteraciones} | TIEMPO DEFAULT: {(tiempo_default/iteraciones)*1000} ms | Nº = {int(soluciones_expandidas_default/iteraciones)} | DISTANCIA DEFAULT: {sum(distancias_default)/iteraciones} | VARIANZA BENEF. DEFAULT: {sum([(beneficio - (sum(beneficios_default)/iteraciones))**2 for beneficio in beneficios_default])/iteraciones}")
58+
print(f"MEDIA MODIFICADO: {sum(beneficios_modificado)/iteraciones} | TIEMPO MODIFICADO: {(tiempo_modificado/iteraciones)*1000} ms) | Nº = {int(soluciones_expandidas_modificado/iteraciones)} | DISTANCIA MODIFICADO: {sum(distancias_modificado)/iteraciones} | VARIANZA BENEF.MODIFICADO: {sum([(beneficio - (sum(beneficios_modificado)/iteraciones))**2 for beneficio in beneficios_modificado])/iteraciones}\n")
5459

5560
def comparar_operadores(opt: int = 0, iteraciones: int = 10, semilla: Union[int, None] = None, operadores: dict = {operator: True for operator in {'CambiarEstacionCarga', \
5661
'IntercambiarEstacionCarga', \
5762
'CambiarOrdenDescarga', \
5863
'CambiarEstacionDescarga', \
5964
'IntercambiarEstacionDescarga', \
6065
'QuitarEstacionDescarga', \
61-
'ReasignarFurgoneta'}}) -> None:
66+
'ReasignarFurgoneta', \
67+
'ReducirNumeroBicicletasCarga'}}) -> None:
6268

6369
progreso = 0
6470
media_beneficios = []
6571

66-
operadores['CambiarEstacionCarga'] = True
67-
for _ in range(2):
68-
operadores['IntercambiarEstacionCarga'] = True
69-
for _ in range(2):
70-
operadores['CambiarOrdenDescarga'] = True
71-
for _ in range(2):
72-
operadores['CambiarEstacionDescarga'] = True
73-
for _ in range(2):
74-
operadores['IntercambiarEstacionDescarga'] = True
75-
for _ in range(2):
76-
operadores['QuitarEstacionDescarga'] = True
77-
for _ in range(2):
78-
operadores['ReasignarFurgoneta'] = True
79-
for _ in range(2):
80-
progreso += 1
81-
print(f"PROGRESO: {(progreso/128)*100}%")
82-
83-
beneficios_tmp = []
84-
tiempo, soluciones_expandidas = 0, 0
85-
rng = random.Random(semilla)
86-
for _ in range(iteraciones):
87-
seed = rng.randint(0, 1_000_000)
72+
for val8 in [True, False]:
73+
operadores['ReducirNumeroBicicletasCarga'] = val8
74+
for val7 in range(2):
75+
operadores['CambiarEstacionCarga'] = val7
76+
for val6 in range(2):
77+
operadores['IntercambiarEstacionCarga'] = val6
78+
for val5 in range(2):
79+
operadores['CambiarOrdenDescarga'] = val5
80+
for val4 in range(2):
81+
operadores['CambiarEstacionDescarga'] = val4
82+
for val3 in range(2):
83+
operadores['IntercambiarEstacionDescarga'] = val3
84+
for val2 in range(2):
85+
operadores['QuitarEstacionDescarga'] = val2
86+
for val1 in range(2):
87+
operadores['ReasignarFurgoneta'] = val1
8888

89-
state = generate_initial_state(opt=opt, semilla=seed, operadores_activos=operadores)
89+
progreso += 1
90+
print(f"PROGRESO: {(progreso/256)*100}%")
9091

91-
problema = ProblemaBicing(initial_state=state)
92-
inici = time.time()
93-
hill_climbing_1 = hill_climbing(problema)
94-
tiempo += time.time() - inici
95-
soluciones_expandidas += problema.solutions_checked
96-
beneficios_tmp.append(hill_climbing_1.heuristic(coste_transporte=params.coste_transporte))
97-
98-
media_beneficios.append((sum(beneficios_tmp)/iteraciones, tiempo/iteraciones, int(soluciones_expandidas/iteraciones), {k: v for k, v in operadores.items()}))
99-
100-
operadores['ReasignarFurgoneta'] = False
101-
operadores['QuitarEstacionDescarga'] = False
102-
operadores['IntercambiarEstacionDescarga'] = False
103-
operadores['CambiarEstacionDescarga'] = False
104-
operadores['CambiarOrdenDescarga'] = False
105-
operadores['IntercambiarEstacionCarga'] = False
106-
operadores['CambiarEstacionCarga'] = False
92+
beneficios_tmp = []
93+
tiempo, soluciones_expandidas = 0, 0
94+
rng = random.Random(semilla)
95+
for _ in range(iteraciones):
96+
seed = rng.randint(0, 1_000_000)
97+
98+
state = generate_initial_state(opt=opt, semilla=seed, operadores_activos=operadores)
99+
100+
problema = ProblemaBicing(initial_state=state)
101+
inici = time.time()
102+
hill_climbing_1 = hill_climbing(problema)
103+
tiempo += time.time() - inici
104+
soluciones_expandidas += problema.solutions_checked
105+
beneficios_tmp.append(hill_climbing_1.heuristic(coste_transporte=params.coste_transporte))
106+
107+
media_beneficios.append((sum(beneficios_tmp)/iteraciones, tiempo/iteraciones, int(soluciones_expandidas/iteraciones), {k: v for k, v in operadores.items()}))
107108

108109
media_beneficios.sort(key=lambda x: x[0])
109110

@@ -120,7 +121,7 @@ def comparar_operadores(opt: int = 0, iteraciones: int = 10, semilla: Union[int,
120121
values = ['T' if v else 'F' for v in exp[3].values()]
121122
print(f"B: {exp[0]} | T: {exp[1]*1000} ms | Nº: {exp[2]} | OP: {values}\n")
122123

123-
print(f"OPT: {opt} | ITERACIONES: {iteraciones} | HEURISTIC: {2 if params.coste_transporte else 1} | SEMILLA: {semilla}\n")
124+
print(f"OPT: {opt} | ITERACIONES: {iteraciones} | HEURÍSTICO: {2 if params.coste_transporte else 1} | SEMILLA: {semilla}\n")
124125

125126
def mejor_initial_state(initial_strategies: list = [0, 1, 2], iteraciones: int = 10) -> None:
126127
results_accumulated = {strategy: 0 for strategy in initial_strategies}
@@ -149,11 +150,11 @@ def mejor_initial_state(initial_strategies: list = [0, 1, 2], iteraciones: int =
149150
if __name__ == "__main__":
150151

151152
# Experimento
152-
"""tiempo_inicio = time.time()
153-
initial_state: EstadoBicing = generate_initial_state(opt=2)
153+
"""initial_state: EstadoBicing = generate_initial_state(opt=2)
154+
initial_state.heuristic(coste_transporte=params.coste_transporte)
154155
problema_bicing = ProblemaBicing(initial_state)
156+
tiempo_inicio = time.time()
155157
final_solution_HC = hill_climbing(problema_bicing)
156-
initial_state.heuristic(coste_transporte=params.coste_transporte)
157158
tiempo_final = time.time()
158159
159160
initial_state.print_state(inicial=True)
@@ -170,23 +171,41 @@ def mejor_initial_state(initial_strategies: list = [0, 1, 2], iteraciones: int =
170171
'CambiarEstacionDescarga': True, \
171172
'IntercambiarEstacionDescarga': True, \
172173
'QuitarEstacionDescarga': True, \
173-
'ReasignarFurgoneta': True}
174+
'ReasignarFurgoneta': True, \
175+
'ReducirNumeroBicicletasCarga': False}
174176

175177
comparar_resultados(opt=2, iteraciones=100, operadores_activos=operadores_experimento)
176-
#comparar_operadores(opt=1, semilla=random.randint(0, 1_000_000), iteraciones=100)
178+
#comparar_operadores(opt=2, semilla=random.randint(0, 1_000_000), iteraciones=100)
177179
#mejor_initial_state(iteraciones=100)
178180

179181
# Obtener estadísticas y generar un box plot
180-
"""times_hill_climbing = [timeit(lambda: hill_climbing(problema_bicing), number=1) for _ in range(15)]
181-
times_simulated_annealing = [timeit(lambda: simulated_annealing(problema_bicing), number=1) for _ in range(15)]
182+
"""iterations_plot = 100
183+
initial_state = generate_initial_state(opt=2)
184+
initial_state.heuristic(coste_transporte=params.coste_transporte)
185+
problema_bicing = ProblemaBicing(initial_state)
186+
times_hill_climbing = [timeit(lambda: hill_climbing(problema_bicing), number=1) for _ in range(iterations_plot)]
187+
benefits_hill_climbing = [hill_climbing(problema_bicing).heuristic(coste_transporte=params.coste_transporte) for _ in range(iterations_plot)]
188+
#times_simulated_annealing = [timeit(lambda: simulated_annealing(problema_bicing), number=1) for _ in range(15)]
182189
183-
data_to_plot = [times_hill_climbing, times_simulated_annealing]
184-
labels=['hill_climbing', 'simulated_annealing']
190+
times_to_plot = [times_hill_climbing]
191+
#times_to_plot = [times_hill_climbing, times_simulated_annealing]
192+
labels=['Hill Climbing']
193+
#labels=['hill_climbing', 'simulated_annealing']
185194
186-
plt.boxplot(data_to_plot, labels=labels)
187-
plt.ylabel('Tiempo de ejecución (s)')
188-
plt.title('Comparativa de Hill Climning y Simulated Annealing con Boxplots')
189-
plt.savefig('test.png')"""
195+
plt.boxplot(times_hill_climbing, labels=labels)
196+
plt.ylabel('Tiempo de ejecución (ms)')
197+
plt.title('Resultados Hill Climbing (100 iteraciones)')
198+
#plt.title('Comparativa de Hill Climning y Simulated Annealing con Boxplots')
199+
plt.savefig('times.png')
200+
201+
benefits_to_plot = [benefits_hill_climbing]
202+
plt.boxplot(benefits_hill_climbing, labels=labels)
203+
plt.ylabel('Beneficio total (€)')
204+
plt.title('Resultados Hill Climbing (100 iteraciones)')
205+
#plt.title('Comparativa de Hill Climbing y Simulated Annealing con Boxplots')
206+
plt.savefig('benefits.png')"""
207+
208+
190209

191210
# Obtener estadísticas y generar un line plot
192211
"""hill_climbing_value = None # HEM DE FER QUE HILL CLIMBING VALUE --> returns a list of objective function values over iterations:

operators_bicing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,11 @@ def __init__(self, id_furgoneta: int, id_est_origen: int, id_est_dest1: int, id_
8383
self.id_est_dest1 = id_est_dest1
8484
self.id_est_dest2 = id_est_dest2
8585

86+
87+
class ReducirNumeroBicicletasCarga(BicingOperator):
88+
"""
89+
Operador que reduce el número de bicicletas de una estación de carga.
90+
"""
91+
def __init__(self, id_furgoneta: int, reducir_bicicletas_carga: bool) -> None:
92+
self.id_furgoneta = id_furgoneta
93+
self.reducir_bicicletas_carga = reducir_bicicletas_carga

0 commit comments

Comments
 (0)