diff --git a/src/config.py b/src/config.py index 658afc3bd20c4d2d426e6a6ba6bae825676541bc..74eb97348c30acf608080c7d6e2fe520976c237d 100644 --- a/src/config.py +++ b/src/config.py @@ -18,9 +18,9 @@ MODEL_FILE = f"{MODEL_NAME}.mo" MODEL_PATH = os.path.join(os.getcwd(), MODEL_FILE) SIMULATION_STOP_TIME = 3000 # in seconds -# Parameters and result variables +# Parameters to be varied and objectives to be optimized PARAMETERS = ["Q_max", "T_set"] -RESULTS = ["energy", "comfort"] +OBJECTIVES = ["energy", "comfort"] MAXIMIZE = ["comfort"] # List of objectives to maximize # Parameter range @@ -32,6 +32,13 @@ PARAM_BOUNDS = { # Results precision PRECISION = 2 # decimal places +# Optimization settings +OPTIMIZATION_CONFIG = { + "ALGORITHM_NAME": 'NSGA2', # Algorithm selection + "POP_SIZE": 100, # Population size for algorithm + "N_GEN": 50 # Number of generations +} + # Plot configurations PLOT_CONFIG = { "PLOT_X": "Energy Consumption", @@ -39,15 +46,6 @@ PLOT_CONFIG = { "PLOT_TITLE": "Pareto Front of Energy Consumption vs Comfort" } -# Algorithm selection -# Options: 'pymoo.NSGA2', 'pymoo.NSGA3', 'pymoo.CMAES', 'scipy.de', 'scipy.minimize' -OPTIMIZATION_LIBRARY = 'pymoo' -ALGORITHM_NAME = 'NSGA2' - -# Optimization settings -POP_SIZE = 50 # Population size for NSGA2 -N_GEN = 100 # Number of generations - # Parallel processing N_JOBS = -1 # Options: '-1', '1', 'n', 'None' # ==================================================================== diff --git a/src/optimize_main.py b/src/optimize_main.py index 5aabd7c3b7349d58438b417a83a4af99e05acf37..0e77a00f730661748049745e63b4a80443c416dd 100644 --- a/src/optimize_main.py +++ b/src/optimize_main.py @@ -14,21 +14,21 @@ from pymoo.core.problem import Problem from pymoo.optimize import minimize from optimization_libraries import initialize_algorithm from parallel_computing import optimization_function, cleanup_temp_dirs -from config import (PARAMETERS, RESULTS, PARAM_BOUNDS, PRECISION, PLOT_CONFIG, - OPTIMIZATION_LIBRARY, ALGORITHM_NAME, POP_SIZE, N_GEN, N_JOBS, MAXIMIZE) # Import all configuration variables +from config import (PARAMETERS, OBJECTIVES, MAXIMIZE, PARAM_BOUNDS, PRECISION, PLOT_CONFIG, + OPTIMIZATION_CONFIG, N_JOBS) # Import all configuration variables class OptimizationProblem(Problem): def __init__(self): self.param_names = list(PARAM_BOUNDS.keys()) - self.result_names = RESULTS - self.maximize_indices = [self.result_names.index(res) for res in MAXIMIZE] + self.objective_names = OBJECTIVES + self.maximize_indices = [self.objective_names.index(res) for res in MAXIMIZE] n_var = len(self.param_names) xl = np.array([PARAM_BOUNDS[param][0] for param in self.param_names]) xu = np.array([PARAM_BOUNDS[param][1] for param in self.param_names]) print(f"Number of variables: {n_var}") print(f"Lower bounds: {xl}") print(f"Upper bounds: {xu}") - super().__init__(n_var=n_var, n_obj=len(RESULTS), n_constr=0, xl=xl, xu=xu) + super().__init__(n_var=n_var, n_obj=len(OBJECTIVES), n_constr=0, xl=xl, xu=xu) def _evaluate(self, X, out, *args, **kwargs): param_values_list = [dict(zip(self.param_names, x)) for x in X] @@ -43,14 +43,17 @@ class OptimizationProblem(Problem): out["F"] = np.array(results) # Ensure results are a 2D array # Initialize the optimization algorithm -algorithm = initialize_algorithm(OPTIMIZATION_LIBRARY, ALGORITHM_NAME, POP_SIZE) +algorithm = initialize_algorithm( + OPTIMIZATION_CONFIG['ALGORITHM_NAME'], + OPTIMIZATION_CONFIG.get('POP_SIZE') + ) # Define the optimization problem problem = OptimizationProblem() try: # Run the optimization - res = minimize(problem, algorithm, ("n_gen", N_GEN), verbose=True) + res = minimize(problem, algorithm, ("n_gen", OPTIMIZATION_CONFIG['N_GEN']), verbose=True) finally: # Cleanup temporary directories cleanup_temp_dirs() @@ -65,7 +68,7 @@ for i, result in enumerate(res.F): result = tuple(result) print(f"Solution {i}: ", end="") - for name, value in zip(RESULTS, result): + for name, value in zip(OBJECTIVES, result): print(f"{name.capitalize()} = {value:.{PRECISION}f}", end=", ") print()