مقاله الگوریتم ژنتیک در زبان برنامه نویسی c++


در حال بارگذاری
23 اکتبر 2022
فایل ورد و پاورپوینت
2120
3 بازدید
۷۹,۷۰۰ تومان
خرید

توجه : به همراه فایل word این محصول فایل پاورپوینت (PowerPoint) و اسلاید های آن به صورت هدیه ارائه خواهد شد

  مقاله الگوریتم ژنتیک در زبان برنامه نویسی c++ دارای ۱۴۵ صفحه می باشد و دارای تنظیمات در microsoft word می باشد و آماده پرینت یا چاپ است

فایل ورد مقاله الگوریتم ژنتیک در زبان برنامه نویسی c++  کاملا فرمت بندی و تنظیم شده در استاندارد دانشگاه  و مراکز دولتی می باشد.

توجه : در صورت  مشاهده  بهم ریختگی احتمالی در متون زیر ،دلیل ان کپی کردن این مطالب از داخل فایل ورد می باشد و در فایل اصلی مقاله الگوریتم ژنتیک در زبان برنامه نویسی c++،به هیچ وجه بهم ریختگی وجود ندارد


بخشی از متن مقاله الگوریتم ژنتیک در زبان برنامه نویسی c++ :

الگوریتم ژنتیک در زبان برنامه نویسی c++
چکیده
علم ژنتیک، علمی است که به تازگی وارد علوم کامپیوتر شده و با استفاده از اجزا مورد نیاز ژنتیک و شبیه سازی آن در کامپیوتر، انسان را قادر می سازد تا بعضی از مسائل مختلف و پیچیده ای که در اوایل حل نشدنی بودند، را حل کند.
این مستند، یک کتابخانه از اشیا الگوریتم ژنتیک به زبان c++ می باشد. این کتابخانه شامل ابزاریست که برای بهبود هر برنامه ای به زبان c++ و هر خروجی و هر عملگر ژنتیکی، استفاده می شوند. در اینجا، با پیاده سازی الگوریتم ژنتیک، رابط برنامه نویسی آن و اشکالی برای راهنمایی، آشنا خواهید شد.

مقدمه
این مستند محتویات کتابخانه الگوریتم ژنتیک را رمز بندی می کند و بعضی از فلسفه های طراحی را که در پشت پیاده سازی هستند، نمایش می دهد. بعضی از مثال های کد منبع در آخر صفحه مشخص شده تا ساختار اصلی برنامه، توانایی های عملگرها، تطابق عملگرها با نیاز کاربر و مشتقاتی از کلاس های جدید مجموعه ژن را نمایش بدهند. وقتی که شما از یک کتابخانه استفاده می کنید به صورت ابتدایی با دو نوع کلاس کار می کنید الگوریتم مجموعه ژن و الگوریتم ژنتیک. هر نمونه ای از مجموعه ژن یک راه حل برای مسئله شما نشان می دهد. شی الگوریتم ژنتیک توضیح می دهد که چگونه سیر تکامل باید طی شود. الگوریتم ژنتیک از یک تابع عضو شی ای که توسط شما تعریف شده است استفاده می کند تا معین کند چگونه هر مجموعه ژن برای زنده ماندن مناسب است؟
الگوریتم ژنتیک از عملگر های مجموعه ژن ( که در داخل مجموعه هستند) و استراتژی های انتخاب/ جایگزینی ( که در داخل الگوریتم ساخته می شود ) برای تولید یک مجموعه ژن جدید مجزا ، استفاده می کند.

سه چیز برای حل مسئله با استفاده از الگوریتم ژنتیک وجود دارد :
۱ تعریف خروجی های که نشان داده میشوند
۲ تعریف عملگر های ژنتیکی
۳ تعریف تابع عضو شی را

GALIB (کتابخانه الگوریتمهای ژنتیک ) به شما در دومورد اول به وسیله مهیا کردن مثال های زیاد وتکه برنامه هایی که شما می توانید ، خروجی ها و عملگر های خود را بسازید کمک می کند . در خیلی از موارد شما می توانید از ساختار خروجی ها و عملگر ها با کمی یا هیچ اصلاحی استفاده کنید . تابع عضو شی کاملا به شما مربوط می شود .

