欢迎进入.NET社区论坛,与300万技术人员互动交流 >>进入
以下代码实现了一个简单的花朵进化的模拟过程。
花朵的种群数量是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></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)];
sunlig