You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:01:29