Skip to content
Closed
Changes from all commits
Commits
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
123 changes: 123 additions & 0 deletions genetic_algorithm/function_optimization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import numpy as np

def parse_function(user_input):

Check failure on line 3 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (I001)

genetic_algorithm/function_optimization.py:1:1: I001 Import block is un-sorted or un-formatted

Check failure on line 3 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (I001)

genetic_algorithm/function_optimization.py:1:1: I001 Import block is un-sorted or un-formatted
"""
Convert user input from f(x, y) = ... to a valid Python function.

Check failure on line 6 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:6:1: W293 Blank line contains whitespace

Check failure on line 6 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:6:1: W293 Blank line contains whitespace
Parameters:
user_input (str): A string representing the user-defined fitness function.

Check failure on line 9 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:9:1: W293 Blank line contains whitespace

Check failure on line 9 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:9:1: W293 Blank line contains whitespace
Returns:
str: A string of valid Python code for the fitness function.

Check failure on line 12 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:12:1: W293 Blank line contains whitespace

Check failure on line 12 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:12:1: W293 Blank line contains whitespace
Raises:
ValueError: If the input format is invalid.

Check failure on line 15 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:15:1: W293 Blank line contains whitespace

Check failure on line 15 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:15:1: W293 Blank line contains whitespace
Examples:
>>> parse_function("f(x, y) = x^2 + y^2")
'def fitness(x):\\n return x[0]**2 + x[1]**2\\n'
>>> parse_function("f(x, y) = x^2 - y^2")
'def fitness(x):\\n return x[0]**2 - x[1]**2\\n'
>>> parse_function("f(x, y) = x + y")
'def fitness(x):\\n return x[0] + x[1]\\n'
"""
user_input = user_input.strip()
if "=" in user_input:
_, expression = user_input.split("=", 1)
expression = expression.strip()
else:
raise ValueError("Invalid function format. Please use 'f(x, y) = ...'.")

Check failure on line 30 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:30:1: W293 Blank line contains whitespace

Check failure on line 30 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:30:1: W293 Blank line contains whitespace
function_code = f"def fitness(x):\n"

Check failure on line 31 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (F541)

genetic_algorithm/function_optimization.py:31:21: F541 f-string without any placeholders

Check failure on line 31 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (F541)

genetic_algorithm/function_optimization.py:31:21: F541 f-string without any placeholders
function_code += f" return {expression.replace('^', '**').replace('x', 'x[0]').replace('y', 'x[1]')}\n"

Check failure on line 32 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/function_optimization.py:32:89: E501 Line too long (110 > 88)

Check failure on line 32 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/function_optimization.py:32:89: E501 Line too long (110 > 88)

Check failure on line 33 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:33:1: W293 Blank line contains whitespace

Check failure on line 33 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:33:1: W293 Blank line contains whitespace
return function_code


def genetic_algorithm(user_fitness_function):
"""
Execute the genetic algorithm to optimize the user-defined fitness function.

Check failure on line 40 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:40:1: W293 Blank line contains whitespace

Check failure on line 40 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:40:1: W293 Blank line contains whitespace
Parameters:
user_fitness_function (function): The fitness function to be optimized.

Returns:
None

Example:
>>> def example_fitness_function(x):
... return x[0]**2 + x[1]**2
>>> genetic_algorithm(example_fitness_function) # This will print outputs
"""
population_size = 100
num_generations = 500
mutation_rate = 0.01
chromosome_length = 2
best_fitness = np.inf
best_solution = None

population = np.random.rand(population_size, chromosome_length)

for generation in range(num_generations):
fitness_values = []

for individual in population:
fitness_value = user_fitness_function(individual)

if fitness_value is None:
print(f"Warning: Fitness function returned None for individual {individual}.")
fitness_value = np.inf
else:
print(f"Evaluating individual {individual}, Fitness: {fitness_value:.6f}")

fitness_values.append(fitness_value)

fitness_values = np.array(fitness_values)

best_idx = np.argmin(fitness_values)
if fitness_values[best_idx] < best_fitness:
best_fitness = fitness_values[best_idx]
best_solution = population[best_idx]

print(f"Generation {generation + 1}, Best Fitness: {best_fitness:.6f}")

selected_parents = population[np.random.choice(population_size, population_size)]

offspring = []
for i in range(0, population_size, 2):
parent1, parent2 = selected_parents[i], selected_parents[i + 1]
cross_point = np.random.randint(1, chromosome_length)
child1 = np.concatenate((parent1[:cross_point], parent2[cross_point:]))
child2 = np.concatenate((parent2[:cross_point], parent1[cross_point:]))
offspring.append(child1)
offspring.append(child2)

offspring = np.array(offspring)
mutation_mask = np.random.rand(population_size, chromosome_length) < mutation_rate
offspring[mutation_mask] = np.random.rand(np.sum(mutation_mask))

population = offspring

print("\n--- Optimization Results ---")
print(f"User-defined function: f(x, y) = {user_input.split('=')[1].strip()}")
print(f"Best Fitness Value (Minimum): {best_fitness:.6f}")
print(f"Optimal Solution Found: x = {best_solution[0]:.6f}, y = {best_solution[1]:.6f}")

function_value = best_fitness
print(f"Function Value at Optimal Solution: f({best_solution[0]:.6f}, {best_solution[1]:.6f}) = {function_value:.6f}")

if __name__ == "__main__":
user_input = input("Please enter your fitness function in the format 'f(x, y) = ...':\n")

try:
fitness_function_code = parse_function(user_input)
exec(fitness_function_code, globals())
except (SyntaxError, ValueError) as e:
print(f"Error: {e}")
except Exception as e:
print(f"Error executing function: {e}")

if 'fitness' in globals():
genetic_algorithm(fitness)
else:
print("No valid fitness function provided.")
Loading