You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于本地变量的表达式求值:遗传程序随机表达式适应度测试

遗传程序:随机表达式生成与适应度测试实现示例

看起来你正在搭建一个针对特定符号和函数的遗传程序,我整理了一个符合你需求的实现示例,附带关键细节的解释和优化建议:

完整代码实现

# 假设DIV和GT已提前定义(根据你的实际逻辑调整)
def DIV(a, b):
    # 处理除零场景,避免程序崩溃,这里返回被除数作为示例
    return a / b if b != 0 else a

def GT(a, b):
    # 遗传编程中常用数值表示布尔结果:1为真,0为假
    return 1 if a > b else 0

import random

# 定义允许使用的终端符号和函数
ALLOWED_SYMBOLS = ['x', 'v', '-1']
ALLOWED_FUNCTIONS = [DIV, GT]

# 递归生成随机表达式
def generate_random_expression(depth=3):
    # 控制表达式深度,避免无限递归或过于复杂的结构
    # 30%概率直接生成终端符号,否则生成函数节点
    if depth <= 0 or random.random() < 0.3:
        return random.choice(ALLOWED_SYMBOLS)
    else:
        selected_func = random.choice(ALLOWED_FUNCTIONS)
        # 生成两个子表达式作为函数参数
        arg1 = generate_random_expression(depth - 1)
        arg2 = generate_random_expression(depth - 1)
        return (selected_func, arg1, arg2)

# 递归求值表达式
def evaluate_expression(expr, x_val, v_val):
    if isinstance(expr, str):
        # 替换终端符号为对应测试值
        if expr == 'x':
            return x_val
        elif expr == 'v':
            return v_val
        elif expr == '-1':
            return -1
    elif isinstance(expr, tuple):
        # 执行函数节点的计算
        func, arg1, arg2 = expr
        val1 = evaluate_expression(arg1, x_val, v_val)
        val2 = evaluate_expression(arg2, x_val, v_val)
        return func(val1, val2)

# 主函数:生成表达式并测试适应度
def main():
    # 生成随机表达式
    random_expr = generate_random_expression()
    print(f"生成的随机表达式结构: {random_expr}")
    
    # 测试用例:当前以x=1为基础,搭配多组v值测试
    test_cases = [
        {'x': 1, 'v': -2},
        {'x': 1, 'v': 0},
        {'x': 1, 'v': 3},
        {'x': 1, 'v': 1}
        # 可根据需求添加更多v值或扩展x的取值范围
    ]
    
    # 计算适应度(示例以结果与目标值的绝对误差和为得分,越小越好)
    target_value = 0  # 根据你的实际任务调整目标值
    fitness_score = 0
    
    for case in test_cases:
        result = evaluate_expression(random_expr, case['x'], case['v'])
        print(f"测试x={case['x']}, v={case['v']}: 计算结果 = {result}")
        fitness_score += abs(result - target_value)
    
    print(f"\n该表达式的适应度得分: {fitness_score}")

if __name__ == "__main__":
    main()

关键细节说明

  • 表达式生成约束:严格遵循你要求的规则,仅使用x、v、-1作为终端符号,函数仅调用预定义的DIV和GT,通过递归深度控制和随机概率平衡表达式的复杂度。
  • 求值逻辑:递归解析表达式结构,自动替换终端符号为测试用例中的对应值,执行函数计算得到结果。
  • 适应度计算:示例采用“结果与目标值的绝对误差和”作为适应度得分,你可以根据任务需求修改——比如分类任务用正确率,回归任务用均方误差,或者自定义的评价规则。

优化建议

  • 可以给generate_random_expression添加参数,调整终端符号和函数节点的选择概率,灵活控制生成表达式的复杂度分布。
  • DIV函数的除零处理可以根据遗传编程的需求优化,比如返回一个极端值(如float('inf'))或者固定值,避免影响适应度计算的合理性。
  • 建议扩展测试用例的x取值范围,而不局限于x=1,这样能更全面地评估表达式的泛化能力。

内容的提问来源于stack exchange,提问作者BimJeam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:09:30