针对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
相关产品推荐
相关产品推荐

