#!/usr/bin/env python3
"""Auto-generated by AGI Loop cycle #1036
Task: Write a Python function that implements a genetic algorithm to maximize f(x)=x*sin(10*pi*x)+2 for x in [-1,2]
Generated: 2026-02-12T17:52:41.445601
"""

import random
import math

def fitness(x):
    return x * math.sin(10 * math.pi * x) + 2

def initialize_population(pop_size, lower_bound, upper_bound):
    return [random.uniform(lower_bound, upper_bound) for _ in range(pop_size)]

def select_parents(population, fitness_values, num_parents):
    combined = list(zip(population, fitness_values))
    combined.sort(key=lambda x: x[1], reverse=True)
    return [individual for individual, _ in combined[:num_parents]]

def crossover(parents, offspring_size):
    offspring = []
    for _ in range(offspring_size):
        parent1, parent2 = random.sample(parents, 2)
        midpoint = random.uniform(0, 1)
        child = midpoint * parent1 + (1 - midpoint) * parent2
        offspring.append(child)
    return offspring

def mutate(individual, mutation_rate, lower_bound, upper_bound):
    if random.random() < mutation_rate:
        mutation = random.uniform(-0.1, 0.1)
        individual += mutation
        individual = max(lower_bound, min(upper_bound, individual))
    return individual

def genetic_algorithm(pop_size=20, num_generations=100, num_parents=10, mutation_rate=0.1, lower_bound=-1, upper_bound=2):
    population = initialize_population(pop_size, lower_bound, upper_bound)
    best_fitness = -float('inf')
    best_individual = None

    for generation in range(num_generations):
        fitness_values = [fitness(individual) for individual in population]
        parents = select_parents(population, fitness_values, num_parents)
        offspring = crossover(parents, pop_size - num_parents)
        mutated_offspring = [mutate(child, mutation_rate, lower_bound, upper_bound) for child in offspring]
        population = parents + mutated_offspring

        current_max = max(fitness_values)
        if current_max > best_fitness:
            best_fitness = current_max
            best_individual = population[fitness_values.index(current_max)]

        print(f"Generation {generation}: Best Fitness = {best_fitness}, Best Individual = {best_individual}")

    return best_individual, best_fitness

if __name__ == '__main__':
    best_x, best_fitness = genetic_algorithm()
    print(f"Final Result: x = {best_x}, Maximum f(x) = {best_fitness}")