⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga.cs

📁 实现了一个简单的花朵进化的模拟过程。 花朵的种群数量是10
💻 CS
字号:
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);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -