进蛙跳算法Python代码

  • 蛙跳算法原理
  • Python代码
  • 参考文献

蛙跳算法原理

假设种群个数为 c h r o m n u m chromnum chromnum , 分组个数为 g r o u p n u m groupnum groupnum,那么每个组中的个体数量为 c h r o m n u m / g r o u p n u m chromnum / groupnum chromnum/groupnum。

  • 种群分组策略:先获得种群的适应度值,将适应度值从大到小排序,然后按照顺序依次分组,即排序第一为第一组第一个,排序第二位第二组第二个。。。直至分组完成。
    假设一个种群有100个个体 c h r o m [ 100 , d i m ] chrom[100,dim] chrom[100,dim],要分成5组,将种群的适应度值从大到小进行排序,得到 o r d e r _ c h r o m order\_chrom order_chrom,则 o r d e r _ c h r o m [ 0 ] order\_chrom[0] order_chrom[0]为全局最优个体, o r d e r _ c h r o m [ 0 : 5 ] order\_chrom[0:5] order_chrom[0:5]为每个组的最优个体,即局部最优个体, o r d e r _ c h r o m [ − 5 : 0 ] order\_chrom[-5:0] order_chrom[−5:0]为每个种群的最差个体,即局部最差个体。

  • 种群更新策略主要分为三步

    1. 采用更新策略,将局部最差个体向局部最优个体进化,如果更新后得到的种群适应度值有所提高,则继续进行下一步,否则,继续更新;
      F w = F w + r ( F b − F w ) , F w 为 局 部 最 差 个 体 , F b 为 局 部 最 优 个 体 , r 为 ( 0 , 1 ) 之 间 的 随 机 数 F_w = F_w + r(F_b - F_w), F_w为局部最差个体,F_b为局部最优个体,r为(0,1) 之间的随机数 Fw​=Fw​+r(Fb​−Fw​),Fw​为局部最差个体,Fb​为局部最优个体,r为(0,1)之间的随机数
    2. 在上一步更新失败的情况下,将局部最差个体向全局最优个体进化,如果更新后得到的种群适应度值有所提高,则继续进行下一步,否则,继续更新;
      F w = F w + r ( F g − F w ) , F w 为 局 部 最 差 个 体 , F g 为 全 局 最 优 个 体 , r 为 ( 0 , 1 ) 之 间 的 随 机 数 F_w = F_w + r(F_g - F_w), F_w为局部最差个体,F_g为全局最优个体,r为(0,1) 之间的随机数 Fw​=Fw​+r(Fg​−Fw​),Fw​为局部最差个体,Fg​为全局最优个体,r为(0,1)之间的随机数
    3. 在上一步更新失败的情况下,循环随机产生新个体,直至新个体的适应度值要高于局部最差个体,然后退出,执行下一步。

Python代码

