如何将CPLEX的3D决策变量按指定矩阵格式写入Excel?
可以实现,调整变量导出的结构即可,以下是两种可行方案:
方案一:构造二维数组映射目标格式
通过将3D决策变量转换为K × (L×T)的二维数组,直接导出成Excel的行列对应格式。
修改后的.mod文件
int K = 15; int L = 2; int T = 6; range k = 1..K; range l = 1..L; range t = 1..T; // 定义列范围:对应L×T=12列 range cols = 1..(L*T); dvar X[k][l][t]; subject to { // 你的约束条件 } // 将3D变量转成二维数组:每行对应一个k,每列对应(l,t)的组合 float exportData[k][cols] = [k][(l-1)*T + t] X[k][l][t] | k in k, l in l, t in t;
修改后的.dat文件
SheetConnection Test ("Thesis.xlsx"); // 导出到Output工作表的C2到N16区域(15行12列) exportData to SheetWrite(Test,"Output!C2:N16");
说明:(l-1)*T + t将l和t的组合转换为列索引,比如l=1时t从1到6对应第1-6列,l=2时t从1到6对应第7-12列,正好匹配12列的需求。
方案二:直接映射Excel单元格(无需修改.mod)
如果不想改动模型文件,可以在.dat中通过循环计算每个变量对应的Excel单元格位置,直接写入。
修改后的.dat文件
SheetConnection Test ("Thesis.xlsx"); // 遍历所有变量,计算对应的单元格位置并写入 for (k in k, l in l, t in t) { let col = 3 + (l-1)*T + (t-1); // C列是第3列,计算列偏移 let row = 2 + (k-1); // 从第2行开始,计算行偏移 X[k][l][t] to SheetWrite(Test, "Output!" + CellName(row, col)); }
说明:CellName(row, col)会自动将行号列号转换为Excel的单元格名称(比如row=2, col=3对应C2),最终所有变量会按K为行、L×T为列的格式排列。
内容的提问来源于stack exchange,提问作者Sukesh Ravi
相关产品推荐
相关产品推荐

