以下代码实现了一个简单的花朵进化的模拟过程。 花朵的种群数量是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); } } }