class SFLA():def __init__(self, args, cfg, log, chromnum=500, groupnum=25, gens=20, dim=11):self.args = argsself.cfg = cfgself.log = logself.chromnum = chromnum #每个组中个数self.groupnum = groupnum #生成几个组self.gens = gensself.dim = dimself.chrom = t.zeros(size=(self.chromnum, self.dim), device=device)self.chrom_order = t.zeros(size=(self.chromnum, self.dim), device=device)self.BestChrom = t.zeros(size=(self.gens, self.dim), device=device)self.BestObjv = t.zeros(size=(self.gens,), device=device)self.group_best = t.zeros(size=(groupnum, self.dim), device=device)self.group_worst = t.zeros(size=(groupnum, self.dim), device=device)def get_init_chrom(self, chromnum): #这里根据自己的实际情况进行修改conv_num = self.cfg.PARA.CNN_params.conv_numconv_output = self.cfg.PARA.CNN_params.conv_outputfc_num = self.cfg.PARA.CNN_params.fc_numfc_output = self.cfg.PARA.CNN_params.fc_outputchrom_conv = self.get_chrom_conv(conv_num, conv_output, chromnum)chrom_fc = self.get_chrom_fc(fc_num, fc_output, chromnum)chrom = t.cat((chrom_conv, chrom_fc), dim=1) #按行拼接return chromdef get_objv(self, chrom): # 根据自己的需求进行修改chrom.to(t.int)objv = t.zeros(size=(chrom.shape[0], ))params_dict = self.chrom2paramsdict(chrom)for i in range(chrom.shape[0]):objv[i] = Train_GACNN(params_dict, i, self.args, self.cfg, self.log)# objv = t.rand(size=(chrom.shape[0], ))return objvdef update(self):start_time = time.time()self.log.logger.info('==> Init Chrom <==')self.chrom = self.get_init_chrom(self.chromnum)objv = self.get_objv(self.chrom)for gen in range(self.gens):self.log.logger.info('==> This is No.%d GEN <==' % (gen))'''1. 种群适应度值排序'''[objv_order, objv_index] = t.sort(objv, descending=False) #descending=False 表示从小到大排序 这里得到的objv是loss,越小越好for i in range(self.chromnum):self.chrom_order[i, :] = self.chrom[objv_index[i], :] #按照种群的适应度值进行排序'''2. 分组,记录种群中的最优个体'''self.group_best[:self.groupnum, :] = self.chrom_order[:self.groupnum, :]self.group_worst[:self.groupnum, :] = self.chrom_order[-self.groupnum:, :]'''3.记录种群中的最有个体和最大适应度值 全局最优个体和相应的适应度值'''self.BestChrom[gen,:] = self.chrom_order[0]self.BestObjv[gen] = objv_order[0]# pdb.set_trace()self.log.logger.info('GEN=%d, best_objv=%.5f, best_chromi=%s \n'% (gen, self.BestObjv[gen].cpu().numpy(), str(self.BestChrom[gen, :].cpu().numpy())))self.log.logger.info('==> Save Best_chromi_objv to file <==')with open(self.cfg.PARA.SFLA_params.save_data_path+'save_bestdata_all.txt', 'a') as f:f.write('Gens: %d, | BestObjvi: %.5f, | BestChromi: %s \n'%(gen, self.BestObjv[gen].cpu().numpy(), str(self.BestChrom[gen, :].cpu().numpy())))'''4.组内更新更新策略:a. 先用组内最优个体更新最差个体更新距离:Ds = rand() * (局部最好解Pb - 局部最差解Pw)更新后的青蛙:Dw = oldPw + Ds()b. 情况不好的话,再用全局最优个体更新组内最差个体更新距离:Ds = rand() * (局部最好解Px - 局部最差解Pw)更新后的青蛙:Dw = oldPw + Ds()c. 还不行,就随机生成一个新个体。'''for i in range(self.groupnum):rate1 = t.rand(1).cuda()temp_chromi1 = self.group_worst[i] + rate1 * (self.group_best[i] - self.group_worst[i])temp_chromi1 = temp_chromi1.round().to(t.int).reshape(1, -1)objv_temp_chromi1 = self.get_objv(temp_chromi1)if objv_temp_chromi1 < objv_order[i-self.groupnum]:self.log.logger.info('==> Update in best group <==')self.chrom_order[i-self.groupnum] = temp_chromi1objv_order[i-self.groupnum] = objv_temp_chromi1else:rate2 = t.rand(1).cuda()temp_chromi2 = self.group_worst[i] + rate2 * (self.BestChrom[gen] - self.group_worst[i])temp_chromi2 = temp_chromi2.round().to(t.int).reshape(1, -1)objv_temp_chromi2 = self.get_objv(temp_chromi2)if objv_temp_chromi2 < objv_order[i-self.groupnum]:self.log.logger.info('==> Update in best chrom <==')self.chrom_order[i - self.groupnum] = temp_chromi2objv_order[i - self.groupnum] = objv_temp_chromi2else:self.log.logger.info('==> Update in random chrom <==')while(1):temp_chromi3 = self.get_init_chrom(chromnum=1)objv_temp_chromi3 = self.get_objv(temp_chromi3)if objv_temp_chromi3 < objv_order[i-self.groupnum]:self.chrom_order[i - self.groupnum] = temp_chromi3objv_order[i - self.groupnum] = objv_temp_chromi3breakself.chrom = self.chrom_orderobjv = objv_orderend_time = time.time()self.log.logger.info('The time of Evoluation is %.5f s. ' %(end_time-start_time))self.Plot_Save()def Plot_Save(self):self.log.logger.info('==> Plot best_objv and save to file <==')"""保存最优结果,并绘制优化曲线self.BestChromself.BestObjv"""# np.savetxt(self.cfg.PARA.SFLA_params.save_data_path + 'BestChromi', self.BestChrom.numpy())# np.savetxt(self.cfg.PARA.SFLA_params.save_data_path + 'BestObjv', self.BestObjv.numpy())# plt.plot(np.arange(self.gens).astype(np.str), self.BestObjv.cpu().numpy())plt.plot(range(1, self.gens+1, 1), self.BestObjv.cpu().numpy())plt.title('BestObjv')plt.savefig(self.cfg.PARA.SFLA_params.save_data_path + 'bestobjv_pic')'''下面的这些函数是我自己为了实验要求进行书写的,实际上可以根据自己的需求进行合理的修改'''def chrom2conv(self, chrom): convs_all = []for i in range(chrom.shape[0]): # 0-9 == Nindconvs = []for j in range(chrom.shape[1] - 1):  # 0-5 ---> 0-4j = j + 1  # 1-5if j < 4:conv_num = 64 * 2 ** (j - 1)else:conv_num = 512if chrom[i, j] != 0:for t in range(chrom[i, j]):convs.append(conv_num)convs.append('M')# print(convs)convs_all.append(convs)return convs_alldef chrom2fc(self, chrom):fcs_all = []for i in range(chrom.shape[0]):  # 0-9 == Nindfcs = []for j in range(chrom.shape[1]):  # 0-4if chrom[i, j] != 0:hidden_neurons = 64 * chrom[i, j]fcs.append(hidden_neurons)fcs_all.append(fcs)return fcs_alldef get_chrom_conv(self, param_1, param_2, chromnum):"""param_1: 为卷积模块个数 [0]为下限,[1]为上限param_2: 卷积模块中对应的 out_channelschromnum: 一代种群的大小最后得到chrom"""chrom_conv = t.zeros(size=(chromnum, param_1[1]+1), dtype=int, device=device)for i in range(chromnum):num_param_1 = t.randint(low=param_1[0], high=param_1[1]+1, size=(1,), dtype=int, device=device)  # 不包括highnum_param_2 = t.randint(low=param_2[0], high=param_2[1]+1, size=(num_param_1,), dtype=int, device=device)chrom_conv[i, 0] = num_param_1chrom_conv[i, 1:num_param_1 + 1] = num_param_2return chrom_convdef get_chrom_fc(self, param_1, param_2, chromnum):"""param_1: fc 层数 2-5 [0]为下限,[1]为上限param_2: fc 中每层的神经元个数 [1,8] 在转换为fc时需要 * 64chromnum: 一代种群的大小最后得到chrom_fc"""chrom_fc = t.zeros(size=(chromnum, param_1[1]+1), dtype=int, device=device)for i in range(chromnum):num_param_1 = t.randint(low=param_1[0], high=param_1[1]+1, size=(1,), dtype=int, device=device)  # 不包括highnum_param_2 = t.randint(low=param_2[0], high=param_2[1]+1, size=(num_param_1,), dtype=int, device=device)chrom_fc[i, 0] = num_param_1chrom_fc[i, 1:num_param_1 + 1] = num_param_2return chrom_fcdef chrom2paramsdict(self, chrom):chrom = chrom.cpu().numpy()params_dict = {}chrom_conv = chrom[:, 0:self.cfg.PARA.CNN_params.conv_num[1]+1]chrom_fc = chrom[:, self.cfg.PARA.CNN_params.conv_num[1]+1:]params_dict['conv'] = self.chrom2conv(chrom_conv)params_dict['fc'] = self.chrom2fc(chrom_fc)return params_dict

