سؤال

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

كان ذلك تصميما سيئا، لأنني أعلن قصيرا ولكنه باستخدام القيم "0" و "1" فقط ... ولكن كان مجرد نموذج أولي وعمل كما هو مخصص، والآن حان الوقت لتطوير جديد ، نسخة محسنة. الأداء مهم هنا، لكن البساطة موضع تقدير أيضا.

لقد بحثت حولها وتوصلت إلى:

بالنسبة ل ChromoSome: - فئة سلسلة (مثل "0100100010") - مجموعة من BOOL - ناقلات (المتجهات تبدو محسنة ل BOOL) - Bitset (الأصوات الأكثر طبيعية)

وعلى السكان: - C صفيف [] - ناقلات - قائمة الانتظار

أنا أميل إلى اختيار متجه ل Chromossome والمصفوفة للبوب، ولكن أود أن رأي أي شخص لديه خبرة في هذا الموضوع.

شكرا مقدما!

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

المحلول

أنا أظن أنك تريد وصول عشوائي إلى السكان وإلى الجينات. أنت تقول إن الأداء مهم، الذي يفسر سرعة التنفيذ. لذلك ربما تكون أفضل قبالة باستخدام vector<> للكروموسومات و vector<char> للجينات. السبب ل vector<char> هل هذا bitset<> و vector<bool> يتم تحسين استهلاك الذاكرة، وبالتالي فهي بطيئة. vector<char> سوف تعطيك سرعة أعلى بتكلفة الذاكرة X8 (على افتراض char = البايت على نظامك). لذلك إذا كنت تريد السرعة، انتقل مع vector<char>. وبعد إذا كان استهلاك الذاكرة أمرا بالغ الأهمية، فاستخدم vector<bool> أو bitset<>. bitset<> ومع ذلك، يبدو أن الخيار الطبيعي هنا، ومع ذلك، ضع في اعتباره أنه يغيب عن عدد البتات، مما يعني أن عدد الجينات يجب أن تكون ثابتة ومعروفة في تجميع الوقت (الذي أعتقد أنه كبير لا لا)، و B) إذا كنت تستخدم أحجام مختلفة، في نهاية المطاف مع نسخة واحدة لكل bitset حجم كل من bitset الأساليب التي تستخدمها (على الرغم من أن الشريط قد ينفي هذا)، أي رمز النفاية. عموما، وأود أن أخمن vector<bool> أفضل لك إذا كنت لا تريد vector<char>.

إذا كنت تشعر بالقلق إزاء جماليات vector<char> يمكنك typedef char gene; ثم استخدم vector<gene>, ، والتي تبدو أكثر طبيعية.

أ string هو تماما مثل vector<char> ولكن أكثر مرهقة.

نصائح أخرى

خصيصا للإجابة على سؤالك. أنا لست متأكدا تماما ما تقترحه. تتحدث عن صفيف وفئة السلسلة. هل تتحدث عن فصول الحاويات STL حيث يمكنك الحصول على قائمة قائمة انتظار ومقاتلة ومتجه ونقلها وما إلى ذلك. أود أن أقترح ناقلا متجه لك عدد السكان (أقرب شيء إلى مجموعة C هناك) و bitset بالنسبة لك كروموسوم إذا كنت قلق من قدرة الذاكرة. آخر كما كنت تستخدم بالفعل متجها لسلسلة Memance الخاصة بك من الحمض النووي الخاص بك. ("10110110")

للأفكار وأداة جيدة ل dabble. يوصي بتنزيل هذه المكتبة واستخدام هذه المكتبة في البداية. وهو يعمل مع المترجمين الرئيسيين. يعمل على المتغيرات يونيكس. لديه كل شفرة المصدر.

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

نظرا لأنها كائنات يمكنك تغيير Memplaion من الحمض النووي الخاص بك بسهولة من الأعداد الصحيحة إلى الفصول إلى الهياكل إلى الأشجار إلى صفائف BIT، إلخ.

هناك دائما علاج التعلم المعني ولكن الأمر يستحق كل هذا العناء.

أستخدمه لتوليد الآلاف من الشباك العصبية ثم أعشائها مع وظيفة اللياقة البدنية البسيطة ثم قم بتشغيلها حقيقية.

جاليب

http://lancet.mit.edu/ga/

على افتراض أنك تريد رمز هذا بنفسك (إذا كنت ترغب في أن Kingchris مكتبة خارجية يبدو أن يكون لديك فكرة جيدة هناك) يعتمد حقا على نوع التلاعب الذي تحتاجه للقيام به. للحصول على المزيد من الانفجار ل BUCT الخاص بك من حيث الذاكرة، يمكنك استخدام أي نوع عدد صحيح وتعيين / معالجة بتات فردية عبر Bitmasks وما إلى ذلك. الآن من المحتمل أن يكون هذا النهج غير مثالي من حيث سهولة الاستخدام ... مثال السلسلة أعلاه سيعمل حسنا، ولكن مرة أخرى لا تختلف كثيرا عن السراويل القصيرة، هنا أنت الآن تمثل فقط إما "0" أو "1" مع قيمة 8 بت بدلا من قيمة 16 بت. أيضا، مرة أخرى اعتمادا على التلاعب، من المحتمل أن تثبت حالة السلسلة غير عملي. لذلك إذا كنت تستطيع إعطاء بعض المعلومات الإضافية على الخوارزمية، فيمكننا إعطاء المزيد من التعليقات. نفسي أنا أحب البتات الفردية كجزء من عدد صحيح (Bitset)، ولكن إذا لم تكن معتادا على الأقنعة، والتحولات، وكل تلك الأشياء الجيدة التي قد لا تكون مناسبة لك.

أقترح كتابة فئة لكل عضو من أعضاء السكان، والتي تبسط بالأشياء بشكل كبير، حيث يمكنك الحفاظ على جميع الوظائف ذات الصلة الأعضاء في نفس المكان ملفوفة بالبيانات الفعلية بشكل جيد.

إذا كنت بحاجة إلى "مجموعة من المرض" أقترح استخدام INT أو العديد من Ints (ثم استخدام قناع وعمليات حكيمة بت الوصول إليها (تعديل / الوجه) كل بت) اعتمادا على عدد الكروموسومات الخاصة بك.

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

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

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