import random
import operator
import math
ops = {'+': '+','-': '-','*': '*','/': '/','sin': 'math.sin','cos': 'math.cos'
}
def generate_expression(depth=0):if depth > 2: return str(random.uniform(1, 10))op = random.choice(list(ops.keys()))if op in ['sin', 'cos']:return f"{ops[op]}({generate_expression(depth + 1)})"else:return f"({generate_expression(depth + 1)} {ops[op]} {generate_expression(depth + 1)})"
def evaluate_expression(expression):try:return eval(expression)except ZeroDivisionError:return float('inf') except Exception as e:return float('inf')
def crossover(expr1, expr2):point = random.randint(0, min(len(expr1), len(expr2)) - 1)return expr1[:point] + expr2[point:]
def mutate(expression):return generate_expression() if random.random() < 0.1 else expression
def evolve(population, generations=100):for _ in range(generations):fitness = [(evaluate_expression(expr), expr) for expr in population]fitness.sort()parents = [expr for _, expr in fitness[:len(fitness)//2]]population = []while len(population) < len(fitness):parent1, parent2 = random.sample(parents, 2)child = crossover(parent1, parent2)child = mutate(child)population.append(child)best_expr = fitness[0][1]best_fitness = fitness[0][0]print(f"Best Expression: {best_expr} | Fitness: {best_fitness}")
population = [generate_expression() for _ in range(20)]
evolve(population)