频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

C#实现遗传算法 模拟花朵的进化

来源:pcdog 作者:佚名 出处:巧巧读书 2008-01-11 进入讨论组
  • 关 键 词:

  以下代码实现了一个简单的花朵进化的模拟过程。
  花朵的种群数量是10,共进化了50代。

  通过运行程序,你会发现通过不断的进化,种群的总的适应环境的能力在逐步提高(fitness的值下降)。

  实现代码:

  using System;
  using System.Collections.Generic;
  using System.Text;

  namespace GA
  {
   class Program
   {
   static void Main(string[] args)
   {
   World world = new World();

   world.Init();

   for (int i = 0; i < 50; i++)
   {
   world.Evolve();

   Console.WriteLine(i);
   world.Show();
   }
   }
   }

   class World
   {
   int kMaxFlowers = 11;

   Random Rnd = new Random();

   public int[] temperature;

   public int[] water;

   public int[] sunlight;

   public int[] nutrient;

   public int[] beneficialInsect;

   public int[] harmfulInsect;

   public int currentTemperature;

   public int currentWater;

   public int currentSunlight;

   public int currentNutrient;

   public int currentBeneficialInsect;

   public int currentHarmfulInsect;

   public World()
   {
   temperature = new int[kMaxFlowers];
   water = new int[kMaxFlowers];
   sunlight = new int[kMaxFlowers];
   nutrient = new int[kMaxFlowers];
   beneficialInsect = new int[kMaxFlowers];
   harmfulInsect = new int[kMaxFlowers];
   }

   /**//// <summary>
   /// 初始化第一代花朵的基因结构
   /// </summary>
   public void Init()
   {

   for (int i = 1; i < kMaxFlowers; i++)
   {
   temperature[i] = Rnd.Next(1, 75);

   water[i] = Rnd.Next(1, 75);

   sunlight[i] = Rnd.Next(1, 75);

   nutrient[i] = Rnd.Next(1, 75);

   beneficialInsect[i] = Rnd.Next(1, 75);

   harmfulInsect[i] = Rnd.Next(1, 75);
   }

   currentTemperature = Rnd.Next(1, 75);

   currentWater = Rnd.Next(1, 75);

   currentSunlight = Rnd.Next(1, 75);

   currentNutrient = Rnd.Next(1, 75);

   currentBeneficialInsect = Rnd.Next(1, 75);

   currentHarmfulInsect = Rnd.Next(1, 75);

   }

   /**//// <summary>
   /// 越大说明花朵的适应环境的能力差,小说明适应环境的能力强
   /// </summary>
   /// <param name="flower"></param>
   /// <returns></returns>
   private int Fitness(int flower)
   {
   int theFitness = 0;

   theFitness = Math.Abs(temperature[flower] - currentTemperature);

   theFitness = theFitness + Math.Abs(water[flower] - currentWater);

   theFitness = theFitness + Math.Abs(sunlight[flower] -

   currentSunlight);

   theFitness = theFitness + Math.Abs(nutrient[flower] -

   currentNutrient);

   theFitness = theFitness + Math.Abs(beneficialInsect[flower] -

   currentBeneficialInsect);

   theFitness = theFitness + Math.Abs(harmfulInsect[flower] -

   currentHarmfulInsect);

   return (theFitness);
   }

   /**//// <summary>
   /// 排除适应能力差的花朵,让适应能力强的花朵杂交繁殖,产生下一代。同时有一定的概率变异。
   /// </summary>
   public void Evolve()
   {
   int[] fitTemperature = new int[kMaxFlowers];

   int[] fitWater = new int[kMaxFlowers];

   int[] fitSunlight = new int[kMaxFlowers];

   int[] fitNutrient = new int[kMaxFlowers];

   int[] fitBeneficialInsect = new int[kMaxFlowers];

   int[] fitHarmfulInsect = new int[kMaxFlowers];

   int[] fitness = new int[kMaxFlowers];

   int i;

   int leastFit = 0;

   int leastFitIndex = 1;

   for (i = 1; i < kMaxFlowers; i++)

   if (Fitness(i) > leastFit)
   {

   leastFit = Fitness(i);

   leastFitIndex = i;

   }

   temperature[leastFitIndex] = temperature[Rnd.Next(1, 10)];

   water[leastFitIndex] = water[Rnd.Next(1, 10)];

   sunlight[leastFitIndex] = sunlight[Rnd.Next(1, 10)];

   nutrient[leastFitIndex] = nutrient[Rnd.Next(1, 10)];

   beneficialInsect[leastFitIndex] = beneficialInsect[Rnd.Next(1, 10)];

   harmfulInsect[leastFitIndex] = harmfulInsect[Rnd.Next(1, 10)];

   for (i = 1; i < kMaxFlowers; i++)
   {

   fitTemperature[i] = temperature[Rnd.Next(1, 10)];

   fitWater[i] = water[Rnd.Next(1, 10)];

   fitSunlight[i] = sunlight[Rnd.Next(1, 10)];

   fitNutrient[i] = nutrient[Rnd.Next(1, 10)];

   fitBeneficialInsect[i] = beneficialInsect[Rnd.Next(1, 10)];

   fitHarmfulInsect[i] = harmfulInsect[Rnd.Next(1, 10)];

   }

   for (i = 1; i < kMaxFlowers; i++)
   {

   temperature[i] = fitTemperature[i];

   water[i] = fitWater[i];

   sunlight[i] = fitSunlight[i];

   nutrient[i] = fitNutrient[i];

   beneficialInsect[i] = fitBeneficialInsect[i];

   harmfulInsect[i] = fitHarmfulInsect[i];

   }

   for (i = 1; i < kMaxFlowers; i++)
   {

   if (Rnd.Next(1, 100) == 1)

   temperature[i] = Rnd.Next(1, 75);

   if (Rnd.Next(1, 100) == 1)

   water[i] = Rnd.Next(1, 75);

   if (Rnd.Next(1, 100) == 1)

   sunlight[i] = Rnd.Next(1, 75);

   if (Rnd.Next(1, 100) == 1)

   nutrient[i] = Rnd.Next(1, 75);

   if (Rnd.Next(1, 100) == 1)

   beneficialInsect[i] = Rnd.Next(1, 75);

   if (Rnd.Next(1, 100) == 1)

   harmfulInsect[i] = Rnd.Next(1, 75);

   }

   }

   /**//// <summary>
   /// 显示种群中个体对环境的适应能力,还有所有个体对环境的适应能力之和。
   /// </summary>
   public void Show()
   {
   int sum = 0;
   for (int i = 1; i < kMaxFlowers; i++)
   {
   int fitness = Fitness(i);
   sum += fitness;
   Console.WriteLine("No." + i + "'s fitness is " + fitness);
   }

   Console.WriteLine("fitness sum is " + sum);
   }
   }
  }

Web: http://www.qqread.com/csharp/p392441.html进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章