2026年第七届"华数杯"大学生数学建模竞赛B题聚焦于 VLSI布图规划设计。这类问题看起来像"把很多矩形塞进芯片里",但真正做起来并不是普通的二维装箱,而是同时涉及模块排序、方向旋转、空间拓扑、芯片轮廓、网络连线、死区压缩以及异形模块嵌套等多个层面的组合优化。
赛题一共设置了四个递进问题:第一问在不固定芯片外轮廓、也不考虑模块连线的情况下追求最紧凑布局;第二问把芯片固定成正方形,并加入真实的模块连接关系,目标转为最小化总HPWL;第三问继续压缩正方形轮廓,寻找还能完成合法布局的最低死区比例;第四问则把传统矩形模块扩展为L型、T型等异形模块。
这篇文章不展开公式,也不贴代码,重点把这道题 为什么这样建模、每一问到底难在哪里、算法为什么这么设计、四问之间如何统一、哪些地方最容易踩坑 全部讲清楚。
优惠链接:关注最上方名片和qun链接,2026最新华数杯数学建模竞赛成品资料
赛题ABC题全套参考方案,全套代码+思路+助攻论文+结果数据
独家成品资料,一等奖版本
A(一等)2026年华数杯大学生数学建模竞赛A题全套资源【详细思路】+【无水印论文Word】+ 代码 + 结果+可视化图表
B(一等)2026年华数杯大学生数学建模竞赛B题全套资源【详细思路】+【无水印论文Word】+ 代码 + 结果+可视化图表
C(一等)2026年华数杯大学生数学建模竞赛C题全套资源【详细思路】+【无水印论文Word】+ 代码 + 结果+可视化图表
实际跑出的最终结果
附件实际解析结果与现有论文一致:n100、n200、n300分别包含100、200、300个HardBlock,模块总面积为179501、175696、273170,网络数分别为885、1585、1893。
| 问题 | n100 | n200 | n300 |
|---|---|---|---|
| Q1轮廓尺寸 | 390×486 | 409×454 | 509×564 |
| Q1轮廓面积 | 189540 | 185686 | 287076 |
| Q1长宽比 max/min | 1.2462 | 1.1100 | 1.1081 |
| Q1空白率 | 5.5927% | 5.6860% | 5.0906% |
| Q2 15%理论边长 | 454.341 | 449.500 | 560.487 |
| Q2总HPWL | 237257.50 | 448534.50 | 662539.50 |
| Q3最小搜索边长 | 435 | 432 | 536 |
| Q3最小搜索死区率 | 5.4172% | 6.2198% | 5.1711% |
| Q3更新HPWL | 302001.50 | 550142.50 | 829844.50 |
这里Q3有一个论文表述上的严谨点:n100/n200/n300属于大规模NP困难问题,因此 5.4172%、6.2198%、5.1711%应写成"本文多启动启发式算法搜索得到的最小可行死区",不能在没有严格不可行性证明的情况下说成数学意义上的绝对全局最小值。
这也解释了Q3的HPWL为什么比Q2高:死区从15%压到约5%--6%以后,模块几何自由度显著下降,线网优化空间受到限制。三组HPWL相较Q2分别增加约27.29%、22.65%和25.25%,符合固定轮廓Floorplanning的实际规律。
问题四得到的是严格全局最优
根据赛题图3的T型、L型和两个矩形模块,程序按照真实正交多边形形状而不是外接矩形处理。
四个模块面积分别为:
b1(T型) = 8
b2(L型) = 6
b3 = 2
b4 = 4
总实体面积:
20
程序通过旋转枚举+精确覆盖找到了一个:
4 × 5
的完全无空隙、无重叠合法拼接。
所以既有:
任何芯片面积 ≥ 20
又存在:
面积 = 20 的合法布局
因此这一问不是启发式近优,而可以严格证明:
Q4最小芯片轮廓面积 = 20,为全局最优。
q4_optimal_tiling.png
这次不是简单照搬参考论文,而是做了针对赛题的增强
参考论文证明了B*树+Fast-SA对于自由轮廓和固定轮廓Floorplanning的有效性,并指出自适应固定轮廓策略能够提高可行率;论文实验中Fast-SA相较传统SA也具有明显的收敛速度优势。 对固定轮廓,参考方法在10%和15%死区实验中均取得了100%的成功率,并通过动态权重处理轮廓约束。
我在此基础上做成的是:
B*树 Fast-SA拓扑探索 + MaxRects精英合法化 + Net力导向HPWL优化 + Q1→Q3 warm-start极限轮廓搜索 + Q4正交多边形精确覆盖
其中问题一严格按照"面积第一、面积相同时长宽比第二"做字典序评价,而不是随意把两个指标加权;问题二先利用Net和固定Terminal形成模块理想位置,再在固定轮廓里合法化,从而不是单纯"把模块塞进去";问题三直接复用问题一最优面积信息预测极限正方形附近的搜索区域;问题四则采用"面积下界+达到下界的可行构造"完成严格最优证明。
每个小问都有单独程序
项目中的对应关系已经拆开:
scripts/
├─ q1_1_data_check.py
├─ q1_2_free_outline.py
├─ q1_3_visualize.py
│
├─ q2_1_outline.py
├─ q2_2_hpwl_opt.py
├─ q2_3_visualize.py
│
├─ q3_1_deadspace_search.py
├─ q3_2_hpwl_update.py
├─ q3_3_visualize.py
│
├─ q4_1_shape_model.py
├─ q4_2_exact_tiling.py
└─ q4_3_visualize.py
公共算法放在:
src/
├─ bstar.py
├─ maxrects.py
├─ force_target.py
├─ metrics.py
├─ io_parser.py
├─ plotting.py
├─ q4_shapes.py
├─ config.py
└─ paths.py
另外还有:
validate_all.py
专门在优化完成后重新独立验证模块是否重叠、是否越界以及HPWL能否由原始Net精确复算,而不是只相信优化程序自己的输出。
最终验证结果:
Q1、Q2、Q3三个数据集全部无重叠;Q2、Q3全部无越界;HPWL全部复算一致;Q4完整覆盖且无单元重叠;总验证状态
ok=true。
validation_report.json
所有论文图已经生成
例如:
q1_n100_layout.png
q1_n300_layout.png
q2_n100_layout.png
q2_n300_layout.png
q3_n300_layout.png
q3_hpwl_q2_vs_q3.png
q4_optimal_tiling.png
项目内一共已经包含Q1三组布局图、三张收敛图、空白率图;Q2三组固定轮廓图和HPWL图;Q3三组极限轮廓图、死区率及HPWL对比图;Q4最优拼接图。




