序列对+模拟退火算法
- github:https://github.com/Twl09008181/SequencePair-based-floorplan.git
- 解析文件
- id都是从0开始,这样才符合C++数据结构,只有再设置一个map即可
- 初始化序列对,blockHeight,sp
- 将blockHeight作为weight,生成weight_map,<id,weight>,并按照weight从小到大排列
- 为了让前一半的weight,和另一半的weight的sum差不多<a1,a2,a3,a4>转为<a1,a4,a3,a2>
- 将weight_map分为两半,l1和l2,S1 = <l1,l2> S1 = <l1,l2>
- 记录s2的索引,遍历s1,与课本一样,返回length尾巴,作为width
- 也就是利用LCS算法,得到width,Height,以及各个块排放的位置
- cost计算
- 当出界时:return area * (1+100 * ration penalty)
- 当不出界时: w * h
- move方法
- op=0,rotate id1, 交换宽高
- op=1,交换s1中的id1和id2,以及索引
- op=2,交换s2中的id1和id2,以及索引
- op=3,交换s1,s2中的id1和id2,以及索引
- 判断是否choose
- chance < std::exp(-delta_cost * initTemp / temp);
- 如果不选择,要recover
- movetime加到k * fp.sp.S1.size(),温度降低一次
- 温度小于某个值后,停止循环
- 循环10次,每次减小fitinRatio
- 模拟退火后,该代码计算cost用了线长,后期要改一改
| 变量名 | 描述1 | 描述2 |
|---|---|---|
| alpha | ||
| blockNum | std::vector | id,width,height,llx,lly |
| terminalNum | std::map<size_t, size_t> | id,index |
| outline | std::pair<int,int> | 边界w和h |
| blockWidth | std::vector | |
| blockHeight | std::vector | |
| blockMap | std::mapstd::string,int | blockName,i |
| TerminalMap | std::mapstd::string,int | |
| terminals | std::vector | int x,y; |
| Netlist | std::vector | std::list blocks;std::listterminals; |
| sp | S1, S2, S1_idx, S2_idx | S1,S2只记录id,S1_idx, S2_idx记录id的索引 |
该博客介绍了如何使用模拟退火算法解决序列对布局问题。首先,通过初始化序列对和权重映射,并进行序列对的重新排列,确保权重分布均匀。接着,利用最长公共子序列算法计算布局的宽度和高度。成本计算涉及出界惩罚和面积计算。move方法实现了四种操作:旋转、交换序列对内的元素以及交换序列对之间的元素。通过概率判断是否接受新的布局,同时动态调整温度。最终,在满足特定条件后停止循环,实现布局优化。此代码目前计算成本基于线长,未来计划改进。
474

被折叠的 条评论
为什么被折叠?



