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 12 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
144 changes: 144 additions & 0 deletions genetic_algorithm/function_optimization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import numpy as np
import sympy as sp

def parse_function(user_input):

Check failure on line 4 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) = x^2 + y^2 to a valid Python function.

Parameters:
user_input (str): The user-defined fitness function in string format.

Returns:
function: A callable fitness function.

Examples:
>>> parse_function("f(x, y) = x^2 + y^2")
<function fitness at 0x...>
"""
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) = ...'.")

# Create sympy symbols for x and y
x, y = sp.symbols('x y')

Check failure on line 28 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:28:1: W293 Blank line contains whitespace
# Replace power operator and parse the expression
expression = expression.replace('^', '**')
func_expr = eval(expression) # Safe to use as we're controlling the input format

Check failure on line 31 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (S307)

genetic_algorithm/function_optimization.py:31:17: S307 Use of possibly insecure function; consider using `ast.literal_eval`

# Create the fitness function using sympy
fitness = sp.lambdify((x, y), func_expr)

return fitness

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

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
"""
rng = np.random.default_rng() # New random number generator
population_size = 100
num_generations = 500
mutation_rate = 0.01
chromosome_length = 2
best_fitness = np.inf
best_solution = None

# Initialize the population
population = rng.random((population_size, chromosome_length))

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

for individual in population:
# Call the fitness function with individual x and y
fitness_value = user_fitness_function(individual[0], individual[1])

if fitness_value is None or not isinstance(fitness_value, (int, float)):
print(
f"Warning: Fitness function returned an invalid value "
f"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)

# Update the best solution
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}")

# Selection
selected_parents = population[rng.choice(population_size, population_size)]

Check failure on line 96 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

genetic_algorithm/function_optimization.py:96:1: W293 Blank line contains whitespace
# Crossover
offspring = []
for i in range(0, population_size - 1, 2): # Ensure even number of parents
parent1, parent2 = selected_parents[i], selected_parents[i + 1]
cross_point = rng.integers(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)

# Handle odd population size if necessary
if population_size % 2 == 1:
offspring.append(selected_parents[-1]) # Include last parent if odd

offspring = np.array(offspring)

# Mutation
mutation_mask = rng.random(offspring.shape) < mutation_rate
offspring[mutation_mask] = rng.random(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}, "
f"y = {best_solution[1]:.6f}"
)

function_value = best_fitness
print(
f"Function Value at Optimal Solution: f({best_solution[0]:.6f}, "
f"{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 = parse_function(user_input)
genetic_algorithm(fitness_function)
except (SyntaxError, ValueError) as e:
print(f"Error: {e}")
except NameError as e:
print(f"Error: {e}")
Loading