مطالب صرفا بصورت دمو می باشد و فروشی در این سایت انجام نمی شود.
نسخه نوشتاری
یکی از مخاطبین سوالی را مطرح کردند با این مضمون که میخواهند با استفاده از الگوریتم قورباغه که آموزش آن در فرادرس موجود است، مسالهای را حل کنند که در آن هدف بیشینه کردن «میزان برازش» (Fitness) است. در اغلب آموزشهایی که در فرادرس موجود هستند، مانند آموزشهای الگوریتمهای بهینهسازی و تکاملی گوناگون، مساله کمینهسازی حل شده است؛ یعنی یک تابع زیان (Cost Function) وجود داشته که هدف، کم کردن مقدار آن بوده است. اما اگر هدف، حل عکس این مساله باشد، چه میشود؟ اگر بخواهیم میزان برازش (میزان برازش) را در واقع بهبود بدهیم و بیشینه کنیم چه راهکاری وجود دارد؟ در واقع اگر مساله «بیشینهسازی» (Maximization) باشد، چه میشود؟
در چنین مواردی، چند راهکار میتواند مورد استفاده قرار بگیرد. یکی از این راهکارها این است که کاربر اصلا کد این مساله را دست نزند؛ یعنی کد الگوریتم همین طور باشد. در آن تابع زیان (Cost Function)، همین تابع میزان برازش ( Fitness Function)، تعریف شود، فقط قرینه میزان برازش (Fitness) به عنوان خروجی بازگردانده شود. زیرا، از نظر ریاضی میدانیم که بیشینه کردن تابع (F(x، مانند کمینه کردن منفی (F(x است. بنابراین، میتوان با ضرب کردن خروجی در یک منفی، خیلی راحت این کار را انجام داد.
یک راه کمی سختتر این است که کد را کمی دستکاری کرد؛ در قسمتی که بهتر و بدتر بودن را بررسی میکند، در واقع دو پاسخ با یکدیگر در رقابت هستند. در آنجا پیش از این گفته شده که هر چه کمتر باشد بهتر است؛ اکنون باید گفت هر چه بیشتر باشد بهتر محسوب میشود. در حالت خیلی کلیتر، آموزشی در فرادرس موجود است با عنوان «پیادهسازی الگوریتمهای فراابتکاری با استفاده از زبان برنامهنویسی #C»؛ در آن آموزش نوع مساله تعریف شده که کمینهسازی یا بیشنهسازی است و بر اساس نوع مساله، بهتر و بدتر تعریف میشود.
در واقع، نوع مساله بالاتر (در ابتدای کد #C) – در کد متلب هم این کار را میتوانیم انجام بدهیم – تعریف میشود و مشخص میشود که از چه نوعی است؛ بعد، آن پایین مقایسه به یک تابع سپرده میشود که این تابع، دو تا پاسخ الف و ب و نوع مساله را میگیرد. حالا نوع مساله اگر از نوع کمینهسازی باشد الف از ب بهتر است، به شرطی که کمتر از آن باشد. اما پارامتر سوم که نوع مساله است اگر که بیشنهسازی باشد، الف از ب اگر بیشتر باشد بهتر است. یعنی مقایسه را باید به داخل یک تابع برد، تا بتوان به این روش این کار را انجام داد که خیلی کلیتر هم میشود و در واقع فرد خیلی راحت میتواند در بالا فقط نوع مساله را تغییر بدهد تا عوض شود (بیشینهسازی یا کمینهسازی بشود).
حالا این نوع پیادهسازی به غیر از زبان #C، با زبان دیگری در فرادرس موجود نیست؛ ولی توصیه میشود افراد آن آموزش را مشاهده کنند، زیرا از یک روش خیلی پیشرفتهتر از برنامهنویسی در آن استفاده میشود و به هر حال یک تجربه متفاوت است. لزومی هم ندارد آموزش حتما خریداری شود، چون بخش زیادی از درسهای آن رایگان هستند. به نظر من، این سبک برنامهنویسی چیزی است که افراد در پروژههای بزرگ به آن احتیاج دارند. به طور خاص، اگر دوستانی که در مقطع دکتری تحصیل میکنند، با مسائل بزرگی درگیر هستند و یا سالها است که با متلب کار میکنند، یک نیم نگاهی هم به یک زبان برنامهنویسی کامپایل شده مانند #C یا جاوا داشته باشند که الگوی آن در همان آموزش داده شده، خیلی میتواند خوب باشد.
به هر حال، هدف کلا این بود که راه حلی برای مساله طرح شده بیان شود. این مساله را به سادگی، با قرینه کردن میتوان انجام داد. روشی که کار بیشتری میبرد و فقط مسائل بیشینهسازی را حل میکند، عوض کردن جهت نامساوی است. روش اصولی و درست این کار هم آن است که اساسا این مقایسه به یک تابع سپرده شود که نوع مساله نیز جز ورودیهای همین تابع باشد.
هنوز بررسیای ثبت نشده است.