IBM ILOG CPLEX数组长度、求和及两数组sumproduct计算问题
IBM ILOG CPLEX 数组长度、求和、sumproduct实现方案
修正后可直接运行的完整代码
// 先定义数组,无需提前声明索引范围 int s = [11,1,1,1,1,1,1,1,1,1]; // 计算s的长度赋值给a int a = s.size; range m = 1..a; // 计算s的元素总和赋值给b int b = sum(i in m) s[i]; // 定义二维数组q int q[m] = [[4,5,0,2],[3,2,1,0],[0,1,4,5],[3,2,0,1],[2,1,3,2],[4,3,2,1],[3,4,2,0],[5,0,3,1],[0,4,3,3],[4,0,4,1]]; // 取q第一行的长度作为第二维长度赋值给c int c = q[1].size; range o = 1..c; // 直接通过推导式计算sumproduct结果赋值给d int d[o] = [sum(i in m) s[i] * q[i][k] | k in o];
各需求实现说明
- 数组长度获取:OPL中数组内置
size属性可直接返回数组元素个数,一维数组直接调用数组名.size,二维数组取任意一行的size即可得到第二维的长度(需保证所有行长度一致) - 数组求和:直接使用CPLEX内置的
sum()聚合函数,遍历数组索引范围累加元素即可 - sumproduct计算:通过数组推导式结合
sum()函数,遍历公共行维度,对每个列维度下的对应元素相乘后求和,一行即可完成所有列的sumproduct计算,无需单独写forall循环赋值
运行后变量结果完全符合预期:a=10,b=20,c=4,d = [68, 72, 22, 36]
内容的提问来源于stack exchange,提问作者Deepan
相关产品推荐
相关产品推荐

