AMPL构建Day索引计算每日参数最值及Python-AMPL传参报错求助
问题解决:AMPL按日计算能耗/日照最值及Python-AMPL参数传递错误
需求背景
现有包含Hour索引、consumption(能耗)、insolation(日照强度)的CSV文件,需在AMPL中创建由连续24小时组成的Day索引,计算每日各参数的最大值,同时解决Python处理数据后传递参数到AMPL时的错误。
一、AMPL尝试的两种方法及问题
方法1:仅能计算全局最值,无法存储每日最值
代码示例:
# .mod文件 set Hour; set Day; param consumption{Hour} >=0; let DAYS := ceil(card(HOURS)/24); param max_consumption:= max{i in Hour} consumption[i]; # .run文件 model csvtest.mod; table hourpower IN "amplcsv" "testload.csv": Hour<-[Hour], consumption, insolation; read table hourpower; display max_consumption, Hour;
问题:仅能计算天数和全局最大能耗,无法存储每日的能耗/日照强度最大值。
方法2:添加Day列后表定义语法错误
尝试给CSV添加Day列后,编写如下表定义代码:
set Hour; set Day; table hourpower IN "amplcsv" "testload.csv": Day<-[Day, Hour<-[Hour], consumption, insolation;
问题:AMPL语法不支持这种同时用括号定义两个索引的写法,触发语法错误。
CSV片段参考:
Day Hour consumption insolation 1 1 3358.3 0 1 2 3628.7 10 1 3 4837.1 35 2 1 3016.4 0 2 2 3723.1 13 2 3 4443.1 40
二、Python处理后参数传递到AMPL的错误
使用Python处理数据(去除列名隐形空格)并计算每日最值后,传递参数到AMPL时触发NameError: name 'total_cost' is not defined,同时需要确认参数在AMPL中可用。
原代码错误点
- Python中未定义
total_cost变量却尝试打印和传递给AMPL - 错误传递
P_cost参数(AMPL模型中定义的是Total_cost) - AMPL模型中
Total_Cost:=的赋值语法不规范,且变量名大小写不一致
三、解决方案
方案1:直接在AMPL中自动生成Day索引并计算每日最值(无需修改CSV)
无需提前给CSV添加Day列,在AMPL中通过Hour自动划分Day,并计算每日指标:
# .mod文件 set Hour; param consumption{Hour} >= 0; param insolation{Hour} >= 0; # 自动生成Day索引:每24小时为1天 set Day := {ceil(h/24) for h in Hour}; # 定义每个Day对应的Hour集合 param hours_in_day{d in Day} := {h in Hour | ceil(h/24) = d}; # 计算每日各参数的最大值和总能耗 param max_consumption{d in Day} := max{h in hours_in_day[d]} consumption[h]; param max_insolation{d in Day} := max{h in hours_in_day[d]} insolation[h]; param sum_consumption{d in Day} := sum{h in hours_in_day[d]} consumption[h]; # 计算总费用 param Total_Cost := 400*sum{d in Day} max_insolation[d] - (200*sum{d in Day} sum_consumption[d] + 300*sum{d in Day} max_consumption[d]);
# .run文件 model model.mod; table hourpower IN "amplcsv" "testload.csv": Hour<-[Hour], consumption, insolation; read table hourpower; display Day, max_consumption, max_insolation, sum_consumption, Total_Cost;
方案2:修正Python代码及AMPL模型的参数传递问题
修正后的Python代码
import pandas as pd from amplpy import AMPL file_path = r"C:\Users\mcaba\Dissertation model\data.csv" data = pd.read_csv(file_path, sep=',') data.columns = data.columns.str.strip() days = sorted(data['day'].unique().tolist()) hours = sorted(data['hour'].unique().tolist()) consumption_data = {} insolation_data = {} for _, row in data.iterrows(): day, hour, consumption, insolation = row['day'], row['hour'], row['consumption'], row['insolation'] consumption_data[(day, hour)] = consumption insolation_data[(day, hour)] = insolation max_consumption = {} max_insolation = {} sum_consumption = {} for day in days: daily_consumption = [consumption_data[(day, hour)] for hour in hours if (day, hour) in consumption_data] daily_insolation = [insolation_data[(day, hour)] for hour in hours if (day, hour) in insolation_data] max_consumption[day] = max(daily_consumption) max_insolation[day] = max(daily_insolation) sum_consumption[day] = sum(daily_consumption) print("Max Consumption per Day:", max_consumption) print("Max Insolation per Day:", max_insolation) print("Total Consumption per Day:", sum_consumption) ampl = AMPL() ampl.read(r"C:\Users\mcaba\Dissertation model\model.mod") ampl.set['DAYS'] = days ampl.set['HOURS'] = hours ampl.param['consumption'] = consumption_data ampl.param['insolation'] = insolation_data ampl.display('consumption, insolation') ampl.param['max_consumption'] = max_consumption ampl.param['max_insolation'] = max_insolation ampl.param['sum_consumption'] = sum_consumption ampl.display('max_consumption') ampl.display('max_insolation') ampl.display('sum_consumption') # 获取AMPL中计算的总费用 total_cost = ampl.param['Total_Cost'].value() print(f"Total Cost: {total_cost}")
修正后的AMPL模型代码
set DAYS; set HOURS; param consumption{DAYS, HOURS}; param insolation{DAYS, HOURS}; param max_consumption{DAYS}; param max_insolation{DAYS}; param sum_consumption{DAYS}; # 统一变量名并正确计算总费用 param Total_Cost := 400*sum{d in DAYS} max_insolation[d] - (200*sum{d in DAYS} sum_consumption[d] + 300*sum{d in DAYS} max_consumption[d]);
内容的提问来源于stack exchange,提问作者Michael Caballero
相关产品推荐
相关产品推荐

