سؤال

إنني أعمل مع الخوارزميات الجينية و أريد أن أكتب بلدي GA الطبقات.منذ GA يمكن أن يكون لها طرق مختلفة للقيام اختيار التحول عبر أكثر ، توليد أولية السكان حساب اللياقة البدنية و انهاء الخوارزمية ، أنا بحاجة إلى طريقة التوصيل في تركيبات مختلفة من هذه.بلدي الأولية النهج أن يكون مجردا من الدرجة التي كان كل من هذه الأساليب بأنها نقية الظاهري ، أي فئة محددة قد لتنفيذها.إذا كنت ترغب في محاولة الخروج من الغاز اثنين هي نفسها ولكن مع مختلفة عبر أكثر الطرق على سبيل المثال ، يجب أن فئة مجردة أن يرث من GeneticAlgorithm وتنفذ جميع الطرق إلا عبر أكثر من طريقة ، ثم اثنين ملموسة الفئات التي ترث من هذه الفئة فقط تنفذ عبر أكثر من طريقة.الجانب السلبي من هذا هو أنه في كل مرة أريد أن أبدل طريقة أو اثنين في محاولة الخروج بشيء جديد لقد جعل واحدة أو أكثر من فئات جديدة.

هل هناك نهج آخر قد تنطبق أفضل من هذه المشكلة ؟

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

المحلول

وأود أن نقترب من GA بتعاون العديد من الكائنات، بدلا من فئة واحدة كبيرة التغليف خوارزمية بأكملها. في الأساس، يمكن أن يكون لديك فئة مجردة عن كل كبيرة نقطة الاختلاف، والطبقات ملموسة لتنفيذ كل خيار تريد. يمكنك ثم الجمع بين الطبقات الخرسانية الذي تريده في العديد من أصناف GA.

وبالإضافة إلى ذلك، قد ترغب في التعرف على نمط الاستراتيجية: http://en.wikipedia.org/wiki/Strategy_pattern

نصائح أخرى

وكان النهج أخذت عند تنفيذ إطار GA بلدي على النحو التالي: إنشاء فئات التالية: توليد GeneticAlgorithm GeneticAlgorithmAdapter GeneticAlgorithmParameters تعداد السكان فرد

وعلى الرغم من أنني لم تنفذ نمط استراتيجية لعمليات مختلفة، وأنا واثق من أنه سيكون تافها لخلق العديد من التطبيقات العملية GA كمعلمات على سبيل المثال GeneticAlgorithm.

والطبقة GeneticAlgorithm يلتقط الخوارزمية الأساسية. انها حقا يعرف تماما الخطوات المختلفة (خلق السكان، العشوائي الفردية، والاختيار، عبر أكثر من، وتحور، الخ) ويدير سكان أفراد وتشغيل الخوارزمية. أتصور أن هنا هل يمكن سد العجز في عمليات مختلفة إذا أردت.

والسحر الحقيقي يكمن في المحول. هذا ما تتكيف مع نطاق المشكلة (الخاص فصول فرعية محددة من الأفراد، مع كل بياناتها ذات الصلة) إلى الخوارزمية الجينية. يمكنني استخدام الأدوية الكثير هنا حتى أن أنواع معينة من السكان، يتم تمرير المعلمات والأفراد في تنفيذ. هذا يعطيني التحسس ومن نوع قوي التدقيق لتنفيذ المحول. محول يحتاج أساسا لتحديد كيفية تنفيذ عمليات محددة للأفراد معينة (والجينوم الخاصة بهم). على سبيل المثال، وهنا هو واجهة لمحول:

