Slice+模拟退火算法

Slice+模拟退火算法

  1. github:https://github.com/gupta409/Floorplanner.git

  2. filename

    • inputFile: n30hard.blocks n30soft.blocks
    • outputFile: n30soft.out
    • data存着节点列表,每个节点代表一个块对象
  3. 生成初始化表达式,无序map:0,1,v,2,h,3,v,最后以v或者h结尾

  4. readConfigData:获得coolDownRate,startTemperature,freezingTemperature,movesCoolDown,movesPerStep,boltzmanConstant

  5. 将表达式转为树,再计算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=长*宽
  6. 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
  7. 是否接受move,<exp(-1*(deltaCost/Temperature))

  8. Dynamic change in MovesPerStep

    1. delCost<0:movesPerStep = movesPerStep+ 10;
    2. delCost>0且接受,则movesPerStep = movesPerStep-10;
  9. 降低温度,cooldown movestep,500 --》 500X0.99 --> 495X0.99无需管上面的±10,因为使用temp保存了临时。

  10. 根据得到的root,得到最优option,并反向推到出所有块的位置

    • 找出所有符合条件的option,如当parent的cut-Type是垂直,则将左右子树的所有width<option.width的,分别储存起来
    • 再判断left_option.length和right_option.length加起来是否等于option.length
    • 就可以设置left_option为left的最优,依此类推
  11. left的左下是parent的左下,right的右上是parent的右上

  12. 变量名描述1描述2
    datalist软块构造方法:tempId, area, minRatio, maxRatio,会有三种options
    nodesunordered_map<string,Node*>id,node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值