采用浮点数编码的遗传算法的问题

  最近学习了一下遗传算法,于是参考了一篇论文,采用浮点数编码写了一个算法,运行了一下,发布收敛很慢,遗传了几百代与几十代相比,只是略显稳定,随机性比较强。而且容易限入局部极值中。例如,我以求函数xsin(10PI*x)+2.0为例,最大值大约在x=1.85附近,在x=1.65附近有一个局部极值。我写的算法大约70%的机会取得1.85附近的值,30%机会取得1.65附近的值。总之效果不理想。不知有没有朋友有兴趣帮我看一下。

  初始化种群

public List<PopUnit> InitPop()

{

if (CalculateFitnessHanler == null)

throw new Exception("未设置计算表达式的事件CalculateHanler");

if (m_Parameters.PopSize<=10)

throw new Exception("种群数太小");

List<PopUnit> pool = new List<PopUnit>();

for (int i = 0; i <= m_Parameters.PopSize-1; i++)

{

double d = m_Random.NextDouble();

d = m_Parameters.L + (m_Parameters.R - m_Parameters.L) * d;

double val= CalculateFitnessHanler(new double[] { d });

PopUnit unit = new PopUnit(d, val);

pool.Add(unit);

}

return pool;

}

  选择操作

public List<PopUnit> Select(List<PopUnit> data)

{

int dropoutCount = (int)(m_Parameters.DropoutRate * data.Count);

List<PopUnit> newpool = new List<PopUnit>();

for (int i = 0; i <= dropoutCount - 1; i++)

{

newpool.Add(data[i].Clone() as PopUnit);

newpool.Add(data[i].Clone() as PopUnit);

}

int tmpCount = data.Count - newpool.Count;

for (int i = dropoutCount; i <= dropoutCount + tmpCount - 1; i++)

{

newpool.Add(data[i].Clone() as PopUnit);

}

return newpool;

}

  交叉操作:

public void CrossOver(double a,double b,out double a1,out double b1)

{

if (m_Random.NextDouble() > m_Parameters.CrossOverRate)

{

a1 = a;

b1 = b;

return;

}

double r = 0.1;

double a2 = m_Random.NextDouble() * r;

double b2 = m_Random.NextDouble() * r;

a1 = (1 - a2) * a + b2 * b;

b1 = (1 - b2) * b + a2 * a;

if (a1 < m_Parameters.L)

a1 = m_Parameters.L;

if (b1 < m_Parameters.L)

b1 = m_Parameters.L;

if (a1 > m_Parameters.R)

a1 = m_Parameters.R;

if (b1 > m_Parameters.R)

b1 = m_Parameters.R;

//Console.WriteLine("crossover a1={0},b1={1}  ->  a2={2},b2={3}", a, b, a1, b1);

}

  变异操作:

public double Mutation(double c)

{

double tmpd = m_Random.NextDouble();

if (tmpd > m_Parameters.MutateRate)

{

return c;

}

double k = 0.2;

//k = (m_Parameters.MaxGenerations-T)/ (m_Parameters.MaxGenerations + 2D) * 0.4D;

double res;

if (m_Random.Next(2) == 1)

{

res = c + k * (m_Parameters.R - c) *m_Random.NextDouble();

}

else

{

res = c - k * (c - m_Parameters.L) *m_Random.NextDouble();

}

//Console.WriteLine("mutation: {0} -> {1}", c, res);

return res;

}

种群大小=100,交叉概率=0.7,变异概率=0.1

时间: 2024-11-08 20:52:13

采用浮点数编码的遗传算法的问题的相关文章

Java与编码问题串讲之二–如何理解java采用Unicode编码

