C#遺傳算法學(xué)習(xí)筆記
作者:佚名 
  本文介紹C#遺傳算法學(xué)習(xí)筆記,通過運行程序,你會發(fā)現(xiàn)通過不斷的進化,種群的總的適應(yīng)環(huán)境的能力在逐步提高。
 以下代碼實現(xiàn)了C#遺傳算法一個簡單的花朵進化的模擬過程。
花朵的種群數(shù)量是10,共進化了50代。通過運行程序,你會發(fā)現(xiàn)通過不斷的進化,種群的總的適應(yīng)環(huán)境的能力在逐步提高(fitness的值下降)。
C#遺傳算法實現(xiàn)代碼:
- 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>
 - /// 初始化***代花朵的基因結(jié)構(gòu)
 - /// </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>
 - /// 越大說明花朵的適應(yīng)環(huán)境的能力差,小說明適應(yīng)環(huán)境的能力強
 - /// </summary>
 - /// <param name="flower"></param>
 - /// <returns></returns>
 - private int Fitness(int flower)
 - {
 - int theFitness = 0;
 - theFitness = Math.Abs(temperature[flower] - currentTemperature);
 - theFitnesstheFitness = theFitness + Math.Abs(water[flower] - currentWater);
 - theFitnesstheFitness = theFitness + Math.Abs(sunlight[flower] -
 - currentSunlight);
 - theFitnesstheFitness = theFitness + Math.Abs(nutrient[flower] -
 - currentNutrient);
 - theFitnesstheFitness = theFitness + Math.Abs(beneficialInsect[flower] -
 - currentBeneficialInsect);
 - theFitnesstheFitness = theFitness + Math.Abs(harmfulInsect[flower] -
 - currentHarmfulInsect);
 - return (theFitness);
 - }
 - /**//// <summary>
 - /// 排除適應(yīng)能力差的花朵,讓適應(yīng)能力強的花朵雜交繁殖,產(chǎn)生下一代。同時有一定的概率變異。
 - /// </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>
 - /// 顯示種群中個體對環(huán)境的適應(yīng)能力,還有所有個體對環(huán)境的適應(yīng)能力之和。
 - /// </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);
 - }
 - }
 - }
 
以上是C#遺傳算法學(xué)習(xí)筆記
【編輯推薦】
責(zé)任編輯:佚名 
                    來源:
                    博客園
 














 
 
 




 
 
 
 