遗传算法之花朵进化

来源:互联网 发布:荣威erx5网络连接错误 编辑:程序博客网 时间:2024/04/28 06:45
/*以下代码实现了一个简单的花朵进化的模拟过程。
  花朵的种群数量是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);
        }
    }
}