Java开发者必须牢记:在Java中字符仅以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用他们在字符集中的编号,这是统一的唯一方法).由于java采用unicode编码,char 在java中占2个字节.2个字节(16位)来表示一个字符. 这里的Java中是指在JVM中.在内存中.在代码里声明的每一个char.String类型的变量中. 例如: 1 2 3 4 5 6 7 System.out.println(System.getProperty("file.encoding

android 部分韩国手机采用KSC5601编码保存联系人,MTK平台手机无法显示联系人姓名

按照spec的明确规定,SIM卡上姓名采用的编码方式应该是gsm8 ucs80 81 82这些. 而韩国部分手机(如较早的功能机器以及galaxy S等)采用的却是KSC5601编码,在spec支持之外. 现在MTK的design则是遵守spec的: 1.在modem层判断到编码方式不在spec之列后,不去上报数据给APP(这就导致了姓名栏位显示为空) 2.spec范围内的编码数据则在解码转化为utf16,用于显示 因此本问题是对比机没有按照spec来做导致的,下面的解决方案是一种的work a

原码, 反码, 补码,浮点数编码

1. 为何要使用原码,补码反码 是因为计算机只能做加法,不能做减法,而补码就完美的解决了这个问题. 2. 原码 原码就是第一位是符号位,是人最容易理解和计算的编码. [+1]原 = 0000 0001 [-1]原 = 1000 0001 3. 反码 正数的反码是其本身 负数的反码是在原码的基础上,符号位不变,其余的各个位取反 [+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反 4. 补码 正数的补码不变. 负数的补码

hive 采用JDBC编码方式获取外部分区表数据

由于最近项目的需求,仔细研究了下采用hive JDBC编码的方式来实现命令行模式执行hql语句的功能.期间遇到了不少问题,并一一进行了分析解决.但是时间匆忙,本人并未能将遇到的问题逐一记录在案.凭借零零稀稀的记忆希望将这些问题和经验进行总结以备后用. 项目中有个需求就是实现通过hql条件查询语句查询出hive外部分区表中的数据,并将这些数据保存到本地文件中.直接贴出查询的主要类似代码如下: String driverName = "org.apache.hadoop.hive.jdbc.Hive

当http响应报文采用gzip压缩后,再采用chunk编码传输

当http响应报文采用gzip算法压缩后,再采用chunk编码传输. 是单独每个chunk分别压缩,还是数据统一压缩后再分别放入不同的chunk中传输? 经查阅资料和测试后发现,是后一种情况. 所以客户端需要将接收到的所有chunk暂存在一个文件中,并对文件进行统一的解压,若单个chunk解压,只能成功解压第一个chunk,再继续解压后面的chunk就会报错.

关于Androdi中SQLITE 3采用GBK编码存储,数据库中文乱码问题。

1.最近开发一个项目,用SQLite Expert Personal打开数据库如下图,title会产生乱码,问题. 2.由于SQL lite默认是存储UTF-8格式,后来更改数据库编码类型为ANSI,依据操作系统,本地ANSI为GB2312格式,查看发现编码格式正常. 3.用Android程序读取,采用以下方式,可以完整读取出中文字符. Product pr=new Product(); //解决中文乱码问题 byte[] val = cursor.getBlob(cursor.getColum

app开发历程————服务器端生成JSON格式数据,采用Unicode编码,隐藏中文

今天,问以前的同事,他们写接口按什么编码,怎么看到有\u的一些看不懂的内容,一问,原来是信息隐藏,防止信息泄漏. 然后在网上查了Java如何把中文转换成unicode编码,转自:http://blog.csdn.net/sunmenggmail/article/details/27539023 1 package mobi.chenwei.wing.util; 2 3 public class CharacterSetToolkit { 4 5 /** 6 * @param args 7 */

解决爬虫时网站采用gb2312编码所遇到的乱码问题!

import requests from bs4 import BeautifulSoupall_url = 'http://www.7160.com/qingchunmeinv/' # 请求头 header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/

遗传算法入门

关于遗传算法 遗传算法的有趣应用很多,诸如寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题(这是一个国外网友的建议:在一个不规则的多边形 中,寻找一个包含在该多边形内的最大圆圈的圆心.),TSP问题(在以后的章节里面将做详细介绍.),生产调度问题,人工生命模拟等.直到最后看到一个非 常有趣的比喻,觉得由此引出的袋鼠跳问题(暂且这么叫它吧),既有趣直观又直达遗传算法的本质,确实非常适合作为初学者入门的例子.  问题的提出与解决方案 让我们先来考虑考虑下面这个问题的解决办法.已知一元函数: 现在