در صورتی که شما خروجی ها ، عملگرها و موارد شی را داشته باشید ، می توانید هر کدام از الگوریتم های ژنتیک را برای پیدا کردن راه حل بهتر و مناسبتر برای مسئله تان به کار بگیرید. موقعی که شما از الگوریتم ژنتیک برای حل یک مشکل بهینه استفاده می کنید، باید قادر باشید که یک راه حل برای مسئله در یک ساختمان داده ارائه بدهید . الگوریتم ژنتیک یک جمعیت از راه حل هایی که بر طبق نمونه ساختمان دادهایی که به وجود آورده اید، ایجاد می کند . بعد الگوریتم ژنتیک بر روی این جمعیت عمل

می کند تا بهترین راه حل را ازآن استخراج کند.در GALIB کتابخانه الگوریتم ژنتیک به نمونه ساختمان داده GAGENOME گفته می شود (بعضی ها به آن کروموزوم نیز می گویند ). این کتابخانه شامل چهار نوع از این مجموعه هاست GALISTGENOME ( لیست پیوندی مجموعه ژن)GATREEGAGENOME (درخت مجموعه ژن) GAARRYGENOME( آرایه مجموعه ژن) GABINARYSTRINGGENOME(رشته دودویی مجموعه ژن). این کلاس ها از کروموزوم یا کلاس GAGENOME اصلی و یک کلاس ساختمان داده ای که بوسیله نامشان مشخص شده اند، مشتق شده اند.

برای مثال لیست پیوندی مجموعه ژن از کلاس GALIST و همچنین کلاس مجموعه ژن GAGENOME مشتق شده است. از ساختمان داد ه ای که با تعریفات مسئله شما همخوانی دارد، استفاده کنید. برای مثال ، اگر شما سعی می کنید که یک تابعی را بهینه سازی کنید که به پنج عدد حقیقی وابسته است ، پس به عنوان مجموعه ژن خود از یک آرایه یک بعدی با پنج عنصر اعشاری استفاده کنید.

الگوریتم های ژنتیک مختلف زیادی وجود دارند. GALIB (کتابخانه الگوریتم ژنتیک) شامل سه نوع اصلی می باشد:
۱ حالت ساده
۲ حالت ساکن یا ثابت یا یکنواخت
۳ حالت افزایش

این الگوریتم ها در طریق های که مجموعه های جدید مجاز را ایجاد می کند ومجموعه های قدیمی را درزمان سیرتکامل جایگزین می کنند ، با یکدیگر تفاوت دارند.
GALIB دو مکانیسم اولیه برای گسترش قابلیت های ساخت شی را مهیا می کند اول از همه (و مهمتر از همه از نظر برنامه نویسی C++ ) شما می توانید کلاس های خودتان را درست کنید و تابع های عضو جدیدی را تعریف کنید . اگر شما احتیاج دارید که فقط تنظیمات کمی را بر روی رفتار کلاس GALIB اعمال کنید ، در بیشتر موارد می توانید یک تابع تعریف کنید و به کلاس GALIB بگویید که از آن به عنوان پیش فرض استفاده کند .

الگوریتم های ژنتیک اگر به درستی پیاده سازی شوند، قابلیت هر دو مورد پویش( پیدا کردن وسیع)و کاوش (پیداکردن محلی )در فضای SEARCH را، دارند. نوع رفتار یا عملکردی را که شما می بینید، بستگی به این دارد که چگونه عملگرها کار می کنند و همچنین بستگی به شکل یا فرم فضای SEARCH شما دارد.

