2026 年河北省研究生数学建模竞赛 C、D 两题都属于典型的研究生高阶建模题。C 题偏医学影像、计算几何、三维重建和多目标观察策略优化;D 题偏电力系统、物理信息建模、黑启动过程仿真、移动储能经济性和零碳园区产业路径分析。两题都不能简单套一个模型解决,而必须建立完整问题链条。
C 题的关键是把三维冠状动脉二值 mask 转化成具有临床意义的血管结构模型,再基于中心线和局部直径识别狭窄,最后设计最佳观察角度。它的本质不是“分割”,因为 mask 已经给出,而是“从几何结构中提取诊断信息”。
D 题的关键是构建零碳园区源网荷储的信息物理耦合系统,模拟 10kV 配网黑启动过程,优化移动储能车配置与调度,并从经济和产业角度分析零碳园区落地路径。它的本质不是单纯调度,而是“安全恢复 + 低碳运行 + 经济可行 + 工程落地”的系统优化。
第一部分:C 题——冠状动脉造影狭窄识别与最佳观察策略
一、C 题完整问题理解
题目给出若干病例的三维冠状动脉二值 mask 数据。mask 中的 1 表示血管管腔区域,0 表示背景。参赛者需要围绕三维血管结构,完成三类任务:
第一,建立三维冠状动脉结构模型。也就是从离散 mask 中重建血管表面、提取中心线、建立血管树拓扑结构,并获得血管半径、长度、分叉点、曲率等几何特征。
第二,识别和量化冠脉狭窄。狭窄不是简单找最细的位置,而是要判断某一段血管相对于其正常参考直径是否出现异常变窄。因此需要建立沿中心线的半径序列、参考直径估计方法和狭窄率计算方法。
第三,设计最佳观察策略。冠状动脉造影是三维血管在二维平面的投影。不同观察角度下,血管重叠、狭窄显示、分支展开度和辐射代价不同,因此需要建立投影模型和多目标观察角度优化模型。
高分论文主线应为:
三维 mask 预处理 → 表面重建 → 中心线提取 → 血管树拓扑建模 → 半径/直径场计算 → 狭窄候选检测 → 狭窄率与分级 → 投影成像模拟 → 观察角度评价 → 全局/局部最佳观察策略优化。
二、C 题建模方案一:三维血管结构重建
1. 数据预处理
三维 mask 可能存在体素各向异性、局部孔洞、小噪声连通域和边界锯齿。如果直接计算中心线和半径,会导致狭窄识别误差。因此第一步需要进行几何可靠性预处理。
建议处理流程如下:
读取 NIfTI、mhd、npy 或 mat 格式的三维 mask。
根据体素间距进行各向同性重采样。
对 mask 进行三维形态学闭运算,修补局部孔洞。
删除小连通域,保留主要血管结构。
对边界进行轻度平滑,但不能过度平滑,否则会抹掉真实狭窄。
C 题代码 1:读取与预处理三维 mask
import numpy as np
import scipy.ndimage as ndi
from skimage import morphology, measure
import matplotlib.pyplot as plt
try:
import nibabel as nib
except ImportError:
nib = None
def load_mask(path):
\”\”\”
支持 .nii/.nii.gz/.npy 三维 mask。
返回 mask 和 spacing。
\”\”\”
if path.endswith(\”.npy\”):
mask = np.load(path)
spacing = np.array([1.0, 1.0, 1.0])
return mask.astype(bool), spacing
if path.endswith(\”.nii\”) or path.endswith(\”.nii.gz\”):
if nib is None:
raise ImportError(\”请先安装 nibabel: pip install nibabel\”)
img = nib.load(path)
data = img.get_fdata()
spacing = np.array(img.header.get_zooms()[:3])
return data > 0.5, spacing
raise ValueError(\”暂不支持该文件格式\”)
def resample_to_isotropic(mask, spacing):
\”\”\”
将三维 mask 重采样到各向同性体素。
最近邻插值用于保持二值标签。
\”\”\”
spacing = np.array(spacing, dtype=float)
target_spacing = spacing.min()
zoom = spacing / target_spacing
resampled = ndi.zoom(mask.astype(np.uint8), zoom=zoom, order=0)
return resampled.astype(bool), np.array([target_spacing] * 3)
def keep_largest_components(mask, min_size=100):
\”\”\”
去除小连通域,保留大于 min_size 的血管连通结构。
\”\”\”
labeled, num = ndi.label(mask)
if num == 0:
return mask
sizes = ndi.sum(mask, labeled, index=np.arange(1, num + 1))
keep_labels = np.where(sizes >= min_size)[0] + 1
cleaned = np.isin(labeled, keep_labels)
return cleaned
def preprocess_mask(mask, spacing, closing_radius=1, min_size=80):
mask_iso, spacing_iso = resample_to_isotropic(mask, spacing)
# 三维闭运算,填补局部孔洞
selem = morphology.ball(closing_radius)
mask_closed = morphology.binary_closing(mask_iso, selem)
# 填补内部空洞
mask_filled = ndi.binary_fill_holes(mask_closed)
# 删除小连通域
mask_clean = keep_largest_components(mask_filled, min_size=min_size)
return mask_clean.astype(bool), spacing_iso
# 示例
# mask, spacing = load_mask(\”case001_mask.nii.gz\”)
# mask_clean, spacing_iso = preprocess_mask(mask, spacing)
# print(mask.shape, spacing, mask_clean.shape, spacing_iso)
这部分在论文中可以写成“为了保证几何测量的可靠性,对原始三维 mask 进行各向同性重采样、形态学闭运算、孔洞填补和小连通域去除,为后续中心线提取和半径估计提供稳定输入”。
2. 三维表面重建
三维 mask 是体素集合,不能直接用于连续几何分析。需要通过 Marching Cubes 算法提取等值面,生成三角网格。
表面重建的作用包括:
可视化冠脉整体结构; 辅助检查 mask 质量; 展示狭窄区域三维形态; 用于投影模拟和表面距离分析。
C 题代码 2:Marching Cubes 表面重建与可视化
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
def reconstruct_surface(mask, spacing=(1, 1, 1), level=0.5):
\”\”\”
使用 Marching Cubes 从三维 mask 提取表面网格。
返回顶点 verts 和面片 faces。
\”\”\”
verts, faces, normals, values = measure.marching_cubes(
mask.astype(np.float32),
level=level,
spacing=spacing
)
return verts, faces
def plot_mesh(verts, faces, title=\”Coronary artery surface\”):
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection=\”3d\”)
mesh = Poly3DCollection(verts[faces], alpha=0.25)
mesh.set_edgecolor(\”none\”)
ax.add_collection3d(mesh)
ax.set_xlim(verts[:, 0].min(), verts[:, 0].max())
ax.set_ylim(verts[:, 1].min(), verts[:, 1].max())
ax.set_zlim(verts[:, 2].min(), verts[:, 2].max())
ax.set_title(title)
plt.tight_layout()
plt.show()
# 示例
# verts, faces = reconstruct_surface(mask_clean, spacing_iso)
# plot_mesh(verts, faces)
论文中可以说明:Marching Cubes 的本质是在三维体数据中寻找血管边界等值面,将离散体素血管转化为连续三角网格,为医生直观观察和后续几何分析提供基础。
三、C 题建模方案二:中心线与血管树拓扑建模
1. 为什么必须提取中心线?
冠状动脉是树状管腔结构。狭窄发生在某一条血管分支的某一段上。直接在三维体素空间中找狭窄很困难,因为血管有弯曲、分叉和自然变细。中心线可以把三维管腔结构压缩成一维路径,使血管狭窄识别变成沿弧长方向的半径变化分析。
中心线上的每个点应包括:
三维坐标; 局部半径; 所属血管分支; 到入口点的弧长; 附近曲率; 是否位于分叉附近。
2. 中心线提取方法
可以采用三维骨架化方法获得中心线候选,再将骨架转化为图结构。图中节点为骨架点,边为相邻点连接。再通过节点度数识别端点和分叉点。
C 题代码 3:骨架提取与图结构构建
import networkx as nx
try:
from skimage.morphology import skeletonize_3d
except ImportError:
skeletonize_3d = None
def extract_skeleton(mask):
\”\”\”
三维骨架提取。
\”\”\”
if skeletonize_3d is None:
raise ImportError(\”当前 skimage 版本不含 skeletonize_3d,请安装兼容版本或使用替代中心线算法\”)
skel = skeletonize_3d(mask.astype(np.uint8)) > 0
return skel
def skeleton_to_graph(skel, spacing=(1, 1, 1)):
\”\”\”
将三维骨架转成 graph。





