本文介紹C#遺傳演算法學習筆記,通過運行程式,你會發現通過不斷的進化,種群的總的適應環境的能力在逐步提高。
以下代碼實現了C#遺傳演算法一個簡單的花朵進化的類比過程。
花朵的種群數量是10,共進化了50代。通過運行程式,你會發現通過不斷的進化,種群的總的適應環境的能力在逐步提高(fitness的值下降)。
C#遺傳演算法實現代碼:
- 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];
- }
- /**////
- /// 初始化第一代花朵的基因結構
- ///
- 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);
- }
- /**////
- /// 越大說明花朵的適應環境的能力差,小說明適應環境的能力強
- ///
- /// name="flower">
- ///
- 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);
- }
- /**////
- /// 排除適應能力差的花朵,讓適應能力強的花朵雜交繁殖,產生下一代。同時有一定的機率變異。
- ///
- 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);
- }
- }
- /**////
- /// 顯示種群中個體對環境的適應能力,還有所有個體對環境的適應能力之和。
- ///
- 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);
- }
- }
- }
轉載 吾搜 空間