C#实现遗传算法

遗传算法是通过模拟生物进化而进行数据寻优的一种进化算法。主要过程是初始种群的产生,选择,交叉,变异,循环迭代,直至出现最优解。本程序两个主要类,种群类与个体类。定义进化策略接口,计算适应度策略接口。进化策略接口实现三个行为,交叉,变异,选择,其中,进化策略接口可以加上自己的实现。大致实现如下:

//
//class Population
//
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace SGA.SingleGA
{
  /*
  群体类,实现了种群初始化,有交叉,变异行为,选择等行为。同时统计种群的平均适应度,最大适应度,适应度之和。
  */
  public class Population : CollectionBase,ICloneable,IDisposable
  {
    private IGeneticStrategy _iGeneticStrategy;
    public Population(IGeneticStrategy iGeneticStrategy) { this._iGeneticStrategy = iGeneticStrategy; }
    public Population() { }
    public void Init(int iMax)
    {
      Random rd = new Random();
      for (int i = 0; i < iMax; i++)
      {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < 22; j++)
        {
          sb.Append(rd.Next(0,2));
        }
        this.List.Add(new Individual(sb.ToString()));
      }
    }
    public double MaxFitness
    {
      get
      {
        double dmax = double.MinValue;
        for (int i = 0; i < List.Count; i++)
        {
          if ((List[i] as Individual).Fitness > dmax) dmax = (List[i] as Individual).Fitness;
        }
        return dmax;
      }
    }
    public double AverageFitness
    {
      get
      {
        return SumFitness / List.Count;
      }
    }
    public double SumFitness
    {
      get
      {
        double dSum = 0;
        for (int i = 0; i < List.Count; i++)
        {
          dSum += (List[i] as Individual).Fitness;
        }
        return dSum;
      }
    }
    public IGeneticStrategy GeneticStrategy
    {
      get { return this._iGeneticStrategy; }
      set { this._iGeneticStrategy = value; }
    }
    public Population Select()
    {
      if (_iGeneticStrategy == null) return null;
      return _iGeneticStrategy.Select(this);
    }
    public void Crossover()
    {
      if (_iGeneticStrategy == null) return;
      _iGeneticStrategy.Crossover(this);
    }
    public void Mutation()
    {
      if (_iGeneticStrategy == null) return;
      _iGeneticStrategy.Mutation(this);
    }
    public Individual this[int index]
    {
      get { return (Individual)this.List[index]; }
      set { this.List[index] = value; }
    }
    public void Add(Individual ind)
    {
      this.List.Add(ind);
    }
    public int Indexof(Individual ind)
    {
      return this.List.IndexOf(ind);
    }
    public void Print()
    {
      for (int i = 0; i < List.Count; i++)
      {
        Console.WriteLine("第{0}个体fit={2} {1}", i.ToString(), (List[i] as Individual).Variable.ToString(), (List[i] as Individual).Fitness);
      }
    }
    #region ICloneable 成员
    public object Clone()
    {
      Population pop = new Population(this.GeneticStrategy);
      for (int i = 0; i < this.List.Count; i++)
        pop.List.Add(this.List[i]);
      return pop;
    }
    #endregion
    #region IDisposable 成员
    public void Dispose()
    {
      _iGeneticStrategy = null;
    }
    #endregion
  }
}
//
//Individual
//
using System;
using System.Collections.Generic;
using System.Text;
namespace SGA.SingleGA
{
  public class Individual : ICloneable
  {
    private string _gene;
    private double _fitness = double.MinValue;
    public static IFitness _calFit = new OneDFitness();
    public string Gene
    {
      get { return _gene; }
      set
      {
        _gene = value;
        _fitness = _calFit.Fitness(Variable);
      }
    }
    public double Fitness
    {
      get { return _fitness; }
    }
    public double Variable
    {
      get { return Coder.ToReal(_gene, -1.0, 2.0); }
    }
    public Individual()
    {
    }
    public Individual(string sGene)
    {
      Gene = sGene;
    }
    public Individual(string sGene,IFitness calFit)
    {
      _calFit = calFit;
      this.Gene = sGene;
    }
    //public IFitness CalFit
    //{
    //  get { return this._calFit; }
    //  set
    //  {
    //    this._calFit = value;
    //    _fitness = _calFit.Fitness(Coder.ToReal(_gene, -1.0, 2.0));
    //  }
    //}
    public int ToMetrication()
    {
      return Convert.ToInt32(Gene, 2);
    }
    public static int operator * (Individual ind1,Individual ind2)
    {
      Random rd = new Random();
      int iStart = rd.Next(0, ind1.Gene.Length-2);
      int iLast = rd.Next(iStart+1,ind1.Gene.Length-1);
      while (ind1.Gene.Substring(iStart, iLast - iStart) == ind2.Gene.Substring(iStart, iLast - iStart))
      {
        iStart = rd.Next(0, ind1.Gene.Length - 2);
        iLast = rd.Next(iStart + 1, ind1.Gene.Length - 1);
      }
      StringBuilder sbGene1 = new StringBuilder();
      sbGene1.Append(ind1.Gene.Substring(0, iStart));
      sbGene1.Append(ind2.Gene.Substring(iStart, iLast-iStart));
      sbGene1.Append(ind1.Gene.Substring(iLast));
      StringBuilder sbGene2 = new StringBuilder();
      sbGene2.Append(ind2.Gene.Substring(0, iStart));
      sbGene2.Append(ind1.Gene.Substring(iStart,iLast-iStart));
      sbGene2.Append(ind2.Gene.Substring(iLast));
      ind1.Gene = sbGene1.ToString();
      ind2.Gene = sbGene2.ToString();
      return iLast - iStart;
    }
    public int Crossover(Individual ind)
    {
      return this * ind;
    }
    public int Mutation()
    {
      Random rd = new Random();
      int iPos = rd.Next(0, this.Gene.Length-1);
      StringBuilder sb = new StringBuilder(this.Gene);
      sb[iPos] = sb[iPos] == '0' ? '1' : '0';
      this.Gene = sb.ToString();
      return iPos;
    }
    public override string ToString()
    {
      return this.Gene;
    }
    public override bool Equals(object obj)
    {
      return base.Equals(obj);
    }
    public override int GetHashCode()
    {
      return base.GetHashCode();
    }
    #region ICloneable 成员
    public object Clone()
    {
      return new Individual(this.Gene);
    }
    #endregion
  }
}

