Skip to content

Genopt is a high level framework that helps optimizing functions using the power of genetic algorithms.

License

Notifications You must be signed in to change notification settings

unaiLopez/genopt

Repository files navigation

alt text

Genopt: A genetic algorithm powered hyperparameter optimization framework

Python pypi License

Genopt is a high level framework that helps optimizing functions using the power of genetic algorithms.

1. Installation

Genopt is available at PyPI

$ pip install genopt

2. Quickstart

2.1. Define Search Space

2.1.1. Fixed Search Space

#defining a fixed set of Parameters for 4 variables
params = {
    'x': [35, -51, 0, 1, 2, 3, 4, 66, 11, 50, 90],
    'y': [-100, -51, 0, 7, 32, 31, 4, 51, 121, 50, 90, 1000, 231]
    'z': [-10, -51, 0, 12, 2, 43, 43, 5, 1231, 50, 90],
    'k': [-56, -51, 0, 1, 2, 13, 4, 5, 11, 50, 90]
}

2.1.2. Flexible Search Space

from genopt.parameters import Parameters

#defining a 4 variable search space of float values from -100.0 to 100.0
params = {
    'x': Parameters.suggest_float(-100, 100),
    'y': Parameters.suggest_float(-100, 100),
    'z': Parameters.suggest_float(-100, 100),
    'k': Parameters.suggest_float(-100, 100)
}

2.2. Define Single-Objective Function

#defining an objective function
def objective(individual):
    x = individual['x']
    y = individual['y']
    z = individual['z']
    k = individual['k']
    
    return (x**2 - 4*y**3 / z**4) * k**3

2.3. Define Multi-Objective Function

#defining an objective function
def objective(individual):
    x = individual['x']
    y = individual['y']
    z = individual['z']
    k = individual['k']

    objective_1 = ((x**2 - 4*y**3 / z**4) * k**3)
    objective_2 = (k**3 / x)

    return objective_1, objective_2

2.4. Start Optimization for Single-Objective Function and Default Parameters

from genopt.environment import Environment

if __name__ == '__main__':
    #defining our Environment instance with a population of 100 individuals,
    #roulette selection for 50% of the population, one-point crossover, 
    #a single gene mutation with 10% probability of mutation,
    #10% elite rate, some verbose and without a seed for reproducibility
    environment = Environment(
        params=params
    )
    #minimizing the objective function and adding a 60 seconds timeout
    #as an stop criteria and a single core execution (n_jobs=1)
    results = environment.optimize(
        objective=objective,
        direction='minimize',
        timeout=60
    )

2.5. Start Optimization for Single-Objective Function and Custom Parameters

from genopt.environment import Environment

if __name__ == '__main__':
    #defining our Environment instance with a population of 100 individuals,
    #tournament selection for 80% of the population, one-point crossover, 
    #a single gene mutation with 25% probability of mutation, some verbose and a seed for reproducibility
    environment = Environment(
        params=params,
        num_population=100,
        selection_type='tournament',
        selection_rate=0.8,
        crossover_type='one-point',
        mutation_type='single-gene',
        prob_mutation=0.25,
        verbose=1,
        random_state=42
    )
    #minimizing the objective function and adding 
    #3 stop criterias (num_generations, timeout, stop_score)
    results = environment.optimize(
        objective=objective,
        direction='minimize',
        num_generations=9999,
        timeout=60,
        stop_score=-np.inf
    )

2.6. Start Optimization for Multi-Objective Function and Custom Parameters

from genopt.environment import Environment

if __name__ == '__main__':
    #defining our Environment instance with a population of 100 individuals,
    #ranking selection for 70% of the population, one-point crossover,
    #a single gene mutation with 25% probability of mutation, some verbose and a seed for reproducibility
    environment = Environment(
        params=params,
        num_population=100,
        selection_type='ranking',
        selection_rate=0.7,
        crossover_type='one-point',
        mutation_type='single-gene',
        prob_mutation=0.25,
        verbose=1,
        random_state=42
    )
    #minimizing the first value and maximazing the second value of the objective function,
    #adding 1 stop criterias (timeout), adding 50% weight to each objective and
    #assigning a name to each objective score for the final dataframe
    results = environment.optimize(
        objective=objective,
        direction=['minimize', 'maximize'],
        weights=[0.5, 0.5],
        timeout=60,
        score_names=['complex_equation_score', 'simple_equation_score']
    )

2.7. Show Optimization Results

print(f'EXECUTION TIME={results.execution_time}')
print(f'BEST SCORE={results.best_score}')
print(f'BEST INDIVIDUAL={results.best_individual}')
print('BEST PER GENERATION:')
print(results.best_per_generation_dataframe)
print('LAST GENERATION INDIVIDUALS:')
print(results.last_generation_individuals_dataframe)

About

Genopt is a high level framework that helps optimizing functions using the power of genetic algorithms.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published