参考文献

混合蛙跳算法原理介绍,附matlab代码

进化算法——蛙跳算法Python代码相关推荐

  1. 基于混合蛙跳算法优化SVM的滚动轴承故障诊断python实现

    1.混合蛙跳算法(SFLA)原理 混合蛙跳算法(SFLA)是一种受自然生物模仿启示而产生的基于群体的协同搜索方法,由局部搜索和全局信息交换两部分组成. 混合蛙跳算法中,每个青蛙的位置代表了一个可行解. ...

  2. matlab与水库调度,蛙跳算法优化水库调度,全局迭代中最优解未更新

    本人尝试利用蛙跳算法求解水库单目标调度,目标函数是极大值函数,在运算中适应值最大的解在全局迭代中一直未更新,调试算法 发现子群内更新时按适用度降序排列第一个最优解也未更新,不知道问题出在哪里,求大神指 ...

  3. 算法学习之模拟退火算法路径规划(python代码实现)

    模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...

  4. 【车间调度】基于改进蛙跳算法求解车间调度问题

    作业车间调度问题描述 作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一.其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加 ...

  5. 【车间调度】基于matlab混合蛙跳算法 (SFLA) 求解简单调度问题【含Matlab源码 2247期】

    ⛄一.车间调度简介 在传统的SFLA中,每一个青蛙的位置代表一个解,若干个青蛙组成的种群代表一个解的集合,种群被划分为不同的组,即模因组,对每个模因组执行搜索过程,当达到终止条件后,重新将模因组合并成 ...

  6. 基本蛙跳算法(Frog leaping algorithm,FLA)

    1.蛙跳算法原理 蛙跳算法是基于种群进化的元启发式算法之一,通过模拟自然界中青蛙觅食过程中种群所体现出的交流与合作行为,以实现对问题的求解.在一片湿地中,分布着一群青蛙,每只青蛙有自己的想法,每只青蛙 ...

  7. 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...

    为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...

  8. 关于蛙跳算法的计算机文献,文化蛙跳算法性能分析研究.PDF

    文化蛙跳算法性能分析研究.PDF 第24卷摇 第11期 计 算机 技 术 与发 展 Vol.24摇 No.11 2014年11月 摇 摇 摇 摇 摇 摇 摇 摇 摇 摇 COMPUTERTECHNOL ...

  9. 【BP回归预测】基于matlab随机蛙跳算法SFLA优化神经网络数据回归预测【含Matlab源码 2272期】

    ⛄一.蛙跳算法 1 改进的免疫蛙跳算法 免疫蛙跳算法具有混合蛙跳算法的全局优化与局部细致搜索优点, 可以优化连续问题和离散问题, 具有较强的鲁棒性;同时, 群体具有的免疫机制对群体进行控制和调节, 把 ...