时间: 2024-11-02 20:05:49

C#实现遗传算法的相关文章

遗传算法

遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法.遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成.每个个体实际上是染色体(chromosome)带有特征的实体.染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如

JVM及遗传算法,转摘牛人牛文

看了此篇,俺才知堆和栈原来也可以这样相依相离. 而内存中的遗传算法,则可以让我们分清民主和专制的界限---是要"最好的"?还是"不要最差的"? 当我们不能清楚自己想要的时候,我们是否很清楚自己不要的? http://simpleframework.net/blog/v/30070.html http://simpleframework.net/blog/v/16249.html ~~~~~~~~~~~~ 数据类型     Java虚拟机中,数据类型可以分为两类:基本

如何用matlab遗传算法优化simulink中的参数

问题描述 如何用matlab遗传算法优化simulink中的参数 我想用matlab遗传算法优化simulink中的参数,用simulink的输出作为适值函数,把待优化的参数作为染色体,从而在matlab中实现遗传算法,但是不知道应该怎么把simulink和matlab联系起来,希望大家能帮我解决这个问题.

有关遗传算法

遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过自然选择.遗传.变异等作用机制,实现各个个体的适应性的提高.这一点体现了自然界中"物竞天择.适者生存"的进化过程. 1962年Holland教授首次提出了GA算法的思想,从而吸引了大批的研究者,迅速推广到优化.搜索.机器学习等方面,并奠定了坚实的理论基础. 用遗传算法解决问题时,首先要对待解决问题的模型结构和参数进行编码,一般用字符串表示,这个过程就将问题符号化

C++实现简单遗传算法

  本文实例讲述了C++实现简单遗传算法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

使用神经网络和遗传算法玩转 Flappy Bird

我们创建一个人工智能机器人,它能够学习如何把Flappy Bird这个游戏玩出最高分.这样,我们的小鸟就能安全地飞过一些障碍物了.在最好的情况下,它永远不会死. 欢迎阅读这篇完整的HTML5教程,本文展示了针对Flappy Bird游戏设计的机器学习算法.本实验的目标是使用神经网络和遗传算法编写一个人工智能游戏控制器. 因此,我们打算创建一个人工智能机器人,它能够学习如何把Flappy Bird这个游戏玩出最高分.这样,我们的小鸟就能安全地飞过一些障碍物了.在最好的情况下,它永远不会死. 在阅读

遗传算法(C#),主要用于机械设计的优化

问题描述 遗传算法(C#),主要用于机械设计的优化 请问,有人有C#遗传算法的源代码么,或者下载地址也可以,谢谢. 解决方案 可以在百度网站的知道网页那里百度回来 解决方案二: 解决方案三: 参考

遗传算法、贪婪算法、粒子群算法、蚂蚁算法概念简介

遗传算法 遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等.遗传算法通常实现方式为一种计算机模拟.对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化.传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法.进化从完全随机个体的种群开始,之后一代一代发生.在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应

《R的极客理想——高级开发篇 A》一一2.4 R语言中的遗传算法

2.4 R语言中的遗传算法 问题 如何用R语言进行遗传算法的计算? 引言 人类总是在生活中摸索规律,把规律总结为经验,再把经验传给后人,让后人发现更多的规律,每一次知识的传递都是一次进化的过程,最终形成了人类的智慧.自然界的规律,让人类适者生存地活了下来,聪明的科学家又把生物进化的规律,总结成遗传算法,扩展到了更广的领域中.本节将带你走进遗传算法的世界.2.4.1 遗传算法介绍 遗传算法是一种解决最优化的搜索算法,是进化算法的一种.进化算法最初借鉴了达尔文的进化论和孟德尔的遗传学说,从生物进化的