الگوریتم ژنتیک
شی الگوریتم ژنتیک معین می کند که کدام سلول مجرد باید زنده بماند، کدام یک باید دوباره تولید شود و کدام یک باید بمیرد. شیء‌الگوریتم ژنتیک می‌تواند آمارها را ضبط کرده و تصمیم بگیرد که چه مدت تکامل ادامه پیدا کند. معمولا یک الگوریتم ژنتیک هیچ نقطه پایان دقیقی ندارد وشما باید الگوریتم فرمان بدهید که چه موقع تمام شود. از تعداد نسل‌ها برای پایان الگوریتم استفاده می‌شود. ولی شما می‌توانید از خوبی بهترین راه حل یا جمعیت‌ها یا هر استاندارد مخصوصی برای مشکل خودکه مایل هستید، برای پایان الگوریتم استفاده کنید.

این کتابخانه شامل چهار نوع از الگوریتم ژنتیک می‌باشد. اولین آنها استاندارد الگوریتم ژنتیک ساده است که توسط Goldberg در کتابش توضیح داده شده است. این الگوریتم از جمعیت‌های بدون اشتراک و بهترین‌های قابل انتخاب، استفاده می‌کند. هر نسلی که الگوریتم ژنتیک ایجاد می کند یک مجموعه اجزاء جدید جمعیت، بوجود می‌آید. دومین نوع الگوریتم ژنتیک،‌ الگوریتم حالت ساکن یا یکنواخت می‌باشد که از جمعیت اشتراکی استفاده می‌کند. دراین گونه شما می توانید مشخص کنید که چه مقدار از جمعیت باید در هر نسلی جایگزین شوند. سومین نوع، الگوریتم ژنتیک افزایش است که درآن هر نسلی شامل یک یا دو فرزند می‌باشد. الگوریتم به متدهای جایگزینی دلخواه اجازه می‌دهد چگونگی یکپارچگی جمعیت از یک نسل جدید دخیل تعریف کنند. به عنوان مثال یک فرزند جدید تولید شده می‌‌تواند جای والدین خود را بگیرد یا به جای افراد مختلف در جمعیت جایگزین شود و یا جایگزین فردی که بیشترین شباهت را به او دارد شود. نوع چهارم، الگوریتم ژنتیک مرتبط می باشد این نوع الگوریتم چندین جمعیت را به صورت موازی با استفاده از الگوریتم حالت یکنواخت نمو می‌دهد. هر نسل الگوریتم بعضی از افراد را از یک جمعیت به جمعیت دیگری انتقال می‌دهد.

به علاوه این نوع های اصلی ، Galib یک ترکیب از کلاسهای الگوریتم ژنتیکی که شما نیاز دارید تا کلاس‌های دلخواه خودتان را داشته باشید، تعریف می‌کند. مثال‌ها شامل بعضی از مشتقات دارای (۱) یک الگوریتم ژنتیک که از چندین جمعیت وانتقال بین جمعیت بر روی cpu های مختلف استفاده کند. (۲) یک الگوریتم ژنتیک که انبوه سازی وابسته به ورودی را انجام می‌دهد، تا گونه‌های مختلف افراد را در حین سیر تکامل حفظ کند.
کلاس پایه‌ای الگوریتم ژنتیک شامل عملگرها و داده‌های معمول برای بیشترین نوع الگوریتم ژنتیک است. وقتی شما الگوریتم ژنتیک دلخواه خود را می‌خواهید درست کنید می‌توانید از این اعضا داده و تابع‌ها برای داشتن آمارها و نظارت بر اجرا، استفاده کنید.

الگوریتم ژنتیک شامل آمارها، استراتژی جایگزینی و پارامترها، برای راه اندازی و اجرا الگوریتم می‌باشد. شی جمعیت ظرفی برای مجموعه ژن، همچنین بعضی از آمارها و عملگرهای انتخاب و اندازه‌گیری را نیز داراست. یک الگوریتم ژنتیک معمولی برای همیشه اجرا می شود. کتابخانه تابعی را برای مشخص کردن این که در چه زمانی الگوریتم باید پایان یابد، ایجاد کرده است که شامل پایان بر روی نسل، که در آن شما یک شماره از نسل ها را تعیین می کنیدکه الگوریتم باید تا آنجا اجرا شود و پایان برروی همگرایی، که در آن ارزشی را مشخص می‌کنید که بهترین امتیاز از نسل‌ها باید همگرا شوند. شما می‌توانید توابع پایانی را به طور دلخواه تنظیم کنید و از ملاک خود برای پایان استفاده کنید.

