
一、赛题核心问题拆解
本题围绕VLSI布图规划(Floorplanning)展开,四个问题呈现递进逻辑:
| 问题 | 核心任务 | 难点 |
|---|---|---|
| 问题1 | 无固定轮廓、无连线,最小化包围盒面积(面积相同则长宽比≈1) | 二维装箱NP-hard,模块规模达300 |
| 问题2 | 固定正方形轮廓(死区15%),最小化总HPWL | 约束+目标双优化,Terminal参与线长计算 |
| 问题3 | 二分搜索最小可行死区比例 | 可行性判定的单调性利用 |
| 问题4 | 异形模块(L型/T型)装箱,求最小包围面积 | 几何表示升级,但规模仅4个模块 |
二、统一建模框架:B*树 + 快速模拟退火(Fast-SA)
这套框架是解决VLSI布图规划问题的经典方法,参考Chen & Chang(2006)的B*-Tree + Fast-SA方案。
2.1 B*树编码:把二维布局变成二叉树
核心思想 :不用坐标直接优化,而是用二叉树表示模块之间的拓扑关系。
-
左子节点:放在父模块右侧,紧贴着放(x坐标 = 父模块右边界)
-
右子节点:放在父模块上方,x坐标与父模块相同
解码过程:
-
根节点放在(0,0)
-
前序遍历B*树,根据左/右子关系确定每个模块的x坐标
-
用轮廓线数据结构计算y坐标(保证不重叠)
这样做的好处是:任何一棵B*树解码后都天然满足"模块不重叠"约束,搜索空间也从连续的坐标空间降为离散的树结构空间。
2.2 轮廓线法(Contour Structure)
想象一条从左到右的"天际线",记录每个x位置当前最高的模块顶部。新模块放置时:
-
根据B*树确定其x位置和宽度
-
查看该x区间内的最高天际线高度
-
将模块放在该高度之上
-
更新该区间的天际线
整个过程O(n)时间,且保证不重叠。
2.3 快速模拟退火(Fast-SA)
传统SA降温慢、迭代多。Fast-SA采用三阶段策略:
| 阶段 | 温度 | 行为 | 目的 |
|---|---|---|---|
| 第一阶段 | T→∞ | 接受几乎所有劣解 | 随机搜索,覆盖解空间 |
| 第二阶段 | T→0 | 几乎只接受优解 | 伪贪心局部搜索,快速收敛 |
| 第三阶段 | 升温后再降 | 适度接受劣解 | 爬山,跳出局部最优 |
邻域操作(扰动B*树):
-
旋转(Op1):某模块90°旋转,树结构不变
-
移动(Op2):删除某节点,插入树中另一位置
-
交换(Op3):交换两节点
三、四个问题的具体建模
3.1 问题1:无约束最小面积装箱
目标函数(字典序,面积优先):
text
F(Ω) = W × H + λ × |W/H - 1| × max(W,H)
λ取较小值,确保面积优先级高于长宽比。
算法流程:
-
从.blocks文件读取所有HardBlock的尺寸
-
随机初始化一棵B*树,随机旋转方向
-
Fast-SA迭代:扰动树结构→解码得坐标→计算F→Metropolis接受/拒绝
-
记录历史最优解
预期输出:n100/n200/n300各自的轮廓面积、长宽比、可视化布局图。
3.2 问题2:固定轮廓 + HPWL最小化
固定轮廓尺寸:
text
L = sqrt(total_block_area × (1 + 0.15))
HPWL计算:对每个线网,其所有引脚(HardBlock几何中心 + Terminal固定坐标)的外接矩形半周长:
text
HPWL(net) = (max_x - min_x) + (max_y - min_y)
总HPWL = 所有线网HPWL之和。
关键设计:自适应罚函数
固定轮廓约束下,直接固定罚权会导致两个问题:罚权太大→首次可行后停滞;罚权太小→难以找到可行解。
采用可行性反馈自适应方案:
text
α = α_base + (1 - α_base) × (n_feasible / n)
其中n_feasible是最近n个解中满足轮廓约束的数量。可行解多→降低轮廓罚权→集中优化HPWL;可行解少→提高罚权→先保证"装得进去"。
目标函数:
text
Cost = HPWL / HPWL_norm + α × Penalty_outline
注意:Terminal不参与面积和重叠约束,只在HPWL中作为固定引脚参与计算。
3.3 问题3:最小死区比例二分搜索
关键性质 :死区比例与可行性单调------若dr可行,则更大的dr一定也可行(芯片更大,原布局可直接放入)。
二分搜索算法:
text
low = 0, high = 0.15while high - low > ε: mid = (low + high) / 2 L = sqrt(total_area × (1 + mid)) 运行问题2的SA(固定轮廓L) if 找到可行布局: high = mid # 还能更小 else: low = mid # 太小了,放大return high
注意事项 :临界区附近SA可能因随机性失败,需多启动验证(多个随机种子),不能因一次失败就判为"不可行"。
3.4 问题4:异形模块(L型/T型)
修正思路:不重写整个算法,只升级底层几何表示。
处理方法:
-
分解:将L型分解为2个矩形,T型分解为3个矩形
-
刚体绑定:同一异形模块的子矩形在B*树中作为整体移动/旋转
-
扩展旋转:支持0°、90°、180°、270°
-
形状感知轮廓:轮廓线记录的不再是单一高度,而是模块真实下轮廓的逐段信息,允许凹槽嵌套
验证案例(图3的4个模块):由于只有4个模块且总面积确定,最小面积的下界就是总面积。若能构造无空隙拼接方案,即可证明达到全局最优。
四、数据依赖说明
本题求解需要以下三类文件:
-
.blocks:HardBlock名称+尺寸,Terminal名称
-
.nets:线网连接关系
-
.pl:Terminal固定坐标(你已提供)
当前你已有.pl文件,但.blocks和.nets是求解必需的。若有这两个文件即可实际运行算法输出具体数值。
五、论文结构建议
text
摘要1. 问题重述2. 问题分析(四问递进关系)3. 模型假设与符号说明4. 核心算法框架(B*树 + Fast-SA) 4.1 B*树编码与解码 4.2 轮廓线法 4.3 快速模拟退火5. 问题1模型与求解6. 问题2模型与求解(含自适应罚函数)7. 问题3模型与求解(二分搜索)8. 问题4模型修正(异形模块扩展)9. 结果分析(收敛曲线、可视化)10. 模型评价与改进参考文献附录:核心代码
通过网盘分享的文件:2026华数杯分享链接: https://pan.baidu.com/s/1z-QqhjqNqngh3u0EBTq9lg 提取码: 2x2i