进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)
原文:进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)
开学了,各种忙起来了…
上一篇介绍了AForge.NET在人工神经网络上的一点点使用,但是老觉不过瘾。matlab用着实在不习惯,就又琢磨了一下进化计算。
进化计算简介
进化计算算不上新的方法了,已经有大量研究人员作出了努力,这导致了大量的进化计算算法出现。他们不仅研究算法本身,还致力于扩大算法的应用范围。
众所周知,现实世界存在大量复杂问题,它们中一部分无法用常规方法在合理的时间内获得精确解,而另一部分甚至没有行之有效的解决方案。
最著名的例子就是TSP问题,该问题意在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。
而进化计算可以应用于这些问题,因为大多数情况下这类问题允许我们在合理时间内给出较优解。
进化计算并不能保证找到特定问题的最佳解决方案,但是可以找到一个很好的解决办法,该方案可能是非常接近的最佳解决方案。
进化算法的分支和运用
进化计算是一些算法的统称,主要包括Genetic Algorithms (GA遗传算法), Genetic Programming (GP遗传规划) 和 Gene Expression Programming (GEP基因表达式编程)。
进化算法主要可以解决以下类别问题:
1.函数优化
2.符号回归
3.时间序列预测
4.旅行商问题
遗传算法简介
Genetic Algorithms(遗传算法)最早由John Holland基于进化观点在1960提出。从那时起相关研究不断进行。
大部分研究成果运用到很多领域,并取得了很好的效果。虽然遗传算法的历史悠久,但是目前还是不断有新的方法被提出,扩宽了运用领域。
遗传算法基于达尔文的“适者生存”理论和遗传学机理的生物进化过程。算法作用于每一代的基因,而每个基因都是问题的可能解。
一般遗传算法的运用有以下4个步骤:
1.随机选择个体,并进行交叉
2.变异
3.计算适应度
4.选择下一个世代的个体
算法的停止条件一般是指定的迭代数目完成或者得到一个可靠解。
交叉算法中最简单的单点交叉,即随机选择两个基因的一个点,交换两个基因的一部分。
| 基因1:0 0 0 1 1 0 1 基因2:1 0 0 1 0 0 0 结果 :0 0 0 1 0 0 0 |
还有一种不错的方式是两点交叉,随机选择两个基因的两个点,交换两个点之间的部分。
变异一般用单点变异
| 基因1:0 1 0 0 1 0 1 结果 :0 1 0 0 0 0 1 |
用Aforge.Net实现遗传算法
我觉得Aforge.Net的优越就在于不是提供特定的实现,而是重在提供一个可以扩展的框架,方便学习和研究。

我以函数最优化为例。函数我选用:x^0.5+sin(x/23)*30 范围从0到100

先用matlab估计一下最优值

建立适应度评价函数;
public class MyOwnFunction : OptimizationFunction1D
{
public MyOwnFunction()
: base(new AForge.Range(, ))
{
} public override double OptimizationFunction(double x)
{
return Math.Sqrt(x)+ Math.Sin(x/)*; }
}
遗传算法主要的类是Population类。它容纳了所有的染色体,提供了适应度评价方法、编码方式和选择方式。
MyOwnFunction f = new MyOwnFunction();
Population population = new Population(,new BinaryChromosome(),f,new EliteSelection());
这段代码的意思是适应度函数使用自定义的MyOwnFunction,编码使用二进制编码,长度为32,每个世代个体数目为40,选择方式为“精英取舍”。
这个名字很霸气,其实就是排个序,然后把不好的移除而已,代码如下;
public class EliteSelection : ISelectionMethod
{
/// <summary>
/// Initializes a new instance of the <see cref="EliteSelection"/> class.
/// </summary>
public EliteSelection( ) { } /// <summary>
/// Apply selection to the specified population.
/// </summary>
///
/// <param name="chromosomes">Population, which should be filtered.</param>
/// <param name="size">The amount of chromosomes to keep.</param>
///
/// <remarks>Filters specified population keeping only specified amount of best
/// chromosomes.</remarks>
///
public void ApplySelection( List<IChromosome> chromosomes, int size )
{
// sort chromosomes
chromosomes.Sort( ); // remove bad chromosomes
chromosomes.RemoveRange( size, chromosomes.Count - size );
}
}
一般情况可以使用赌轮盘的方式进行下一个世代的选择。完整代码:
Console.WriteLine("Start!");
MyOwnFunction f = new MyOwnFunction();
Population population = new Population(,
new BinaryChromosome(),f,new EliteSelection());
population.RunEpoch();
double goodX=f.Translate(population.BestChromosome);
Console.WriteLine("Best Chromosome === >{0}", goodX);
Console.WriteLine("Best Result === >{0}", f.OptimizationFunction(goodX));
Console.WriteLine("Over!");
Console.ReadLine();
效果:

基本符合,和matlab估算的值差了0.0002左右。
如果要输出最后世代的所有结果,可以使用
for (int i = ; i < population.Size; i++)
{
Console.WriteLine("chromosome{0} == >{1}", i, f.Evaluate(population[i]));
}
结果如下图: 
写在最后:
1.个人觉得AForge.NET用着比matlab方便,因为它的整体架构比较统一,而不像matlab是由工具箱提供的,使用风格迥异。
2.AForge.Net的进化计算这块远远比神经网络部分完整,基本不需要自己实现什么。
3.AForge.Fuzzy中的隶属度函数的表示实现不够丰富,只实现了中间型的两种,我扩写了其他种类的,等整理好了就发出来。
进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)的更多相关文章
- 人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五)
原文:人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五) 前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参 ...
- 模糊集合和隶属度函数--AForge.NET框架的使用(一)
原文:模糊集合和隶属度函数--AForge.NET框架的使用(一) 什么是AForge.NET? AForge.NET是一个为开发人员和研究人员开发的框架,它可以用于计算机视觉,遗传算法,图像处理,神 ...
- 模糊系统架构和简单实现--AForge.NET框架的使用(四)
原文:模糊系统架构和简单实现--AForge.NET框架的使用(四) 先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子. 我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量 ...
- 子句判断、启动强度和去模糊化--AForge.NET框架的使用(三)
原文:子句判断.启动强度和去模糊化--AForge.NET框架的使用(三) 使用AForge.NET进行模糊运算 上一篇说来一些模糊运算的数学问题,用AForge.NET做相关运算就很简单了. 1.联 ...
- 模糊语意变数、规则和模糊运算--AForge.NET框架的使用(二)
原文:模糊语意变数.规则和模糊运算--AForge.NET框架的使用(二) 语意变数(Linguistic Variable) 语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合.在 ...
- 基于AForge.Net框架的扑克牌识别
原文:基于AForge.Net框架的扑克牌识别 © 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译 下载源代码 - 148.61 KB ...
- Dubbo简介---搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- GuavaCache简介(一)是轻量级的框架 少量数据,并且 过期时间相同 可以用 GuavaCache
还有一篇文章是讲解redis 如何删除过期数据的,参考:Redis的内存回收策略和内存上限(阿里) 划重点:在GuavaCache中,并不存在任何线程!它实现机制是在写操作时顺带做少量的维护工作(如清 ...
- 【DWR系列01】-DWR简介及入门例子
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...
随机推荐
- Utf-8 转 GBK
QTextCodec *gbk = QTextCodec::codecForName("gb18030"); QTextCodec *utf8 = QTextCodec::code ...
- Java面向对象编辑
1.面向对象的软件开发方法简介: 1).把软件系统看成是各种对象的集合,更接近人类自然思维方式. 2).软件需求的变动往往都是功能的 ...
- C# 读取 Access 数据库表的例子
using System;using System.Data;using System.Data.OleDb;using System.Collections.Generic;using System ...
- 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)
这题是某年成都区域赛网络赛的一题. 这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星. 採用线上查询.利用map对字符串编号,由于非常方便.要推荐的朋友,事实上就是朋友的朋 ...
- C#量转换为汉字表达
/* 创造者:菜刀打好博客 * 创建日期: 2014年09一个月04号码 * 特征:Money类型转换 * */ namespace Net.String.ConsoleApplication ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)
1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...
- 读书笔记--用Python写网络爬虫01--网络爬虫简介
Wiki - Web crawler 百度百科 - 网络爬虫 1.1 网络爬虫何时使用 用于快速自动地获取网络信息,避免重复性的手工操作. 1.2 网络爬虫是否合法 网络爬虫目前人处于早期的蛮荒阶段, ...
- spring源码测试
org.springframework.context.annotation.ComponentScanParserTests.componentScanWithAutowiredQualifier( ...
- 开源CMS建站项目DNN研究与心得
DNN (Dotnetnuke) 首先是开源的,并且采用BSD开源协议,也就是说你可以任意修改源代码.传播.作为商品出售,仅有的要求就是保留源代码中的版权文字,这就解决了我多年来的心病:我知道动网新闻 ...
- SQL 语句修改列名 属性 默认值
--修改字段名exec sp_rename '表名.列名','新列名' --修改字段属性alter table 表名 alter column 列名 nvarchar(100) null; --修改默 ...