تعداد ارزشیابی توابع، راه خوبی برای مقایسه الگوریتم‌های ژنتیک با متدهای مختلف جستجوی دیگر می‌باشد. الگوریتم‌های ژنتیک Galib هر دو سنجش‌های جمعیت و تعداد مجموعه ژنها را می‌تواند داشته باشد.

تعریف خروجی ( نمایش)
از ساختمان داده مناسبی برای مسئله‌تان استفاده کنید. اگر شما یک تابع از اعداد حقیقی را بهبود می‌بخشید، از اعداد حقیقی در مجموعه ژنها استفاده کنید. اگر راه حل مشکلتان می‌تواند بوسیله اعداد تصویری یا ارزش صحیح دیگر، نمایش داده‌ شود، از آنها برای تعریف مجموعه ژنها استفاده کنید.

تعریف یک خروجی مناسب ا زهنرهای استفاده از الگوریتم است. (و هنوز یک هنر است نه یک علم) از حداقل خروجی استفاده کنید که کاملا تشریح کننده می‌باشد. خروجی شما باید بتواند تمامی راه حل‌ها برای مسئله‌تان را نمایش دهد. ولی اگر شما باید آن را طراحی کنید تا نتواند راه حل غیر علمی را برای مسئله نمایش دهد،‌بخاطر داشته باشید که اگر مجموعه ژنها بتواند راه‌حل‌های غیر علمی را نمایش دهد در اینصورت تابع باید طوری طراحی شود که به راه‌حل‌های غیر علمی یک ارزش ناتمامی بدهد.

خروجی نباید شامل اطلاعاتی بیشتر از اطلاعات مورد نیاز برای نمایش باشد. اگر چه مزیتی است استفاده از خروجی که شامل موادهای اضافی ژنتیکی‌ می‌باشد ولی آنها باید بدرستی پیاده سازی شده باشند. در مجموعه تابع های شی و توجه کامل به نوع و خصوصیات فضای SEARCH این تمایل به افزایش در اندازه فضای SEARCH می باشد و بدین گونه از عملکرد خوب الگوریتم ژنتیک جلوگیری می شود. تعداد نمایش خروجی بی نهایت می باشد. شاید شما کاملا یک خروجی عددی مانند آرایه ای اعداد حقیقی را انتخاب کنید، این اعداد می توانند به عنوان اعداد حقیقی پیاده سازی شوند یا در نوع Goldberg رشته ای از بیت ها که اعداد حقیقی را طراحی کنند. مواظب باشید که استفاده مستقیم از اعداد حقیقی می تواند خروجی های دودویی را به دهدهی برای بیشتر مسئله ها تبدیل کند خصوصا موقعی که از عملگر های منطقی متقاطع استفاده می کنید.

مسئله شما ممکن است به توالی و سلسله مراتب موارد بستگی داشته باشد.که در این مورد یک ترتیب پایه ای برای خروجی یا لیست پیوندی و یا آرایه بیشتر صحیح می باشد، در خیلی از این موارد شما باید عملگر های را انتخاب کنید که یکپارچگی سلسله مراتب را نگه می دارد عملگر متقا طع باید لیست ثبت شده را بدون تکثیر کردن عناصر لیست تولید کند بقیه مسائل به ساختمان درختی مرتبط هستند.

در اینجا شاید شما بخواهید که صریحا راه حل را به صورت درختها نمایش دهید و عملیات ژنتیکی را مستقیما بر روی آنها انجام دهید. معمولا بیشتر افراد درخت ها را در یک آرایه یا رشته معینی برنامه نویسی می کنند، بعد روی رشته مورد نظر عملیات را انجام می دهند. بعضی از اشکالات شامل مخلوطی از عناصر پیوسته و ناپیوسته می باشند، که در این مورد شما احتیاج به یک ساختار جدید دارید تا اطلاعات مختلط را در خود نگاه دارد. همچنین شما باید عملگرهای ژنتیکی را تعریف کنید که به ساختار راه حل، احترام بگذارد. برای مثال، یک راه حل با هر دو قسمت صحیح و اعشاری ممکن است از crossover استفاده کند که قسمت های صحیح را با قسمت های اعشاری طی کند، و هیچ وقع قسمت اعشاری را با قسمت صحیح مخلوط نمی کند.

