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


def parse_function(user_input):
"""
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:
str: The function code as a string.

Examples:
>>> parse_function("f(x, y) = x^2 + y^2")
'def fitness(x):\\n return x[0]**2 + x[1]**2'
"""
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) = ...'.")

function_code = "def fitness(x):\n"
function_code += f" return {expression.replace('^', '**').replace('x', 'x[0]').replace('y', 'x[1]')}\n"

Check failure on line 27 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

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

return function_code


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

population = rng.random((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}."

Check failure on line 65 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

genetic_algorithm/function_optimization.py:65:89: E501 Line too long (91 > 88)
)
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[rng.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 = 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)

offspring = np.array(offspring)
mutation_mask = rng.random((population_size, chromosome_length)) < 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}, y = {best_solution[1]:.6f}"

Check failure on line 105 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

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

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

Check failure on line 110 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

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


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())

Check failure on line 121 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (S102)

genetic_algorithm/function_optimization.py:121:9: S102 Use of `exec` detected
except (SyntaxError, ValueError) as e:
print(f"Error: {e}")
except NameError as e:
print(f"Error: {e}")

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

Check failure on line 131 in genetic_algorithm/function_optimization.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W292)

genetic_algorithm/function_optimization.py:131:57: W292 No newline at end of file
Loading