Page 154 - 《软件学报》2020年第9期
P. 154

蔺一帅  等:智能仓储货位规划与 AGV 路径规划协同优化算法                                                  2775


             4.    fit←fit_val(P k )                   /*计算适应值*/
             5.    Best_fit←fit                        /*初始化最佳个体*/
             6.    for k to Max_Gerenation
             7.       selectoperator                   /*选择算子*/
             8.       crossings                        /*交叉操作*/
             9.       variation                        /*变异操作*/
             10.      P k ←Rebuild(P k )               /*再次优化路径*/
             11.      if Best_fit<fit_val(P k )        /*判断是否为最佳个体*/
             12.        then Best_fit←fit_val(P k )    /*代替最佳个体*/
             13.      end if
             14.   end for
             15.   return P Best
             16.   end funcation
             具体来说,在遗传算法计算过程中,首先对目标结果进行编码,路径编码方式为排列编码.例如,[1,2,5,6,7,8]
         表示从 1 号点出发,途径 2,5~7 这些点,最终到达 8 号点.路径坐标点序号作为基因参与算法运算.根据起始点到
         目标点序号,生成随机可行的路径序列,称为初始种群.
             然后对此种群进行适应值计算,如公式(7)所示:
                                                     1
                                       fit =                                                  (7)
                                          ⎛        ⎛      1    ⎞  ⎞
                                          ⎜  path length ⎜  *1+  ⎟  ⎟
                                          ⎜        ⎜   node  − 1 ⎟  ⎟
                                          ⎝        ⎝       num  ⎠  ⎠
         其中:path length 参数与 fit 适应度值成反比,表示路径越短,适应度值越优秀,选择出来的路线也越贴近最优解.适应
         值越大,意味着这个个体越优秀.node num 表示转弯次数,取值大于等于 1.node num 参数的添加,是考虑到转弯因素
         对路径规划的影响,1+           1     系数对 path length 参数的微调,使算法在路径选择中尽可能避免选择拐弯次数
                             node  − 1
                                num
         过多的路线.经过实验验证:node num 的加入,有效地减少了算法选择转弯次数过多的路线.将基于该公式计算出
         的初始种群中所有个体的适应值记录下来,再对此种群进行交叉和变异操作.
             本文基于轮盘赌法对交叉和变异操作的对象进行选取,以使得适应度越大的个体被选中的概率越大.轮盘
         赌选算子可以根据个体适应值在群体中所占比例,结合该算子被选中的累积概率,再取一个 0 到 1 之间的随机
         值,比较子代个体的适应度比例和随机值大小,选取子代适应值高的个体参与到遗传运算中,进一步提高整个种
         群的适应值,从而取得更优的最终结果,或者让该种群向更优的结果发展.具体来说,我们先计算该种群的适应
         值总和 fit_sum,然后,计算每个个体的适应值占比 rfit=fit/it_sum 和各部分累积概率 cfit(如公式(8)所示):
                                        cfit   =  cfit  +  rfit                               (8)
                                          popnext i  popnext i− 1  popnext i
         其中,i≤popsize(种群大小),popnext i 为第 i 代种群,popcurrent i 为第 i 代种群的副本.
             随后遍历种群副本 popcurrent i ,而后生成一个 0-1 之间的随机数 p.比较子代个体的 cfit 和 p 的值,直到 cfit
         比 p 大时,该个体代替 popcurrent i 中此位置的个体.最后,将 popcurrent i 的所有值赋给 popnext i .
             在交叉操作的实现中,交叉次数是路径点总数的 1/4,具体计算出的次数向下取整.每次交叉操作方法相同.
         首先,随机选取此种群中的某一条路径,在此路径上找到一个随机点设为交叉点 q,然后寻找另一条也通过此点
         的基因.设 p1,p2 为原选出基因.将 p1 中 q 点以后的点被 p2 中 q 点以后的点代替生成新的基因 p1,再将 p2 中 q
         点以后的点由 p1 中 q 点以后的点代替生成新的基因 p2.对 p1 和 p2 进行路径再优化,然后计算并更新 p1 和 p2
         的适应值、路径长度和转弯次数,完成交叉操作.
             在变异操作中,首先判定是否发生变异.基于预设变异几率(mutationRate),根据 random=Math.random(⋅)*
         (1.0/mutationRate)计算变异率(Math.random(⋅)为随机数生成函数).此时,若 random 为 0,则执行变异.变异时,先随
   149   150   151   152   153   154   155   156   157   158   159