/// <summary>
/// The interface for an adapter that adapts a domain problem so that it can be optimised with a genetic algorithm.
    /// It is a strongly typed version of the adapter.
    /// </summary>
    /// <typeparam name="TGA"></typeparam>
    /// <typeparam name="TIndividual"></typeparam>
    /// <typeparam name="TPopulation"></typeparam>
    public interface IGeneticAlgorithmAdapter<TGA, TIndividual, TGeneration, TPopulation> : IGeneticAlgorithmAdapter
        where TGA : IGeneticAlgorithm
        where TIndividual : class, IIndividual, new()
        where TGeneration : class, IGeneration<TIndividual>, new()
        where TPopulation : class, IPopulation<TIndividual, TGeneration>, new()
    {
        /// <summary>
        /// This gets called before the adapter is used for an optimisation.
        /// </summary>
        /// <param name="pso"></param>
        void InitialiseAdapter(TGA ga);

        /// <summary>
        /// This initialises the individual so that it is ready to be used for the genetic algorithm.
        /// It gets randomised in the RandomiseIndividual method.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="individual">The individual to initialise.</param>
        void InitialiseIndividual(TGA ga, TIndividual individual);

        /// <summary>
        /// This initialises the generation so that it is ready to be used for the genetic algorithm.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="generation">The generation to initialise.</param>
        void InitialiseGeneration(TGA ga, TGeneration generation);

        /// <summary>
        /// This initialises the population so that it is ready to be used for the genetic algorithm.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="population">The population to initialise.</param>
        void InitialisePopulation(TGA ga, TPopulation population);

        void RandomiseIndividual(TGA ga, TIndividual individual);

        void BeforeIndividualUpdated(TGA ga, TIndividual individual);
        void AfterIndividualUpdated(TGA ga, TIndividual individual);

        void BeforeGenerationUpdated(TGA ga, TGeneration generation);
        void AfterGenerationUpdated(TGA ga, TGeneration generation);

        void BeforePopulationUpdated(TGA ga, TPopulation population);
        void AfterPopulationUpdated(TGA ga, TPopulation population);

        double CalculateFitness(TGA ga, TIndividual individual);

        void CloneIndividualValues(TIndividual from, TIndividual to);

        /// <summary>
        /// This selects an individual from the population for the given generation.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="generation">The generation to select the individual from.</param>
        /// <returns>The selected individual.</returns>
        TIndividual SelectIndividual(TGA ga, TGeneration generation);

        /// <summary>
        /// This crosses over two parents to create two children.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="parentsGeneration">The generation that the parent individuals belong to.</param>
        /// <param name="childsGeneration">The generation that the child individuals belong to.</param>
        /// <param name="parent1">The first parent to cross over.</param>
        /// <param name="parent2">The second parent to cross over.</param>
        /// <param name="child">The child that must be updated.</param>
        void CrossOver(TGA ga, TGeneration parentsGeneration, TIndividual parent1, TIndividual parent2, TGeneration childsGeneration, TIndividual child);

        /// <summary>
        /// This mutates the given individual.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="generation">The individuals generation.</param>
        /// <param name="individual">The individual to mutate.</param>
        void Mutate(TGA ga, TGeneration generation, TIndividual individual);

        /// <summary>
        /// This gets the size of the next generation to create.
        /// Typically, this is the same size as the current generation.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="currentGeneration">The current generation.</param>
        /// <returns>The size of the next generation to create.</returns>
        int GetNextGenerationSize(TGA ga, TGeneration currentGeneration);


        /// <summary>
        /// This gets whether a cross over should be performed when creating a child from this individual.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="currentGeneration">The current generation.</param>
        /// <param name="individual">The individual to determine whether it needs a cross over.</param>
        /// <returns>True to perform a cross over. False to allow the individual through to the next generation un-altered.</returns>
        bool ShouldPerformCrossOver(TGA ga, TGeneration generation, TIndividual individual);

        /// <summary>
        /// This gets whether a mutation should be performed when creating a child from this individual.
        /// </summary>
        /// <param name="ga">The genetic algorithm that is running.</param>
        /// <param name="currentGeneration">The current generation.</param>
        /// <param name="individual">The individual to determine whether it needs a mutation.</param>
        /// <returns>True to perform a mutation. False to allow the individual through to the next generation un-altered.</returns>
        bool ShouldPerformMutation(TGA ga, TGeneration generation, TIndividual individual);
    }

ولقد وجدت أن هذا النهج يعمل بشكل جيد بالنسبة لي لأنني لا يمكن بسهولة إعادة تنفيذ GA للنطاقات مشكلة مختلفة، يكون مجرد كتابة المحول المناسب. من حيث اختيار، عبر الإفراط أو تحور مختلف التطبيقات، يمكن للمحول استدعاء تنفيذ أنها مهتمة في ما أفعله عادة هو التعليق الخروج أفكار مختلفة في محول بينما أنا التحقيق استراتيجية مناسبة.

ويساعد هذا الأمل. وأستطيع أن أعطي المزيد من التوجيه عند الضرورة. من الصعب أن تفعل العدالة تصميم مثل هذا.

وأعتقد أنك على تعقيد الأمور في نهجكم. أقترح عليك تحميل غالب الحزمة. حتى لو كنت سحب فقط ثيقة في أتش تي أم أل أو شكل قوات الدفاع الشعبي. وكانت هذه يبس حولها لبعض الوقت وأنا واثق الحقيقي التي سوف تتعلم كيفية تنظيم ليب لكم من يبحث كيفية تم القيام به في غالب.

بعض بت عشوائي من جهتي:

  • المشروع يجب أن تحقق (باعتباره النهج) ، ساعاتي
  • أصعب جزء من مبنى الغاز هو العثور على المعقول الوراثية تمثيل مشكلتك و بناء اللياقة البدنية الوظائف مع توزيع جيد اللياقة البدنية للحصول على عدد معين من السكان
  • عند التعامل مع (م)أي القيود الصعبة ، يمكن التفكير في إدخال مترجم الطبقة اللي تبونه يعالج القيود الصعبة ، بتكلفة (ممكن) الحمض النووي غير المرغوب فيه قليلا الأداء

وتنفيذ بك يشبه نمط ديكور .

وكما يقول الناس، لا تجعل من الدرجة عملاقة واحدة. ومن شأن ذلك أن يكون الرهيبة. تغليف السلوك في فئات مختلفة. الاستراتيجية هي الحل.
إذا كنت بحاجة إلى أمثلة تحميل مصادر وأمثلة من JGAP . لديه دعم للبرمجيات الجينية والخوارزميات الجينية. سترى تصميم جميل هناك لطيفة. الطفرة، كروس، اختيار والسكان، جين - كل هذه هي فصول منفصلة. كنت مجرد كائن تكوين الإعداد حيث يمكنك بدء اجهات محددة مع تطبيقات التي تريد استخدامها، تمرير المعلمات الخوارزمية المناسبة وتشغيله. حقا الحزمة ضخمة، جافادوك لطيفة، والتي يمكن أن ننظر دائما إلى مصدر أو الاختيار مجموعة البريد للحصول على بعض الإجابات. عندما كنت أبحث عن حزمة GA رأيت غالب وغيرها ولكن أعتقد أن هذا هو واحد الأكثر اكتمالا مع تصميم لطيف حقا.

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