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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:53:13