Skip to main content

Genopt: optimization with genetic algorithms

Project description

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)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

genopt-0.9.15.tar.gz (12.6 kB view hashes)

Uploaded Source

Built Distribution

genopt-0.9.15-py2.py3-none-any.whl (13.7 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page