Slice+模拟退火算法
-
github:https://github.com/gupta409/Floorplanner.git
-
filename
- inputFile: n30hard.blocks n30soft.blocks
- outputFile: n30soft.out
- data存着节点列表,每个节点代表一个块对象
-
生成初始化表达式,无序map:0,1,v,2,h,3,v,最后以v或者h结尾
-
readConfigData:获得coolDownRate,startTemperature,freezingTemperature,movesCoolDown,movesPerStep,boltzmanConstant
-
将表达式转为树,再计算cost
- polish_stack:0,1
- 0,1,v —》
- 对0,1的options的length从大到小排列
- 0_0,1_0的length最大的,搞成option
- 接着哪个length大,调小他,进行遍历,获得所有的新options
- insert:string, Node*,v_1_0
- polish_stack:v_1_0,2
- 依此循环,最后polish_stack有h_2_v_1_0
- nodes现在有过程中产生的所有新节点
- 获得最终生成的节点的所有options中area最小的那一个
- cost=长*宽
-
move方法(movesPerStep:每一步多少move)
- 将expression分成operator和operand,对连续的operand进行交换,这里的id指的是index,id1,id2,id2=id1+1,如果过界,就id2=id1-1,交换表达式中的id1和id2的位置
- 改变两operand之间的operators,0 1 2 v h 3 --> 0 1 2 h v 3
- validIndices:
- 0 1 2 v 3, push 2,因为1和v不等,且stack>=3,交换2和v,stack>=3保证交换后,符合树的规则
- 0 1 v 2 h, push v, 因为v和h不等,交换v和2
-
是否接受move,<exp(-1*(deltaCost/Temperature))
-
Dynamic change in MovesPerStep
- delCost<0:movesPerStep = movesPerStep+ 10;
- delCost>0且接受,则movesPerStep = movesPerStep-10;
-
降低温度,cooldown movestep,500 --》 500X0.99 --> 495X0.99无需管上面的±10,因为使用temp保存了临时。
-
根据得到的root,得到最优option,并反向推到出所有块的位置
- 找出所有符合条件的option,如当parent的cut-Type是垂直,则将左右子树的所有width<option.width的,分别储存起来
- 再判断left_option.length和right_option.length加起来是否等于option.length
- 就可以设置left_option为left的最优,依此类推
-
left的左下是parent的左下,right的右上是parent的右上
-
变量名 描述1 描述2 data list 软块构造方法:tempId, area, minRatio, maxRatio,会有三种options nodes unordered_map<string,Node*> id,node