C#实现遗传算法,模拟花朵的进化

文/gpcuster  出处/博客园

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

                water = Rnd.Next(1, 75);

                sunlight = Rnd.Next(1, 75);

                nutrient = Rnd.Next(1, 75);

                beneficialInsect = Rnd.Next(1, 75);

                harmfulInsect = 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 = temperature[Rnd.Next(1, 10)];

                fitWater = water[Rnd.Next(1, 10)];

                fitSunlight = sunlight[Rnd.Next(1, 10)];

                fitNutrient = nutrient[Rnd.Next(1, 10)];

                fitBeneficialInsect = beneficialInsect[Rnd.Next(1, 10)];

                fitHarmfulInsect = harmfulInsect[Rnd.Next(1, 10)];

            }

            for (i = 1; i < kMaxFlowers; i++)
            {

                temperature = fitTemperature;

                water = fitWater;

                sunlight = fitSunlight;

                nutrient = fitNutrient;

                beneficialInsect = fitBeneficialInsect;

                harmfulInsect = fitHarmfulInsect;

            }

            for (i = 1; i < kMaxFlowers; i++)
            {

                if (Rnd.Next(1, 100) == 1)

                    temperature = Rnd.Next(1, 75);

                if (Rnd.Next(1, 100) == 1)

                    water = Rnd.Next(1, 75);

                if (Rnd.Next(1, 100) == 1)

                    sunlight = Rnd.Next(1, 75);

                if (Rnd.Next(1, 100) == 1)

                    nutrient = Rnd.Next(1, 75);

                if (Rnd.Next(1, 100) == 1)

                    beneficialInsect = Rnd.Next(1, 75);

                if (Rnd.Next(1, 100) == 1)

                    harmfulInsect = 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);
        }
    }
}

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [C#] 的这些文章也感兴趣:

实现带有用户身份验证的文件传输WebService(2)
C# 制作的WEB图片批量下载器
程序实现更换IP(C#)
C#是什么?
.Net 2.0 DataGridView中键盘事件处理方法
扩展Kevin McFarlane的C#版DesignByContract Framework
用C#获取浏览文件夹对话框
GDI+中常见的几个问题
用C#实现一种超酷的任务栏滑出式提醒框
使用.NETFramework进行事务处理
拼吾爱变形金刚