CPLEX OPL中对tuple按源节点汇总功耗并存储的实现方法咨询
OPL 按源节点汇总功耗的实现方案
基础结构定义
首先定义对应存储原始数据的tuple结构,以及相关参数:
// 定义存储单条节点功耗的tuple tuple PowerRecord { int SourceNodes; float PowerConsumptionArray; } // 原始数据集合,可替换为你的实际数据源 {PowerRecord} rawRecords = ...;
两种求和实现方式
方式1:OPL原生聚合表达式(最简洁,推荐)
直接通过sum聚合函数按节点筛选求和,无需写遍历逻辑,自动生成对应索引的总功耗数组:
// 先获取所有存在的源节点编号,支持非连续节点编号 {int} allNodes = {r.SourceNodes | r in rawRecords}; // 直接生成以节点编号为索引的总功耗数组 float totalPowerPerNode[node in allNodes] = sum(r in rawRecords: r.SourceNodes == node) r.PowerConsumptionArray;
如果你的节点编号是连续的整数范围,也可以直接指定范围作为索引:
// 比如节点编号范围是1~10,就可以直接写 float totalPowerPerNode[1..10] = sum(r in rawRecords: r.SourceNodes == node) r.PowerConsumptionArray;
方式2:execute脚本块遍历计算
如果你需要在脚本中动态处理,可以用遍历累加的方式实现:
// 先初始化总功耗数组,默认值为0 {int} allNodes = {r.SourceNodes | r in rawRecords}; float totalPowerPerNode[allNodes] = 0; execute { for (var record in rawRecords) { totalPowerPerNode[record.SourceNodes] += record.PowerConsumptionArray; } }
效果验证
以你举的例子为例,当原始数据包含{<2,22>, <2,0>}两条记录时,最终totalPowerPerNode[2]的计算结果就是22,符合需求。
内容的提问来源于stack exchange,提问作者kyi
相关产品推荐
相关产品推荐