هر کدام از این خروجی هایی را که انتخاب می کنید، این اطمینان را داشته باشید که عملگرهای درستی را برای نمایشتان انتخاب کرده اید.

عملگرهای مجموعه ژن
هر مجموعه ژن سه عملگر اولیه دارد:عمگر اولیه،عملگر جهشی و عملگر متقاطع. با این عملگرها شما می توانید یک جمعیت اولیه را بوجود آورید، یک جهش یا یک crossover خاصی را برای خروجی مسئله تان تعریف کنید یا زمانی که جمعیت شما رشد می کند قسمت هایی از الگوریتم ژنتیک را نمو دهید. GALIB با این عملگرهای از قبل تعریف شده برای هر مجموعه ی سلول همراه است ولی شما می توانید این عملگرها را بر طبق سلیقه تان تنظیم کنید.

عمگر اولیه معین می کند که چگونه مجموعه ی سلول ها مقدار دهی اولیه می شوند. این عملگر زمانی صدا زده می شود که شما یک جمعیت یا الگوریتم ژنتیک را مقدار دهی اولیه می کنید. این عملگر در اصل یک مجموعه ی جدید را ایجاد نمی کند، بلکه مجموعه ی سلول ها را مقدار دهی اولیه می کند با استفاده از مواد اصلی ژنتیک که از آنها تمام راه حلها رشد می کنند. شی جمعیت دارای عملگر اولیه ی خود می باشد. به طور پیش فرض این عمل، عملگرهای اولیه ی مجموعه ژن در جمعیت را صدا میزند ولی شما می توانید آن را به دلخواه تنظیم کنید.

عملگر جهشی یک زیر برنامه برای جهش هر مجموعه ی ژن تعریف می کند. جهش یعنی چیزهای مختلف برای نوع داده های مختلف . برای مثال ، یک جهشگر معمولی برای یک مجموعه ژنهای دودویی رشته ای می تواند بیت ها را بوسیله امکانات داده شده ، در خود جای دهد. یک جهشگر معمولی برای درخت می تواند زیر درخت ها را با امکان داده شده جابجا کند. بصورت عام شما باید عملگرجهشی را طوری تعریف کنید که بتواند هر دو عمل کاوش و استخراج را انجام دهد، عملگر جهشی باید قادر به معرفی کردن مواد ژنتیکی جدید و همچنین ، تغییر مواد موجود باشد. ممکن است شما بخواهید چندین نوع عملگر جهشی را برای یک مسئله تعریف کنید.
عملگر متقاطع یک زیر برنامه برای تولید فرزند از دو والدین ( مجموعه ژن ) تعریف می کند. همانند عملگر جهشی و عملگر متقاطع، مخصوص نوع داده می باشد و بر خلاف عملگرهای دیگر عملگر متقاطع شامل چندین مجموعه ی ژن می شود.

در GALIB هر مجموعه ژن شامل بهترین متد برای جفتگیری است(متد پیش فرض متقاطع )ولی قادر به انجام عمل crossover به خودی خود نمی باشد. هر کدام از الگوریتم های ژنتیک می دانند که چگونه متد پیش فرض متقاطع را از مجموعه ژن بگیرند و بعد از آن متد برای جفتگیری استفاده کنند. با استفاده از این مدل، این امکان وجود دارد که کلاس های الگوریتم ژنتیک جدید مشتق شده ای را داشته باشیم که از متدهای جفتگیری ،بیشتر از مجموعه ژن های پیش فرض تعریف شده، استفاده می کنند.

