文章目录

  • 前言
  • 一、优化的内容
  • 二、优化后的代码部分
  • 三、遗传算法使用心得总结

前言

本文主要记录一下我在优化带约束的遗传算法过程踩的一些雷,以及需要注意的一些问题。优化代码的主要部分可以见前面的文章(利用深度学习模型基于遗传算法(GA)寻求最优解)。

一、优化的内容

简单介绍一下需要的优化的部分,调用的深度学习模型有四个输出,需要根据其中两个进行优化。保证在输出热量最小的前提下,获取最大的流量。由于模型训练时进行了归一化,所以在求真实值时,要先还原。

二、优化后的代码部分

简单说一下优化思路:以流量作为遗传算法的适应度。既然要保证最小热量,先求出最小热量对应的流量,在此基础上乘一个惩罚系数得到非最小热量点能达到的最大流量SCCM_max,其他非最小热量点对应的流量都应小于SCCM_max,再依据热量的大小分配适应度的大小,Y_TEMP = 1e-7 + (Q_real_max - abs(Q_real))/(Q_real_max-Q_real_min)*SCCM_max ,热量越小,适应度越大,最大值SCCM_max,最小0。

def F(x):num = x.shape[0]X2 = []T = FalseSCCM_max = 4   #非热中性点和非最低热值点可以取的最大值(归一化后)Q_real_min = 10  #热量真实值最小值初值Q_real_max = 0  #热量真实值最大值初值for i in range(num):   #将种群参数加上固定参数组成训练模型的输入X = [nor_V, nor_I, nor_T, x[i]]X2.append(X)Xtest = np.array(X2)X_test = Xtest.reshape(-1, 4)Y_pre = model.predict(X_test)for i in range(num):  #遍历,判断能否达到热中性if Y_pre[i, 0] > 3.8 or Y_pre[i, 0] < 0:  # 当预测值出现偏差超出最大流量限制,或比最小流量小时,跳出循环print("\n参数选择异常,SCCM>1200或SCCM<300,请重新选择合理参数\n")exit()Q_real = (Y_pre[i, -1] - 0.2) / 0.8 * (9.4078 + 1.4588) - 1.4588  # 将输出参数由归一化值转为实际值# if Y_pre[i, 0] < SCCM_min:  #流量的最小值(归一化后)   最小值可能比能达到的最大值SCCM_MAX大  所以不如取0#     SCCM_min = Y_pre[i, 0]if abs(Q_real) < 1e-7:T = Trueif Y_pre[i, 0] < SCCM_max:SCCM_max = 0.7 * Y_pre[i, 0]   #如果能达到热中性,所有热中性点中的最小SCCM为非热中性点可以达到的最大值,非热中性点适应度应当更小,加上惩罚数if abs(Q_real) > Q_real_max:Q_real_max = abs(Q_real)   #得到该条件下热量真实值最大值i_last = 0if T == False:   #如果达不到热中性计算热量最小值for i in range(num):Q_real = (Y_pre[i, -1] - 0.2) / 0.8 * (9.4078 + 1.4588) - 1.4588  # 将输出参数由归一化值转为实际值if abs(Q_real) < Q_real_min:Q_real_min = abs(Q_real)i_last = iSCCM_max = 0.7 * Y_pre[i, 0] #最小放热量对应的流量,应成为其他点可以达到的最大适应度# if SCCM_max < 0:  #防止非热中性点的流量归一化值在加上惩罚数以后小于最小0#     SCCM_max = 0.0000001for i in range(num):    #限制条件:热中性,同时排除个别误差值较大的数据的影响Q_real = (Y_pre[i, -1] - 0.2) / 0.8 * (9.4078 + 1.4588) - 1.4588  # 将输出参数由归一化值转为实际值if abs(Q_real) > 1e-7:if abs(Q_real) > Q_real_min:Y_TEMP = 1e-7 + (Q_real_max - abs(Q_real))/(Q_real_max-Q_real_min)*SCCM_max  #惩罚函数,无法达到热中性时减小适应度,离最低Q越近适应度越大,不能超过SCCM_maxif Y_TEMP < Y_pre[i, 0]:   #加上惩罚函数的适应度小于原适应度,替换原适应度Y_pre[i, 0] = Y_TEMPQ_MIN_EPOCH.append(Q_real_min)xH2O.append(Xtest[i_last, 3])return Y_pre[:, 0]   #返回燃料极流量归一化值

三、遗传算法使用心得总结

1、初始种群数量不宜过大过小,一般在50-200,对不同问题的适应程度也不一样,过大会导致收敛慢,最大适应度的个体对整体进化的影响小,可能会导致优化解震荡,过小可能陷入局部最优。例如:当初始种群数量选择100时,收敛情况如下图:

当初始种群数量选择200时,会频繁震荡

2、基因编码的位数不宜过多过少,例如,当选择编码位数为10时,有下图

当选择基因编码位数为5时,有下图

3、惩罚函数不宜过大过小,惩罚函数过大会导致直接收敛,容易陷入局部最优解,过小会导致求解震荡。
4、当求解震荡时,可能是因为适应度取值太小,解决方案可以选择,一、进行指数扩大,放大适应度,二、加判定收敛的条件,当适应度变化连续小于多少时,结束循环。前者适用于适应度很小影响大的,后者适用于适应度小范围变化影响不大的情况,如本文中的,虽然从图像来看波动很大,但实际上,适应度变化很小,是因为坐标轴刻度比较小。