最新文章

  1. GEO数据挖掘(3)-芯片基础知识
  2. Java常见面试题(持续更新)
  3. Apple Catching POJ - 2385(基础的动态规划算法)
  4. java中的ackerman_java8的函数式接口
  5. GBDT(MART) 迭代决策树入门教程
  6. 对比,还原真实的GPU池化
  7. CentOS被攻击的分析过程
  8. Customizing AxWebBrowser, make it powerful
  9. 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数...
  10. mysql 1118_mysql innodb 引擎 ,建表时报错:ERROR 1118 (42000)
  11. Java的Number和Math类
  12. Windows 利用DbgView 查看内核打印日志
  13. 力扣 69. x 的平方根 三种方法
  14. Windows安装Visio流程图软件
  15. Android云真机原理以及云真机平台搭建实践
  16. android+录制测试脚本,UIRecorder录制android APP自动化脚本
  17. linux下搭建测试环境
  18. 自助装机配置专家点评3
  19. 超越YOLOv4-tiny!YOLObile:移动设备上的实时目标检测 [左侧有码]
  20. Redis5.0源码解析(一)----------简单动态字符串(SDS)

热门文章

  1. 转:python各种库
  2. [论文翻译]Pruning and Quantization for Deep Neural Network Acceleration: A Survey
  3. SpringBoot-多模块打包与问题排解
  4. Windows 10下视频播放器泛黄,颜色太暖、太亮
  5. 隔离霜和防晒霜一样吗?隔离霜和防晒霜的这5大区别你得知道!
  6. C++题解:幼儿园买玩具
  7. 禁止输入表情及其他符号
  8. MySQL数据库03 数据库查询语句汇总
  9. 萧红《生死场》读后感
  10. MATLAB作图技巧汇总