سؤال

أنا على دراية عموميات البرمجة الوراثية، لكنني أتساءل حيث قد أجد شيئا يظهر لي تفاصيل عن تنفيذ البرمجة الوراثية. أستخدم C # و .NET 3.5، وأود أن أضع البرمجة الوراثية لأشياء مثل pathfinding، وتريد عموما فقط أن نرى ما يمكن القيام به. تحرير: ربما يجب أن أوضح ما أبحث عنه: أنا مهتم بأي نوع من هياكل البيانات سيتم استخدامها لتخزين أشجار بناء الجملة، وكيفية تنفيذ عملية التكاثر، وهذا النوع من الأشياء.

هل كانت مفيدة؟

المحلول

هنا هو إعادة كتابة سريعة من واحد من c ++ helloworld. أمثلة ساعدتني في تعلم البرمجة الوراثية:

using ga_vector = List<ga_struct>;

class ga_struct
{
    public ga_struct(string str, uint fitness)
    {
        Str = str;
        Fitness = fitness;
    }

    public string Str { get; set; }
    public uint Fitness { get; set; }
}

class Program
{

    private const int GA_POPSIZE = 2048;
    private const int GA_MAXITER = 16384;
    private const float GA_ELITRATE = 0.10f;
    private const float GA_MUTATIONRATE = 0.25f;
    private const float GA_MUTATION = 32767 * GA_MUTATIONRATE;
    private const string GA_TARGET = "Hello world!";

    private static readonly Random random = new Random((int)DateTime.Now.Ticks);

    static void Main(string[] args)
    {
        ga_vector popAlpha = new ga_vector();
        ga_vector popBeta = new ga_vector();

        InitPopulation(ref popAlpha, ref popBeta);
        ga_vector population = popAlpha;
        ga_vector buffer = popBeta;

        for (int i = 0; i < GA_MAXITER; i++)
        {
            CalcFitness(ref population);
            SortByFitness(ref population);
            PrintBest(ref population);

            if (population[0].Fitness == 0) break;

            Mate(ref population, ref buffer);
            Swap(ref population, ref buffer);
        }

        Console.ReadKey();
    }

    static void Swap(ref ga_vector population, ref ga_vector buffer)
    {
        var temp = population;
        population = buffer;
        buffer = temp;
    }

    static void InitPopulation(ref ga_vector population, ref ga_vector buffer)
    {
        int tsize = GA_TARGET.Length;
        for (int i = 0; i < GA_POPSIZE; i++)
        {
            var citizen = new ga_struct(string.Empty, 0);

            for (int j = 0; j < tsize; j++)
            {
                citizen.Str += Convert.ToChar(random.Next(90) + 32);
            }

            population.Add(citizen);
            buffer.Add(new ga_struct(string.Empty, 0));
        }
    }

    static void CalcFitness(ref ga_vector population)
    {
        const string target = GA_TARGET;
        int tsize = target.Length;

        for (int i = 0; i < GA_POPSIZE; i++)
        {
            uint fitness = 0;
            for (int j = 0; j < tsize; j++)
            {
                fitness += (uint) Math.Abs(population[i].Str[j] - target[j]);
            }

            population[i].Fitness = fitness;
        }
    }

    static int FitnessSort(ga_struct x, ga_struct y)
    {
        return x.Fitness.CompareTo(y.Fitness);
    }

    static void SortByFitness(ref ga_vector population)
    {
        population.Sort((x, y) => FitnessSort(x, y));
    }

    static void Elitism(ref ga_vector population, ref ga_vector buffer, int esize)
    {
        for (int i = 0; i < esize; i++)
        {
            buffer[i].Str = population[i].Str;
            buffer[i].Fitness = population[i].Fitness;
        }
    }

    static void Mutate(ref ga_struct member)
    {
        int tsize = GA_TARGET.Length;
        int ipos = random.Next(tsize);
        int delta = random.Next(90) + 32;

        var mutated = member.Str.ToCharArray();
        Convert.ToChar((member.Str[ipos] + delta)%123).ToString().CopyTo(0, mutated, ipos, 1);
        member.Str = mutated.ToString();
    }

    static void Mate(ref ga_vector population, ref ga_vector buffer)
    {
        const int esize = (int) (GA_POPSIZE*GA_ELITRATE);
        int tsize = GA_TARGET.Length, spos, i1, i2;

        Elitism(ref population, ref buffer, esize);

        for (int i = esize; i < GA_POPSIZE; i++)
        {
            i1 = random.Next(GA_POPSIZE/2);
            i2 = random.Next(GA_POPSIZE/2);
            spos = random.Next(tsize);

            buffer[i].Str = population[i1].Str.Substring(0, spos) + population[i2].Str.Substring(spos, tsize - spos);

            if (random.Next() < GA_MUTATION)
            {
                var mutated = buffer[i];
                Mutate(ref mutated);
                buffer[i] = mutated;
            }
        }
    }

    static void PrintBest(ref ga_vector gav)
    {
        Console.WriteLine("Best: " + gav[0].Str + " (" + gav[0].Fitness + ")");
    }

قد يكون هناك بعض الأخطاء الطفيفة ولكن خلاف ذلك يبدو أنه يعمل موافق. كما يمكن كتابته بشكل أفضل بروح ج # لكن تلك مجرد تفاصيل. :)

نصائح أخرى

مشروع روجر آلسينغ مونى ليزا مثال جيد جدا.http://rogeralsing.com/2008/12/07/genetic-programming-volution-of-mona-lisa/

تحرير: السبب في أنني أحب المثال هو لأنه صغير وسهل فهمه. إنها طريقة سريعة وسهلة لفهم مفهوم البرمجة الوراثية.

هل يمكن أن ننظر في البقاء على قيد الحياة للأصلح: الاختيار الطبيعي مع نماذج ويندوز.

تحرير: انظر هذا السابق حتى السؤال, التي وجدت للتو. انها كبيرة جدا مكررة. آسف أنت لا تفهم الرابط (من الجيد أن نذكر مثل هذه الأشياء في السؤال). أيضا، لا يزال السؤال الآخر مفتوحا لمزيد من الإجابات / التعديلات، على الرغم من قبول إجابة.

يمكنك تجربة ميناء C # .NET 4.0 ميناء CEAN LUKE (حساب تطوري في Java):

http://branecloud.codeplex.com.

إنه برنامج مرن وقوي للغاية! ولكن من السهل نسبيا أن تبدأ لأنه يتضمن العديد من عينات وحدة التحكم في العمل خارج المربع (والعديد من اختبارات الوحدة المفيدة التي تم تطويرها أثناء التحويل).

بن

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top