本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉。

首先,给出个人用python2.7实现的代码,具体模块已上传到:

https://github.com/guojun007/sbx_cross

 #!/usr/bin/env python
#encoding:UTF-8
import numpy as np
import random """
SBX 模拟二进制交叉 输入:
population 种群矩阵
alfa 交叉概率
numRangeList 决策变量的上限(下限默认为0)
mu SBX方式的分布指数, 推荐为1
"""
def cross(population, alfa, numRangeList, mu=1):
N=population.shape[0]
V=population.shape[1]
populationList=range(N) for _ in xrange(N):
r=random.random() if r<alfa:
p1, p2=random.sample(populationList, 2)
bq=np.array([0]*V)
randList=np.random.random(V)
#根据概率向量判断不同概率函数的选择
orTF=(randList<=0.5) #计算不同决策变量的 不同概率选择 下的 系数
for j in xrange(V):
if orTF[j]==True:
bq[j]=(2.0*randList[j])**(1.0/(mu+1))
else:
bq[j]=(1.0/(2.0*(1-randList[j])))**(1.0/(mu+1)) #取出选定的两个个体
old_p1=population[p1, ]
old_p2=population[p2, ]
#计算交叉后的两个新个体
new_p1=0.5*((1+bq)*old_p1+(1-bq)*old_p2)
new_p2=0.5*((1-bq)*old_p1+(1+bq)*old_p2) #上下限判断,防止越界
new_p1=np.max(np.vstack((new_p1, np.array([0]*V))), 0)
new_p1=np.min(np.vstack((new_p1, numRangeList)), 0) new_p2=np.max(np.vstack((new_p2, np.array([0]*V))), 0)
new_p2=np.min(np.vstack((new_p2, numRangeList)), 0) #将交叉后的个体更新回种群
population[p1, ]=new_p1
population[p1, ]=new_p2 ###以下是测试用例
if __name__=="__main__":
random.seed(0)
np.random.seed(0)
xN=20
yN=3
alfa=0.9
population=np.random.rand(xN*yN).reshape(xN, yN)*1.0 ###运行函数
print population
print '-'*50
cross(population, alfa, np.array([1]*3))
print '-'*50
print population

以下内容引至:

http://blog.csdn.net/silence1214/article/details/48802317

最近在做作业遇到一个Dejong’s fifth function的multi modal的问题,用传统的GA方法尝试了很多次,的确没办法搞定,随机很多次也不一定在global optimum的地方得到一次解。前几天去导师家里的路上谈到这个事情,导师说一般现在都用SBX和polynomial的mutation。于是回来找了相关论文来看,找到了SBX最早的论文,奇怪的是,在论文中竟然没有给出伪代码,只是在讲解他的motivation。大概的motivation是这样的: 
1:SBX主要是用于real number的编码问题,但是借鉴与来自binary 编码的idea。在binary中,假设2个parent分别为p1和p2,后代分别为c1和c2。那么是这么一个属性的:(p1+p2)/2=(c1+c2)/2。再定义一个叫做spread factor的玩意β=|(c2−c1)/(p2−p1)|

2:在SBX中就要满足第一个属性,以及尽量β也binary中的概率分布一致。由此一个方案: 
c1=(p2+p1)−0.5∗β(p2−p1) 
c2=(p2+p1)+0.5∗β(p2−p1) 
大家可以自己计算,是满足上面2个玩意的。

3:那么接下来其实就是求β的,因为是要让在real的问题中的β的分布尽量接近binary中的,那么就要首先知道binary中的分布。binary中的分布如下: 
c(β)=0.5(n+1)βn,β≤1 and c(β)=0.5(n+1)1βn+2,β>1 
也就是说β有2个分布的,具体怎么做呢?我看到有人实现是这么来的。

3.1:随机一个数字在[0,1]之间,如果该数字小于等于0.5按照第一个来求,否则按照第二个来求。求解的时候是按照对β的概率分布等于这个随机数字来计算的。这个只需要求积分即可,手工就能推导出来。

最后我用这个方法再加上tournament selection以及polynomial mutation的方法,在求解上面说的multi modal的问题的时候,竟然很多次都求解出来了!

遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)的更多相关文章

  1. 标准遗传算法(实数编码 python实现)模拟二进制交叉SBX 多项式变异

    代码地址: https://github.com/guojun007/real_sga 本部分是采用实数编码的标准遗传算法,整体流程与上一篇二进制编码的基本一致, 主要区别在于本部分的交叉操作为模拟二 ...

  2. SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子

    一起来学演化计算-SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子 觉得有用的话,欢迎一起讨论相互学习 ...

  3. 多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover.c

    遗传算法中的交叉操作是 对NSGA-II  源码分析的  最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的  函数模块. 这里,首先提一下,遗传算法的  交叉操作.变异操作都 ...

  4. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  5. 字符编码py2,py3操作,SecureCRT的会话编码的设置

    对之前的字符串类型和二进制类型(bytes类型),可以这样关联记忆,把字符串类型当作是Unicode,把bytes类型当作是GBK或者UTF-8或者是日文编码.这样字符串要转成二进制,那么就需要编码e ...

  6. python学习道路(day3note)(元组,字典 ,集合,字符编码,文件操作)

    1.元组()元组跟列表一样,但是不能增删改,能查.元组又叫只读列表2个方法 一个 count 一个 index2.字典{}字典是通过key来寻找value因为这里功能比较多,所以写入了一个Code里面 ...

  7. 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)

    1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')  # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...

  8. Python-字典、集合、字符编码、文件操作整理-Day3

    1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...

  9. python开发基础之数据类型、字符编码、文件操作

    一.知识点 1.身份运算: 2.现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码.用记事本编辑的时候,从文件 ...

随机推荐

  1. asp.net和js读取文件的MD5值的方法

    前言 文件的md5值,即文件签名,为了验证文件的正确性,是否被恶意篡改等.每个文件有一个唯一的md5值. 最近公司开发的app文件包的校验就有用到文件md5值. 一.asp.net获取 ①和上传文件一 ...

  2. Amazon EC2免费VPS防止超额被扣钱三大方法:流量 硬盘读写 运行时长

    Amazon EC2也就是亚马逊云服务免费VPS主机服务,内存是613MB,月流量是30GB,主机空间是30GB,可以免费使用一年,又加上Amazon服务器全球多个节点CDN和本身的名气,早在2010 ...

  3. 安装Linux Mint

    1.尽量选择trusty的安装版本,kde和xfce不支持Win+..快捷键,推荐cinnamon:制作安装U盘后,选择非EFI模式启动:选择start Linux Mint(就是第一项): 2.In ...

  4. OpenGl在VS中的配置

    刚开始接触OpenGl的时候难免会遇到一些问题,这些问题可能和程序无关,只是一些编译环境的设置和头文件的安装,特别整理了一下,如下: (1)将gult32.dll,glut.dll复制到windows ...

  5. [css3]叉叉旋转效果

    .close_frame{display:inline-block;height:14px;width:14px;background:url("../images/closeiframe. ...

  6. iOS常用方法

    1.磁盘总空间大小 + (CGFloat)diskOfAllSizeMBytes {     CGFloat size = 0.0;     NSError *error;     NSDiction ...

  7. 《JavaScript高级程序设计》读书笔记--(3)引用类型

    ECMAScript从技术来说是一门面向对象的语言,但不具备传统的面向对象语言所支持的类和接口等基本结构.虽然引用类型与类看起来类似,但是他们并不是相同的概念.引用类型有时也被成为对象定义,因为它描述 ...

  8. wordpress及其simple_press插件完成 的中文论坛

    wordpress 及 其simple_press插件的论坛功能 开发准备: 一直从事java及as3方面的开发,首次听同事提起PHP的wordpress,于是上网查了下, 才知道这款软件的强大,转而 ...

  9. JSP内置对象---request 对象

    request.jsp: <%@ page language="java" import="java.util.*" contentType=" ...

  10. Dev 13.2 汉化教程(提供汉化cs文件下载)

    主要为了汉化 FindPanel里的Find和Clear控件名称,研究了一些时间. 废话不说.直接上干货. 1.已将cs文件分享,下载放到项目里. 下载链接: http://pan.baidu.com ...