将MILP问题的CPLEX分支定界日志解析为Pandas DataFrame遇错位问题
Markdown格式使用指南
标题格式
使用#号定义标题层级,#的数量越多,标题层级越低:
# 一级标题→ # 一级标题## 二级标题→ ## 二级标题### 三级标题→ ### 三级标题
列表项格式
以短横线-开头创建无序列表,嵌套列表需缩进:
- 基础列表项1
- 基础列表项2
- 嵌套列表项1
- 嵌套列表项2
文本强调格式
用星号*包裹文本实现强调效果:
- 斜体强调:
*斜体文本*→ 斜体文本 - 粗体强调:
**粗体文本**→ 粗体文本
代码与命令格式
用反引号`包裹单行代码,多行代码块用三个反引号包裹并可指定语言:
- 单行代码:
pd.read_csv(file_path, delim_whitespace=True) - 多行代码块(Python示例):
import pandas as pd import io # 解析CPLEX日志的初始尝试代码 milp_log = ["日志行1", "日志行2"] test = pd.read_csv(io.StringIO("\n".join(milp_log)), delim_whitespace=True)
引用文本格式
用大于号>标记引用内容:
这是一段被引用的文本,常用于展示引用内容或说明性文字
链接格式
格式为[链接显示文本](目标URL):
Markdown官方文档
图片格式
格式为[图片替代文本](图片URL),替代文本会在图片无法加载时显示:
示例图片
CPLEX分支定界日志解析错位问题解决方法
当CPLEX分支定界日志存在缺失值行时,直接用delim_whitespace=True会导致列错位,可通过以下方案处理:
方案1:指定列名与预处理缺失行
先提取日志表头确定字段,对缺失值行补充占位符,确保每行字段数一致:
import pandas as pd import io # 假设CPLEX日志的分支定界表头为以下字段 cols = ["Node", "Left", "Objective", "Best Integer", "Best Bound", "Gap"] processed_log = [] for line in milp_log: # 按空格分割后,补充缺失的字段为NaN parts = line.strip().split() processed_parts = parts + [float('nan')]*(len(cols)-len(parts)) processed_log.append("\t".join(map(str, processed_parts))) # 用制表符分隔读取,避免空格错位 df = pd.read_csv(io.StringIO("\n".join(processed_log)), sep="\t", names=cols)
方案2:正则表达式精准提取字段
针对CPLEX日志格式编写正则,匹配每行的各个字段,避免错位:
import pandas as pd import re # 适配CPLEX分支定界日志的正则模式,可根据实际日志调整 log_pattern = re.compile( r'(?P<Node>\d+)?\s*' r'(?P<Left>\d+)?\s*' r'(?P<Objective>[+-]?\d+\.?\d*)?\s*' r'(?P<Best_Integer>[+-]?\d+\.?\d*)?\s*' r'(?P<Best_Bound>[+-]?\d+\.?\d*)?\s*' r'(?P<Gap>[+-]?\d+\.?\d*%?)?' ) parsed_rows = [] for line in milp_log: match = log_pattern.match(line.strip()) if match: parsed_rows.append(match.groupdict()) df = pd.DataFrame(parsed_rows) # 转换字段类型 df = df.apply(pd.to_numeric, errors='ignore')
方案3:使用CPLEX API直接获取数据
如果有权限调用CPLEX的Python API,可跳过日志解析,直接从求解器中提取分支定界数据:
from docplex.mp.model import Model # 假设已创建并求解模型 model = Model(name="milp_model") solution = model.solve(log_output=False) # 获取分支定界相关数据 branch_data = model.solver_details.branch_details df = pd.DataFrame(branch_data)
内容的提问来源于stack exchange,提问作者mariokloster
相关产品推荐
相关产品推荐