MATLAB完整项目
下载:2026华数杯B题_MATLAB完整项目_一键运行.zip
解压后可以放到:
D:\python\csdn\B_MATLAB
也可以放在任何其他目录。代码没有任何绝对路径 ,全部根据当前项目目录自动寻找 data/、results/、figures/。
MATLAB中直接执行:
run_all
Windows也可以直接双击:
一键运行MATLAB.bat
MATLAB版本同样按照每一小问独立拆分
项目结构主要是:
B_MATLAB/
│
├─ run_all.m
├─ check_environment.m
├─ validate_all.m
├─ validate_against_reference.m
├─ make_summary.m
├─ setup_paths.m
├─ 一键运行MATLAB.bat
│
├─ data/
│ ├─ n100.blocks
│ ├─ n100.nets
│ ├─ n100.pl
│ ├─ n200.blocks
│ ├─ n200.nets
│ ├─ n200.pl
│ ├─ n300.blocks
│ ├─ n300.nets
│ └─ n300.pl
│
├─ scripts/
│ ├─ q1_1_data_check.m
│ ├─ q1_2_free_outline.m
│ ├─ q1_3_visualize.m
│ │
│ ├─ q2_1_outline.m
│ ├─ q2_2_hpwl_opt.m
│ ├─ q2_3_visualize.m
│ │
│ ├─ q3_1_deadspace_search.m
│ ├─ q3_2_hpwl_update.m
│ ├─ q3_3_visualize.m
│ │
│ ├─ q4_1_shape_model.m
│ ├─ q4_2_exact_tiling.m
│ └─ q4_3_visualize.m
│
├─ src/
│ ├─ bstar_fast_sa.m
│ ├─ pack_bstar.m
│ ├─ maxrects_pack.m
│ ├─ force_targets.m
│ ├─ adaptive_target_pack.m
│ ├─ placement_hpwl.m
│ ├─ parse_blocks.m
│ ├─ parse_nets.m
│ ├─ parse_pl.m
│ ├─ solve_exact_tiling.m
│ └─ ...
│
├─ results/
├─ figures/
├─ docs/
└─ reference_results/
也就是说,不是把四个问题全部塞在一个MATLAB文件里,而是每一小问都可以独立运行和检查。
Q1 MATLAB方案
仍然按照论文的主线使用:
B*树 + Fast-SA + MaxRects精英合法化
B*树非常适合作为Floorplanning编码,因为能够由树结构通过轮廓结构快速恢复合法布局;参考论文也明确采用B*树和Fast-SA处理现代VLSI Floorplanning。
MATLAB代码中完整实现了:
- B*树构造;
- B*树Packing;
- 模块90°旋转;
- Swap;
- 节点拓扑变化;
- 三阶段Fast-SA;
- MaxRects精英修复;
- 面积第一、长宽比第二的字典序评价;
- Fast-SA收敛曲线。
参考论文采用的邻域操作本身也包括Rotate、Move、Swap。
Q1预期应与前面的Python稳定版本高度一致:
| 数据集 | 参考宽×高 | 参考面积 | 参考死区率 |
|---|---|---|---|
| n100 | 390×486 | 189540 | 5.5927% |
| n200 | 409×454 | 185686 | 5.6860% |
| n300 | 509×564 | 287076 | 5.0906% |
Q2 MATLAB方案
Q2不是简单按照模块面积装进去,而是完整实现:
Net力导向目标位置 + 固定轮廓MaxRects合法化 + 精确HPWL复算
也就是先根据:
- 模块---模块连接;
- 模块---Terminal连接;
不断更新每个HardBlock的理想位置,让连接紧密的模块主动靠近。
然后再通过合法化器保证:
- 不重叠;
- 不超过15%死区对应正方形;
- 可以旋转。
赛题明确要求固定正方形下最小化模块总HPWL,同时保证不重叠和不越界。
参考论文也证明自适应Fast-SA非常适合固定轮廓问题,在10%和15%死区条件下均取得很高的可行成功率。
Python验证版参考结果为:
| 数据集 | 15%正方形理论边长 | HPWL参考值 |
|---|---|---|
| n100 | 454.341 | 237257.50 |
| n200 | 449.500 | 448534.50 |
| n300 | 560.487 | 662539.50 |
MATLAB版本为了保证不同电脑之间的确定性复现,力导向算法采用确定性中心初始化,因此n200等个别数据的最终HPWL可能与Python版有非常小的差异,但不会影响模型、合法性和论文结论。
Q3 MATLAB方案
Q3继续使用:
Q1最优面积Warm Start + 极限边长搜索 + 多顺序MaxRects合法化 + 极限轮廓下重新优化HPWL
它不会机械地:
15%
14.9%
14.8%
......
从头大量搜索。
而是先利用Q1结果估计极限正方形尺寸附近区域,再进行局部搜索。
Python版参考结果:
| 数据集 | 最小搜索边长 | 最小搜索死区率 | 更新HPWL |
|---|---|---|---|
| n100 | 435 | 5.4172% | 302001.50 |
| n200 | 432 | 6.2198% | 550142.50 |
| n300 | 536 | 5.1711% | 829844.50 |
MATLAB代码中仍保留了严谨表述:
这是"本文启发式算法搜索得到的最小可行死区",而不是未经证明的数学全局极小值。
因为赛题本身要求的是逐步缩小轮廓直到寻找最小可行死区。
Q4 MATLAB方案
这一部分MATLAB没有用普通矩形近似T型和L型,而是完整采用:
正交多边形真实单元格 + 90°/180°/270°旋转 + 精确回溯覆盖
四个模块真实面积:
T型 b1 = 8
L型 b2 = 6
矩形b3 = 2
矩形b4 = 4
合计:
20
MATLAB精确搜索程序:
solve_exact_tiling.m
会枚举:
- 所有合法旋转;
- 所有平移位置;
- 模块之间是否重叠;
- 是否能够完整覆盖候选轮廓。
最终寻找4×5无空隙布局。
因此严格得到:
Q4最小面积 = 20
理由不是"程序搜索结果看起来是20",而是:
模块面积总和已经是20,所以任何轮廓不可能小于20;同时又存在面积20的合法完整拼接。
所以这一问能够严格证明全局最优。
MATLAB版还额外增加了两个验证程序
第一个:
validate_all
会独立重新检查:
- Q1所有模块是否重叠;
- Q2是否越界;
- Q2重新计算HPWL是否与优化输出一致;
- Q3是否越界;
- Q3重新计算HPWL;
- Q4是否恰好覆盖20个不同单元格。
第二个:
validate_against_reference
会把MATLAB实际运行结果和前面已经完整运行并通过独立验证的Python结果进行交叉比较。
项目中的:
reference_results/
保存的是Python参考结果,它们不会参与MATLAB优化计算,只是做交叉验证。
MATLAB运行后会自动生成论文图
包括:
q1_n100_layout.png
q1_n200_layout.png
q1_n300_layout.png
q1_n100_convergence.png
q1_n200_convergence.png
q1_n300_convergence.png
q1_deadspace_compare.png
q2_n100_layout.png
q2_n200_layout.png
q2_n300_layout.png
q2_hpwl_compare.png
q3_n100_layout.png
q3_n200_layout.png
q3_n300_layout.png
q3_deadspace_compare.png
q3_hpwl_q2_vs_q3.png
q4_optimal_tiling.png
同时自动输出:
results/q1_results.csv
results/q2_results.csv
results/q3_results.csv
results/validation_report.json
results/参赛结果汇总_MATLAB.md
可以直接拿数值补论文。