带约束的遗传算法代码优化相关推荐

  1. 万字字符长文带你了解遗传算法(有几个算例源码)

    一.遗传算法的基本概念 简单而言,遗传算法使用群体搜索技术,将种群代表一组问题解, 通过对当前种群施加选择.交叉和变异等一系列遗传操作来产生新-一代的种群,并逐步使种群进化到包含近似最优解的状态.由于 ...

  2. Python遗传算法工具箱的使用(一)求解带约束的单目标优化

    加了个小目录~方便定位查看~ 前言 正文 一. 基础术语: 二. 遗传算法基本算子: 三.完整实现遗传算法: 四.后记: 前言 网上有很多博客讲解遗传算法,但是大都只是"点到即止" ...

  3. matlab imf1,NGPM_v1.4y GA多目标优化的程序 带约束 里面有教程 matlab 272万源代码下载- www.pudn.com...

    文件名称: NGPM_v1.4y下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 390 KB 上传时间: 2015-03-31 下载次数: 24 提 供 者 ...

  4. 带约束进化算法问题分析Constrained Evolutionary Algorithms

    经典论文<Evolutionary Algorithms for Constrained Parameter Optimization Problems>对带约束的进化算法进行了综述,本文 ...

  5. UA MATH575B 数值分析下IV 带约束的优化

    UA MATH575B 数值分析下IV 带约束的优化问题 带等式约束的优化问题 带不等式约束的优化问题 同时带等式约束与不等式约束的优化问题 今天不想敲公式,就不写理论了,反正方法也就是前面的Newt ...

  6. 运筹优化(十二)--带约束非线性规划(NLP)

    线性约束的非线性规划 许多可以被有效解决的大型非线性规划中所有或者几乎所有的约束,都是线性的.只是将目标函数扩展为非线性.相对来说容易解决. 下面四种规划是特殊的NLP问题 凸规划 若最优化问题的目标 ...

  7. 三角剖分与Delaunay三角剖分及带约束的Delaunay三角剖分

    本博客参考 http://blog.csdn.net/raby_gyl/article/details/17409717 http://baike.baidu.com/view/1691145.htm ...

  8. 基于带约束S型加减速曲线的空间直线插补与空间圆弧插补算法(Matlab)

    写在前面 学习代码都记录在个人github上,欢迎关注~ Matlab机器人工具箱版本9.10 在前面的博文中: 基于抛物线过渡(梯形加减速)的空间直线插补算法与空间圆弧插补算法(Matlab) 基于 ...

  9. 带约束的K-means聚类算法

    带约束的K-means 聚类算法 1. 前言 上一期学习了K-means聚类算法,聚类是不受到限制的,单纯的无监督学习,但是当存在一些约束时,比如对每一簇的聚类样本点数量有限制,或者每个样本点带需求, ...

  10. 公开课精华|机器人的带约束轨迹规划

    本文章总结于大疆前技术总监,目前在卡内基梅隆大学读博的杨硕博士在深蓝学院的关于机器人的带约束轨迹规划的公开课演讲内容. --------全文约5000字-------- 笔者不是机器人领域的,因此特地 ...

最新文章

  1. java基础----Java的格式化输出
  2. CentOS常用指令
  3. Grpc Proto To Nuget Package 插件使用说明
  4. 经典笔试编程题--Java实现
  5. (摘要)新基建风口下,今年工业互联网平台将呈现十大新特征
  6. 类加载器 java委托机制_解析Java虚拟机中类的初始化及加载器的父委托机制
  7. Ubuntu18.04报错:Aborted (core dumped) (classes.jar.toc.tmp ) ninja: build stopped: subcommand failed解决
  8. Hadoop 2.2.0 在centos6.2 64位下的安装--分布式模式
  9. 看到Apache协议 BSD协议,你知道啥意思吗
  10. java 微博爬虫 cookie_微博爬虫——自动获取访客Cookie - GXUZF.COM - 林澈思的茶
  11. lzg_ad: SQL SERVER2000安装问题
  12. 4133:垃圾炸弹 百练noi Java枚举
  13. jsp大学生兼职信息管理系统
  14. 怎么办?不到 20 人的 IT 公司我该去吗?
  15. JS中的NaN和isNaN
  16. python矩阵和向量乘积_矩阵与向量的乘积
  17. 制造业车间生产管理系统(精诚MES)
  18. 程序yuan开发-windows小工具:gif截图-LICEcap、文件查找-Everything、远程软件-TeamView、视频播放-PotPlayer、markdown编辑-Typora、
  19. 【HTML作业】HTML登录界面
  20. eNSP搭建基础网络

热门文章

  1. mysql-plus多数据库_MyBatis-Plus实现多数据源的示例代码
  2. 基于python的贴吧舆情监控助手实战
  3. Neotoma数据库学习第二天
  4. 【专题】CSDN下载频道5月热门资源top100汇总
  5. Linux 常用命令 权限管理命令
  6. 比特鹏哥c语言视频,跟着鹏哥学习C语言
  7. 简易c语言编程软件,c语言开发工具下载
  8. 电脑有网但是有的软件显示无网络连接服务器,有网络连接,但浏览器不能上网怎么办?电脑高手教你怎么解决...
  9. 自定义viewFlipper
  10. 冒泡排序法C语言代码