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)
03-13
1万+
05-27
2693
08-06
584
08-08
1059
01-21