在Pyomo中打印3索引三维变量并输出为i、j为行t为列的表格的方法
你可以通过「Pyomo变量值提取+Pandas结构化转换」的方案实现需求,具体实现代码如下:
步骤1:导入依赖库
import pandas as pd from pyomo.environ import value # 可选:如果需要控制台打印格式化表格,额外导入tabulate from tabulate import tabulate
步骤2:遍历变量索引组装表格数据
按你的需求,以i、j为行维度,t为列维度组装数据,可自定义单元格展示内容:
table_data = [] # 遍历所有工地、活动组合作为行 for i in model.I: for j in model.J: row = {"工地(i)": i, "活动(j)": j} # 遍历所有周期作为列 for t in model.T: # 加阈值判断规避求解器浮点精度误差 zeta = 1 if value(model.zeta[i,j,t]) > 0.9 else 0 eta = 1 if value(model.eta[i,j,t]) > 0.9 else 0 # 自定义单元格内容,可按需调整 cell = [] if zeta: cell.append("开工") if eta: cell.append("完工") row[f"周期{t}"] = "/".join(cell) if cell else "-" table_data.append(row)
步骤3:生成并输出表格
# 转换为DataFrame并设置双重行索引 df = pd.DataFrame(table_data).set_index(["工地(i)", "活动(j)"]) # 方式1:控制台打印格式化表格 print(tabulate(df, headers="keys", tablefmt="grid")) # 方式2:导出为Excel(自动合并相同工地的单元格,完全匹配预期格式) df.to_excel("项目进度输出.xlsx", merge_cells=True)
如果需要单独输出开工、完工两个变量的表格,只需要分别组装zeta、eta的数值即可,无需拼接内容。
内容的提问来源于stack exchange,提问作者Oumaima95
相关产品推荐
相关产品推荐

