python算术表达式遗传算法

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)
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值