هر کدام از این متدها می توانند بطور دلخواه تنظیم شوند تا نه فقط مخصوص به نوع داده باشند بلکه به نوع مسئله هم مرتبط باشد. این راهی است که شما می توانید بعضی از مسائل مخصوص به هوش را در الگوریتم ژنتیک جای دهید( در این مورد که آیا این راه خوبی است یا نه در اینجا بحث نخواهیم کرد).

به علاوه عملگرهای اولیه ، هر مجموعه ژن باید شامل یک تابع شیء باشد و ممکن است یک مقایسه کننده نیز داشته باشد. تابع شیء برای ارزیابی مجموعه ژن استفاده می شود. مقایسه کننده (که معمولا به تابع های دور از محیط معروف هستند ) برای این است که تعیین کند چگونه یک مجموعه ژن از دیگری متفاوت است. هر الگوریتم ژنتیک نیاز به یک تابع شیء دارد ، در این صورت است که الگوریتم ژنتیک تعیین می کند کدام یک از اجزاء برتر از دیگری است. بعضی از الگوریتم های ژنتیک نیاز به مقایسه کننده نیز دارند . این کتابخانه بعضی از انواع دادههای دست نخورده را دارد ، ولی اگر شما بعنوان مثال یک آرایه یا لیستی از اشیاء را دارید ، می توانید سریعا بوسیله ی چندین خصوصیت وراثتی شیءتان و شیءمجموعه ژن، یک مجموعه ژن بسازید. بعد از این عملیات می توانید مستقیماْ این شئ جدید را در کتابخانه اشیاٌ GALIB استفاده کنید .

به صورت عام ، الگوریتم ژنتیک نیازی به دانستن اینکه بر روی چه ساختمان داده ای عملیات انجام می دهد ، ندارد . کتابخانه این عمل را به طور خودکار انعکاس می دهد. شما می توانید نوع های مجموعه ژن را با الگوریتم ژنتیک مخلوط و هماهنگ کنید. الگوریتم ژنتیک می داند که چگونه مجموعه ژن را با هم در آمیزد تا یک جمعیت جدید ایجاد کند ، مجموعه ژن را مقدار دهی اولیه کند تا اجرا شروع شود ، مجموعه ژن ها را طی کند تا فرزندان تولید شوند ، و درآخر، در مجموعه ژن جهش ایجاد کند. تمام این عملیات بوسیله ی توابع عضو مجموعه سلول ، انجام می شود.

شئ جمعیت
شی جمعیت ظرفی برای مجموعه ژن می باشد. هر شی جمعیت عملوندهای اولیه ( به طور پیش فرض ، عملوند اولیه را برای هر اجزا در جمعیت صدا می زند ) و عملوند ارزیاب ( که بطور پیش فرض عملوند ارزیاب را برای هر اجزا در جمعیت صدا می زند )مرتبط با خودشان را دارند. همچنین این شی بهترین میانگین و قوانین و غیره برای جمعیت را نگه داری می کند. ابعاد مختلف را نیز می توان ثبت کرد ، ولی به این خاطر که ابعاد محاسباتی بیشتر اوقات نیاز به محاسبات عددی بسیار بزرگی را دارند ، پیش فرض شی ثبت ابعاد نمی باشد . متد انتخاب نیز در شی جمعیت تعریف شده است. این متد بوسیله ی الگوریتم ژنتیک برای انتخاب اینکه کدامیک از اجزا مجموعه باید در هم بیامیزند ، استفاده می شود.

هر شی جمعیت یک شی ارزیاب برنامه، مرتبط با خودش دارد. شی ارزیابی برنامه امتیاز شی گرایی هر مجموعه را به بهترین امتیاز شی گرایی آن مجموعه ژن تبدیل می کند تا الگوریتم ژنتیک از آن برای انتخاب استفاده کند. همچنین این شی اطلاعات با اندازه ی معین را برای استفاده بعدی که به وسیله ی برنامه های انتخاب انجام می شود ، نگهداری می کند .

