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

针对CSV各数据点的GEKKO优化及目标函数表达式解析器需求

实现带自定义统计量的GEKKO逐行CSV优化与表达式解析

需求明确

需解析包含以下元素的目标函数,并针对CSV文件的每个数据点执行GEKKO优化:

  • 目标函数示例:3*[var_1] + [ROW_MEAN_hpbh]*[var_2] + [MAX_feia] * [var_3]
  • 自定义统计量:
    • [ROW_MEAN_hpbh]:CSV中指定两列的行均值
    • [MAX_feia]:CSV中指定列的全局最大值
  • 优化变量:var_1、var_2、var_3(已定义上下界)

实现步骤与代码示例

1. 依赖导入与数据预处理

先导入所需库,读取CSV并计算全局统计量:

import pandas as pd
from gekko import GEKKO

# 读取CSV数据
df = pd.read_csv('your_data.csv')

# 计算全局统计量MAX_feia
max_feia = df['feia'].max()

2. 表达式解析与替换逻辑

编写函数替换目标函数中的占位符为对应数值:

def parse_objective(expr, row_mean, max_val):
    # 替换行均值占位符
    expr = expr.replace('[ROW_MEAN_hpbh]', str(row_mean))
    # 替换全局最大值占位符
    expr = expr.replace('[MAX_feia]', str(max_val))
    # 替换变量占位符(适配GEKKO变量格式)
    expr = expr.replace('[var_1]', 'var1').replace('[var_2]', 'var2').replace('[var_3]', 'var3')
    return expr

3. 逐行执行GEKKO优化

遍历CSV每行数据,计算行均值,初始化模型并求解:

# 定义目标函数模板
objective_template = '3*[var_1] + [ROW_MEAN_hpbh]*[var_2] + [MAX_feia] * [var_3]'

# 遍历每行数据
for idx, row in df.iterrows():
    # 计算当前行的ROW_MEAN_hpbh(假设两列是'hp'和'bh')
    row_mean = row[['hp', 'bh']].mean()
    
    # 解析目标函数
    parsed_expr = parse_objective(objective_template, row_mean, max_feia)
    
    # 初始化GEKKO模型
    m = GEKKO(remote=False)
    
    # 定义优化变量及上下界(示例值,可根据实际调整)
    var1 = m.Var(lb=0, ub=10)
    var2 = m.Var(lb=2, ub=20)
    var3 = m.Var(lb=-5, ub=5)
    
    # 设置目标函数(最小化,如需最大化可加负号)
    m.Obj(eval(parsed_expr))
    
    # 求解优化问题
    m.solve(disp=False)
    
    # 输出结果
    print(f"行{idx+1}优化结果:")
    print(f"var1: {var1.value[0]:.4f}, var2: {var2.value[0]:.4f}, var3: {var3.value[0]:.4f}")
    print(f"目标函数值: {m.options.objfcnval:.4f}\n")

关键说明

  • 若目标函数需最大化,将m.Obj(eval(parsed_expr))改为m.Obj(-eval(parsed_expr))即可
  • 变量上下界需根据实际业务需求调整
  • 若CSV数据量较大,可考虑批量处理或调整GEKKO的求解器参数提升效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:08:21