序列对+模拟退火算法
- 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的索引 |