توابع شی و مقیاس گداری مناسب
معمولا الگوریتم ژنتیک بیشتر از متدهای جستجوی GARDIENT که جالب تر هستند استفاده می کند، زیرا آنها نیازی به معادله های مختلف پیچیده یا فضای SEARCH صاف ، ندارند.
الگوریتم ژنتیک فقط یک مقدار از اینکه چگونه سلولی با سلول های دیگر مقایسه می شوند ، را نیاز دارد . تابع شی با استفاده از یک راه حل، این مقدار را مهیا می کند .
مهم است که تفاوت بین امتیازات مناسب و شی را بفهمیم. امتیاز شی مقدار برگشتی از تابع شی تان می باشد و این یک عملیات ارزیابی خام برای مجموعه ژن است.

امتیاز مناسب ، سرعت امکان انتقال است که به وسیله ی الگوریتم ژنتیک استفاده می شود تا مناسب بودن اجزا برای جفتگیری را تعیین کند . معمولا امتیاز مناسب بوسیله ی یک امتیازدهنده ی خطی شی گرایی خام بدست می آید(ولی شما می توانید هر نقشه ای را که می خواهید طراحی کنید و یا هیچ انتقالی نداشته با شید). برای مثال، اگر شما از امتیاز دهنده ی خطی استفاده می کنید و بعد از آن امتیاز مناسب از امتیازات شی گرایی با استفاده از تکنیک امتیازدهنده ی دلخواه مناسب تعریف شده در کتاب GOLDBERG بدست می آید. الگوریتم ژنتیک ، از امتیاز مناسب برای عمل انتخاب استفاده می کند و نه از امتیاز شی گرایی.

شما می توانید اجزا را در جمعیت با استفاده از تابع ارزیاب ( که شما خود آن را تعریف کرده اید ) ارزیابی کنید یا با استفاده از یک ارزیاب بر پایه جمعیت نیز(که خود تعریف کرده اید) می توانید این سنجش را انجام دهید. اگر شما از یک شی گرایی بر پایه اجزا استفاده کنید ، تابع به همه ی مجموعه ژن ها، مرتبط می شود. تابع شی گرایی بر پایه جمعیت می تواند از توابع شی گرایی اجزا استفاده کند ، یا می تواند امتیاز آنها را خودش تعیین کند.

حالا ببینیم الگوریتم ژنتیک چگونه درc++ نمایش داده می شود ؟
یک نوع برنامه بهینه سازی شده به شکل زیر می باشد. این مثال یک مجموعه ژن رشته ای باینری یک بعدی با عملگرهای پیش فرض ایجاد و بعد از یک الگوریتم ژنتیک ساده برای تکامل استفاده می کند.
float Objective(GAGenome&);
main(){
GA1DBinaryStringGenome genome(length, Objective); // create a genome
GASimpleGA ga(genome); // create the genetic algorithm
ga.evolve(); // do the evolution
cout << ga.statistics() << endl; // print out the results
}
float Objective(GAGenome&) {
// your objective function goes here
}
شما به آسانی می توانید رفتار الگوریتم ژنتیک را بوسیله ی معرفی پارامتر های مختلف تغییر دهید.بیشتر آنها بصورت زیر هستند:
ga.populationSize(popsize);
ga.nGenerations(ngen);
ga.pMutation(pmut);
ga.pCrossover(pcross);
GASigmaTruncationScaling sigmaTruncation;
ga.scaling(sigmaTruncation);

به صورت متوالی شما می توانید الگوریتم ژنتیک GALIB را از فایل یا خط فرمان بخوانید . قطعه برنامه زیر یک الگوریتم ژنتیک را ایجاد می کند، پارامتر ها را از فایل می خواند، پارامتر ها را از خط فرمان می خواند، تغییرات را اعمال می کند و بعد مشخصات را بعد از اجرا چاپ می کند.
GASteadyStateGA ga(genome);
ga.parameters(“settings.txt”);
ga.parameters(argc, argv);
ga.evolve();
cout << ga.statistics() << endl;

