标准遗传算法(实数编码 python实现)模拟二进制交叉SBX 多项式变异
代码地址:
https://github.com/guojun007/real_sga
本部分是采用实数编码的标准遗传算法,整体流程与上一篇二进制编码的基本一致,
主要区别在于本部分的交叉操作为模拟二进制交叉,即SBX ,
变异操作 为 多项式变异。
real_sga/crossover/crossover.py
#实数编码,SBX交叉
def crossover(population, pcross_real, V, minRealVal, maxRealVal, eta_c):
for i in xrange(0, len(population), 2):
#如果随机概率大于交叉概率则不进行交叉操作
if random.random()>pcross_real:
continue #对两个个体执行SBX交叉操作
for j in xrange(V):
#对某自变量交叉
ylow=minRealVal[j]
yup=maxRealVal[j]
y1=population[i][j]
y2=population[i+1][j]
r=random.random()
if r<=0.5:
betaq=(2*r)**(1.0/(eta_c+1.0))
else:
betaq=(0.5/(1.0-r))**(1.0/(eta_c+1.0)) child1=0.5*( (1+betaq)*y1+(1-betaq)*y2 )
child2=0.5*( (1-betaq)*y1+(1+betaq)*y2 )
child1=min(max(child1, ylow), yup)
child2=min(max(child2, ylow), yup) population[i][j]=child1
population[i+1][j]=child2
以上代码是根据相关论文所写,是原始方式的化简版本。
以下给出官方的原始代码的 Python2.7 重构版。
#实数编码,SBX交叉
def crossover(population, pcross_real, V, minRealVal, maxRealVal, eta_c):
for i in xrange(0, len(population), 2):
#如果随机概率大于交叉概率则不进行交叉操作
if random.random()>pcross_real:
continue
#对两个个体执行SBX交叉操作
for j in xrange(V):
#判断是否对某自变量交叉
if random.random()>0.5:
continue
#如果两个体某自变量相等则不操作
if population[i][j]==population[i+1][j]:
continue
#对某自变量交叉
y1=min(population[i][j], population[i+1][j])
y2=max(population[i][j], population[i+1][j])
ylow=minRealVal[j]
yup=maxRealVal[j]
r=random.random()
beta=1.0+(2.0*(y1-ylow)/(y2-y1))
alpha=2.0-beta**( -(eta_c+1.0) )
if r<=(1.0/alpha):
betaq=(r*alpha)**(1.0/(eta_c+1.0))
else:
betaq=(1.0/(2.0-r*alpha))**(1.0/(eta_c+1.0))
child1=0.5*( (y1+y2)-betaq*(y2-y1) ) beta=1.0+(2.0*(yup-y2)/(y2-y1))
alpha=2.0-beta**( -(eta_c+1.0) )
if r<=(1.0/alpha):
betaq=(r*alpha)**(1.0/(eta_c+1.0))
else:
betaq=(1.0/(2.0-r*alpha))**(1.0/(eta_c+1.0))
child2=0.5*( (y1+y2)-betaq*(y2-y1) ) child1=min(max(child1, ylow), yup)
child2=min(max(child2, ylow), yup)
population[i][j]=child1
population[i+1][j]=child2
多项式变异:
#Routine for real polynomial mutation of an individual
#实数编码的常规多项式变异 def mutation(population, pmut_real, V, minRealVal, maxRealVal, eta_m):
for i in xrange(len(population)):
for j in xrange(V):
r=random.random()
#对个体某变量进行变异
if r<=pmut_real:
y=population[i][j]
ylow=minRealVal[j]
yup=maxRealVal[j]
delta1=1.0*(y-ylow)/(yup-ylow)
delta2=1.0*(yup-y)/(yup-ylow)
#delta=min(delta1, delta2)
r=random.random()
mut_pow=1.0/(eta_m+1.0)
if r<=0.5:
xy=1.0-delta1
val=2.0*r+(1.0-2.0*r)*(xy**(eta_m+1.0))
deltaq=val**mut_pow-1.0
else:
xy=1.0-delta2
val=2.0*(1.0-r)+2.0*(r-0.5)*(xy**(eta_m+1.0))
deltaq=1.0-val**mut_pow
y=y+deltaq*(yup-ylow)
y=min(yup, max(y, ylow))
population[i][j]=y
标准遗传算法(实数编码 python实现)模拟二进制交叉SBX 多项式变异的更多相关文章
- 遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)
本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉. 首先,给出个人用python2.7实现的代码,具体模块已上传到: https://github.com/guojun007/sb ...
- SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子
一起来学演化计算-SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子 觉得有用的话,欢迎一起讨论相互学习 ...
- 标准遗传算法(二进制编码 python实现)
代码地址:https://github.com/guojun007/binary_sga 种群初始化: binary_sga/population_init/population_init.py #种 ...
- Python编程笔记二进制、字符编码、数据类型
Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...
- 用python实现模拟登录人人网
用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...
- Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 format函数字符串格式化 帮助
Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 format函数字符串格式化 帮助 目录 Pychar ...
- Python实现模拟登陆
大家经常会用Python进行数据挖掘的说,但是有些网站是需要登陆才能看到内容的,那怎么用Python实现模拟登陆呢?其实网路上关于这方面的描述很多,不过前些日子遇到了一个需要cookie才能登陆的网站 ...
- Python字符串与二进制串的相互转换
python基础知识之字符编码与转换 - 机壳啦 - 博客园https://www.cnblogs.com/home979/p/7838244.html Python 字符串与二进制串的相互转换 - ...
- 员工管理系统+字符编码+Python代码文件操作
员工管理系统+字符编码+Python代码文件操作 1.员工管理系统 1.1 debug 代码调试 1.先使用鼠标左键在需要调试的代码左边点击一下(会出现一个红点)2.之后右键点击debug运行代码 ...
随机推荐
- spatial-temporal information extraction典型方法总结
==================================== 咳咳咳 由于科研的直接对象就是video sequence,所以,如何更好地提取spatial-temporal inform ...
- Rabbitmq vs. kafka
https://mp.weixin.qq.com/s/2i_9TWoF3TsJvG6Dj_75vw http://www.cnblogs.com/valor-xh/p/6348009.html htt ...
- Docker安装指定版本
今天新增一个Docker服务器,Docker安装顺利,启动hello-world测试的时候却出现了问题: $ docker run hello-worldUnable to find image 'h ...
- [CB转帖]台湾晶圆厂产能居全球第一 大陆排名第五但增长最多
台湾晶圆厂产能居全球第一 大陆排名第五但增长最多 据台湾地区媒体报道,近日市场调查机构IC Insights发布了各个地区或国家晶圆厂月产能排名,其中台湾地区排名第一,韩国排名第二,日本排名第三,美国 ...
- [转帖]论iPhone处理器十年进化史
论iPhone处理器十年进化史 导读: 今天,苹果发布了最新一代的iPhone,作为新一代的旗舰,新手机的功能承载了苹果对未来的希望和消费者的期待.但从我们半导体人看来更关注的是内部技术的演变,尤其是 ...
- python 时间转换相关
最近需要操作时间的地方相当的多,包括打点,包括时间转换. 罗列最近遇到的两个需求. 1. 关于上篇文章写的base64上传图片的问题,我使用了打点来计算解码需要多少时间.这个对时间精度要求是比较高的. ...
- 关于super的理解,三篇文章支撑起来的
1.有向图的拓扑排序https://blog.csdn.net/wp1603710463/article/details/50900892 2. Python中MRO算法 http://mp.weix ...
- BZOJ5252 八省联考2018林克卡特树(动态规划+wqs二分)
假设已经linkcut完了树,答案显然是树的直径.那么考虑这条直径在原树中是怎样的.容易想到其是由原树中恰好k+1条点不相交的链(包括单个点)拼接而成的.因为这样的链显然可以通过linkcut拼接起来 ...
- LAMP和LNMP去除index.php访问
使用TP或者Laravel开发的时候,后时候会遇到需要加index.php才能正常访问 LAMP解决方法 1.修改配置 打开配置文件(如:httpd.conf),找到你网站根目录的配置,将AllowO ...
- [TJOI2011]构造矩阵
考虑优化贪心,不回溯,对于每一位,你都判一下放0的话后面是否有解,用网络流判是否可以完美匹配就行了. 但这样时间复杂是错的,所以不必每次都重新建图,现在原来的图中看一下该行列是否已经匹配,若没有,则强 ...