Skip to content

Create function_optimization.py #11611

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 43 commits into from
Closed
Changes from 41 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1c8c133
Create function_optimization.py
night-spring Oct 1, 2024
a91b8d8
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
8176e0e
Update function_optimization.py
night-spring Oct 1, 2024
da593c4
Merge branch 'master' of https://github.com/night-spring/Python
night-spring Oct 1, 2024
3864de9
Update function_optimization.py
night-spring Oct 1, 2024
1ad1867
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
f7bc96e
Update function_optimization.py
night-spring Oct 1, 2024
70f4771
Merge branch 'master' of https://github.com/night-spring/Python
night-spring Oct 1, 2024
5d82115
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
b740c01
Update function_optimization.py
night-spring Oct 1, 2024
d28af66
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
78c8dd7
Update function_optimization.py
night-spring Oct 1, 2024
854b155
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
fa726e6
Update function_optimization.py
night-spring Oct 1, 2024
08ab755
Merge branch 'master' of https://github.com/night-spring/Python
night-spring Oct 1, 2024
ad01c9c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
b761f25
Update function_optimization.py
night-spring Oct 1, 2024
f4a4831
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
eb27d35
Update function_optimization.py
night-spring Oct 1, 2024
19d5420
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 1, 2024
e51da64
.
night-spring Oct 2, 2024
0feb04c
Update genetic_algorithm_optimization.py
night-spring Oct 2, 2024
162792e
Update genetic_algorithm_optimization.py
night-spring Oct 2, 2024
b093145
Update genetic_algorithm_optimization.py
night-spring Oct 2, 2024
7f8befa
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2024
0697e97
Update genetic_algorithm_optimization.py
night-spring Oct 4, 2024
cd4f6f3
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2024
282b6c6
Update genetic_algorithm_optimization.py
night-spring Oct 4, 2024
85fc983
Update genetic_algorithm_optimization.py
night-spring Oct 4, 2024
11876c9
Update genetic_algorithm_optimization.py
night-spring Oct 4, 2024
cabb35a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2024
961e1a4
Merge branch 'TheAlgorithms:master' into master
night-spring Oct 4, 2024
6dd4159
Merge branch 'TheAlgorithms:master' into master
night-spring Oct 4, 2024
ccbf8a5
Update genetic_algorithm_optimization.py
night-spring Oct 5, 2024
8661150
Update genetic_algorithm_optimization.py
night-spring Oct 5, 2024
3a654c5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 5, 2024
1873f2f
Update genetic_algorithm_optimization.py
night-spring Oct 5, 2024
40e4e3c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 5, 2024
5ff30a6
Update genetic_algorithm_optimization.py
night-spring Oct 5, 2024
0b06dae
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 5, 2024
796d80b
Update genetic_algorithm_optimization.py
night-spring Oct 5, 2024
57feaea
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 5, 2024
096a033
Update genetic_algorithm_optimization.py
night-spring Oct 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions genetic_algorithm/genetic_algorithm_optimization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
from collections.abc import Callable # Sorted import
import numpy as np # Sorted import

class GeneticAlgorithmOptimizer:

Check failure on line 4 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (I001)

genetic_algorithm/genetic_algorithm_optimization.py:1:1: I001 Import block is un-sorted or un-formatted
def __init__(
self,
objective_function: Callable[..., float],

Check failure on line 7 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W291)

genetic_algorithm/genetic_algorithm_optimization.py:7:50: W291 Trailing whitespace
variable_bounds: list[tuple[float, float]],

Check failure on line 8 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W291)

genetic_algorithm/genetic_algorithm_optimization.py:8:52: W291 Trailing whitespace
population_size: int = 100,
max_generations: int = 500,
crossover_probability: float = 0.9,
mutation_probability: float = 0.01,
) -> None:
self.objective_function = objective_function
self.variable_bounds = np.array(variable_bounds)
self.population_size = population_size
self.max_generations = max_generations
self.crossover_probability = crossover_probability
self.mutation_probability = mutation_probability
self.num_variables = len(variable_bounds)
self.rng = np.random.default_rng() # Initialize random generator