یک نوع تابع شی گرایی به این شکل می باشد( این تابع امتیاز بالاتری را به مجموعه ژن دودویی رشته ای که همه ی آنها شامل ۱ می باشد، اختصاص می دهد).
float
Objective(GAGenome & g) {
GA1DBinaryStringGenome & genome = (GA1DBinaryStringGenome &)g;
float score=0.0;
for(int i=0; i<genome.length(); i++)
score += genome.gene(i);
return score;
}

شما می توانید یک تابع شی گرایی به عنوان یک عضو ثابتی از کلاس مشتق شده ، تعریف کنید ویا یک تابع تعریف کنید و از آن برای کلاس های مجموعه ژن در GALib موجود ، استفاده کنید.
وقتی که شما یک تابع شی گرایی را می نویسید، شما اول باید مجموعه ژن کلی را در نوع مجموعه ژنی که تابع شئ گرایی شما نیاز دارد، اضافه کنید. از آن به بعد می توانید با یک مجموعه ژن خاص کار کنید. هر تابع شئ گرایی یک مقدار را برمی گرداند که این مقدار امتیاز شئ گرایی آن مجموعه ژنی که به تابع شئ گرایی فرستاده شده بود، را نمایش می دهد.

عملگرها، چه کارهایی می توانند انجام دهند؟
در اینجا، بعضی مثال هایی که از نوع جهش و متقاطع می باشند که می توان با استفاده از GALib انجام داد، مشاهده می کنید. متقاطع های سنتی دو فرزند از دو والدین تولید می کنند و جهش معمولا به یک فرد اختصاص داده می شود. به هر حال، خیلی دیگر از نوع جهش ها و متقاطع ها، امکان وجود دارد، مانند متقاطع با استفاده از سه والدین یا بیشتر، متقاطع جنسی یا جهش بر پایه جمعیت. مثال های زیر بعضی از متدهای استاندارد، متقاطع جنسی و جهش فردی در GALib ،را نشان می دهد.

چگونه عملگرهای خودتان را تعریف کنید؟
تعریف عملگرها به مشکلی طراحی الگوریتمی است که می خواهید پیاده سازی کنید. همانطور که پیاده سازی انجام می شود، در مورد تعریف عملگر چیز زیادی نمی توان گفت. برای اختصاص دادن یک عملگر به مجموعه ژن ، فقط از تابع عضو صحیحی استفاده کنید. برای مثال، کدهای زیر’MyInitializer’ را به تابع اولیه ساز و ‘MyCrossover’ را بعنوان تابع متقاطع را به مجموعه ژن رشته ای دودوئی،تخصیص می دهد.
GA1DBinaryStringGenome genome(20);
genome.initializer(MyInitializer);
genome.crossover(MyCrossover);

اگر شما این عمل را با اولین مجموعه ژن انجام دهید، (آن ژنی که برای مجموعه ژن استفاده می کنید) در نتیجه تمام ژنهایی که GA کپی می کند، تمام عملگرها برایشان تعریف شده خواهند بود.
وقتی که شما مجموعه ژن خودتان را مشتق می کنید، معمولا یک کپی سخت از عملگرها را در مجموعه ژن به صورت زیر انجام خواهید داد:
class MyGenome : public GAGenome {

public:
static void RandomInitializer(GAGenome&);
static int JuggleCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*);
static int KillerMutate(GAGenome&, float);
static float ElementComparator(const GAGenome&, const GAGenome&);
static float ThresholdObjective(GAGenome&);
public:

MyGenome() {
initializer(RandomInitializer);
crossover(JuggleCrossover);
mutator(KillerMutate);
comparator(ElementComparator);
evaluator(ThresholdObjective);
}
// remainder of class definition here
};

در نظر داشته باشید که چه آسان تغییر عملگرها صورت می گیرد. شما می توانید تعدادی از عملگرها را برای یک نمایش ساده و تجربه با آنها تعریف کنید تا ببینید کدام عملگر بهتر عمل می کند.

  راهنمای خرید:
  • در صورتی که به هر دلیلی موفق به دانلود فایل مورد نظر نشدید با ما تماس بگیرید.