如何对PuLP二维求解结果按时间步i维度汇总各设备总功耗
报错原因
触发IndexError: list assignment index out of range的核心原因是列表初始化逻辑错误,Python列表不支持对不存在的索引直接赋值:
- 你初始化的
result = [[]]仅包含1个空列表,总长度为1,当外层循环i取1~29时,访问result[i]直接超出列表现有长度 - 就算i=0时,内层的空列表长度为0,当j取0~87时,访问
result[i][j]同样会超出内层列表的长度 - 额外提一句:你代码里print语句把i、j的值写死成了3,打印的日志完全无法反映实际循环的索引情况,属于额外的逻辑bug。
实现逐时间步总功耗汇总的最优方案
不需要提前构造全量二维结果表再二次求和,直接在遍历变量值的时候按时间步i累加即可,内存占用更低、逻辑更简单,也不会出现索引越界问题:
# 初始化逐时间步总功耗数组,长度和时间步总数一致,初始值为0 total_power_per_timestep = [0.0 for _ in a] for i in a: for j in b: # 取变量值,加or 0做兜底,避免求解异常时varValue为None触发计算错误 power_val = Power_consumption[i][j].varValue or 0.0 # 累加到对应时间步的总功耗中 total_power_per_timestep[i] += power_val # 调试打印时不要写死i、j,直接取循环变量值 # print(f"i:{i}, j:{j} = {power_val}")
如果你确实需要留存所有设备逐时间步的功耗明细二维表,要提前按维度初始化列表,不能用[[]]的错误写法:
# 初始化30个时间步 * 88个设备的二维结果数组,初始值为0 result = [[0.0 for _ in b] for _ in a] for i in a: for j in b: val = Power_consumption[i][j].varValue or 0.0 result[i][j] = val # 逐行求和即可得到每个时间步的总功耗 total_power_per_timestep = [sum(row) for row in result]
内容的提问来源于stack exchange,提问作者Mada
相关产品推荐
相关产品推荐