def generate_initial_population(self) -> np.ndarray:
"""
Generate a population of random solutions within the given variable bounds.
"""
return self.rng.uniform(
low=self.variable_bounds[:, 0],
high=self.variable_bounds[:, 1],
size=(self.population_size, self.num_variables),
)

def evaluate_fitness(self, individual: list[float]) -> float:
"""
Evaluate the fitness of an individual by computing the value of the objective function.

Check failure on line 35 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/genetic_algorithm_optimization.py:35:89: E501 Line too long (95 > 88)
"""
return self.objective_function(*individual)

def select_parent(
self, population: np.ndarray, fitness_values: np.ndarray
) -> np.ndarray:
"""
Select a parent using tournament selection based on fitness values.
"""
selected_indices = self.rng.choice(
range(self.population_size), size=2, replace=False
)
return population[selected_indices[np.argmin(fitness_values[selected_indices])]]

def perform_crossover(
self, parent1: np.ndarray, parent2: np.ndarray
) -> tuple[np.ndarray, np.ndarray]:
"""
Perform one-point crossover between two parents to create offspring.
"""
if self.num_variables == 1:
return parent1, parent2

if self.rng.random() < self.crossover_probability:
crossover_point = self.rng.integers(1, self.num_variables)
child1 = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))

Check failure on line 61 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/genetic_algorithm_optimization.py:61:89: E501 Line too long (91 > 88)
child2 = np.concatenate((parent2[:crossover_point], parent1[crossover_point:]))

Check failure on line 62 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/genetic_algorithm_optimization.py:62:89: E501 Line too long (91 > 88)
return child1, child2
return parent1, parent2

def apply_mutation(self, individual: np.ndarray) -> np.ndarray:
"""
Apply mutation to an individual based on the mutation probability.
"""
if self.rng.random() < self.mutation_probability:
mutation_index = self.rng.integers(0, self.num_variables)
individual[mutation_index] = self.rng.uniform(
self.variable_bounds[mutation_index, 0],
self.variable_bounds[mutation_index, 1]
)
return individual

def optimize(self) -> tuple[np.ndarray, float]:
"""
Execute the genetic algorithm over a number of generations to find the optimal solution.

Check failure on line 80 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/genetic_algorithm_optimization.py:80:89: E501 Line too long (96 > 88)
"""
population = self.generate_initial_population()
best_solution = None
best_fitness_value = float("inf")

for generation in range(self.max_generations):
fitness_values = np.array(
[self.evaluate_fitness(individual) for individual in population]
)

new_population = []
for _ in range(self.population_size // 2):
parent1 = self.select_parent(population, fitness_values)
parent2 = self.select_parent(population, fitness_values)
child1, child2 = self.perform_crossover(parent1, parent2)
child1 = self.apply_mutation(child1)
child2 = self.apply_mutation(child2)
new_population.extend([child1, child2])

population = np.array(new_population)

# Track the best solution
min_fitness_index = np.argmin(fitness_values)
if fitness_values[min_fitness_index] < best_fitness_value:
best_fitness_value = fitness_values[min_fitness_index]
best_solution = population[min_fitness_index]

print(f"Generation {generation + 1}, Best Fitness Value: {best_fitness_value}")

Check failure on line 108 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/genetic_algorithm_optimization.py:108:89: E501 Line too long (91 > 88)

return best_solution, best_fitness_value

if __name__ == "__main__":
def objective_function(x: float, y: float) -> float:
"""
Example objective function to minimize x^2 + y^2
"""
return x**2 + y**2

variable_bounds: list[tuple[float, float]] = [(-10, 10), (-10, 10)]

optimizer = GeneticAlgorithmOptimizer(
objective_function=objective_function,

Check failure on line 122 in genetic_algorithm/genetic_algorithm_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W291)

genetic_algorithm/genetic_algorithm_optimization.py:122:47: W291 Trailing whitespace
variable_bounds=variable_bounds
)
best_solution, best_fitness_value = optimizer.optimize()

print("Best Solution:", best_solution)
print("Best Fitness Value:", best_fitness_value)
Loading