遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)

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

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

https://github.com/guojun007/sbx_cross

 1 #!/usr/bin/env python
 2 #encoding:UTF-8
 3 import numpy as np
 4 import random
 5
 6 """
 7     SBX 模拟二进制交叉
 8
 9 输入:
10     population 种群矩阵
11     alfa 交叉概率
12     numRangeList 决策变量的上限(下限默认为0)
13     mu    SBX方式的分布指数, 推荐为1
14 """
15 def cross(population, alfa, numRangeList, mu=1):
16     N=population.shape[0]
17     V=population.shape[1]
18     populationList=range(N)
19
20     for _ in xrange(N):
21         r=random.random()
22
23         if r<alfa:
24             p1, p2=random.sample(populationList, 2)
25             bq=np.array([0]*V)
26             randList=np.random.random(V)
27             #根据概率向量判断不同概率函数的选择
28             orTF=(randList<=0.5)
29
30             #计算不同决策变量的 不同概率选择 下的 系数
31             for j in xrange(V):
32                 if orTF[j]==True:
33                     bq[j]=(2.0*randList[j])**(1.0/(mu+1))
34                 else:
35                     bq[j]=(1.0/(2.0*(1-randList[j])))**(1.0/(mu+1))
36
37             #取出选定的两个个体
38             old_p1=population[p1, ]
39             old_p2=population[p2, ]
40             #计算交叉后的两个新个体
41             new_p1=0.5*((1+bq)*old_p1+(1-bq)*old_p2)
42             new_p2=0.5*((1-bq)*old_p1+(1+bq)*old_p2)
43
44             #上下限判断,防止越界
45             new_p1=np.max(np.vstack((new_p1, np.array([0]*V))), 0)
46             new_p1=np.min(np.vstack((new_p1, numRangeList)), 0)
47
48             new_p2=np.max(np.vstack((new_p2, np.array([0]*V))), 0)
49             new_p2=np.min(np.vstack((new_p2, numRangeList)), 0)
50
51             #将交叉后的个体更新回种群
52             population[p1, ]=new_p1
53             population[p1, ]=new_p2
54
55
56 ###以下是测试用例
57 if __name__=="__main__":
58     random.seed(0)
59     np.random.seed(0)
60     xN=20
61     yN=3
62     alfa=0.9
63     population=np.random.rand(xN*yN).reshape(xN, yN)*1.0
64
65     ###运行函数
66     print population
67     print ‘-‘*50
68     cross(population, alfa, np.array([1]*3))
69     print ‘-‘*50
70     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的问题的时候,竟然很多次都求解出来了!

时间: 2024-12-31 18:16:16

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

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

遗传算法中的交叉操作是 对NSGA-II  源码分析的  最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的  函数模块. 这里,首先提一下,遗传算法的  交叉操作.变异操作都是需要设定概率的, 即交叉概率和变异概率. 假设种群个体 大小为  popsize ,  那么交叉操作需要进行 popsize/2 次 ,   变异操作需要进行 popsize 次, 其中每次操作的时候都需要随机生成一个随机数来与给定的概率进行判断,若小于给定的概率则继续执行否则退出该操作. 如果继

基于实数编码(离散杂交+自适应变异),线性排名选择的遗传算法(附代码)

我们来看一个很简单的小问题f=x1+x2+x3+x4,x1.x2.x3.x4是大于等于10小于等于100的实数,求f的最大值. 这个小学生就能解决的问题我今天打算用遗传算法来解决,你可能说这不是智障吗?但是其实这只是一个小例子,因为用同样的方法,你可以解决f=x1^x2*x3^x4/x2^x1*x4^x3甚至是更复杂的问题,下面就来详细讲一讲. 基于对遗传算法的一般性了解,我就不再赘述详细过程(其实是因为上一篇写过了懒得再写一遍),只谈谈实数编码和线性排名选择策略. 实数编码顾名思义就是用实数进

C:TLV消息编码及常用操作

/* 1.TLV简介: 在通信系统中,两个设备之前必然存在消息交互,消息的格式也存在各种编码类型, 本文仅描述TLV编码的消息格式.Type-length-value(TLV)格式中T.L的长度固定, 通常为1-8个4个字节,V的长度不固定,由L的值表示,V的内容也可以嵌套子TLV格式. 举例:假设消息按大端模式存放,T占4个字节,L占2个字节,下面的消息: unsigned char pMsg[] = {0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01,0x01

3、操作元素:模拟键盘、鼠标事件

一.简单操作 1.点击(鼠标左键)页面按钮:click()  2.清空输入框:clear() 3.输入字符串:send_keys() 4.send_keys()如果是収送中文的,前面需加 u,如:u"中文",因为这里是输入windows 系统,windows 系统是 GBK 编码,我们的脚本是 utf-8,需要转码为 Unicode 国际编码,返样才能识别到 5.submit()模拟提交操作 二.模拟鼠标操作 在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionC

交叉表、行列转换和交叉查询经典

交叉表.行列转换和交叉查询经典分类: SqlServer 2007-12-05 16:01 6776人阅读 评论(1) 收藏 举报sqlsqlserverinsertnull产品sql server交叉表.行列转换和交叉查询经典一.什么是交叉表“交叉表”对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: 行列摘要字段“交叉表”中的行沿水平方向延伸(从一侧到另一侧).在上面的示例中,“手套”(Gloves) 是一行.“交叉表”中的

锐浪 报表, 当多行交叉报表时,对多行交叉报表中自由格中的多个字段控件,进行颜色控制. 取值 判断等实现

需要注意的点是: 1 . 要对自由格中对应的 字段框的背景填充方式改为:填充,否则没有效果. 2 . 代码中红色部门代码: Column 为明细网络对象属性中的 列集合 中的 交叉列的 名称,  Report.RunningDetailGrid.Columns.Item("Column_2") 3.  蓝色部门 为自由格中 控件的索引位置 ,也可以根据字段框的名称来进行控制如:  contentCell.Controls.Item("FieldBox8") 代码如下

字符编码、文件操作、函数定义

一.字符编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字符被编

字符编码及文件操作

一,字符编码 1,什么是字符编码 计算机要想工作必须通电,也就是说'电'驱使计算机干活,而'电'的特性,就是高低电平(高低平即二进制数1,低电平即二进制数0),也就是说计算机只认识数字 很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符? 必须经过一个过程: 字符--------(翻译过程)------->数字 这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码 2,字符编码的使用 上

python第三天:字符编码、文件操作、函数

作业问题回顾 表格化输出 主要考察字符串的expandtabs的方法,使用空格替换TAB. 百鸡百钱 百鸡百钱的主要是用进行多次判断,然后输出打印. 上课内容 字符编码 概念 编码是计算机用来将人类可读的字符存储成二进制信息而使用的一种格式.字符编码主要针对字符的编码. python中相关的方法 decode:解码,将其他格式的数据转化为unicode格式的数据.转化以后就是Bytes类型的数据.Bytes的数据汉字会转化成字节码,而ascii码会转化成b'meg'的形式.可以接参数,接的参数就