اینم یه تجربه پراکنده دیگه!

خب من این مدت شروع کردم به ضبط چند قسمت ویدئو به فرمت اسکرین کست از کتاب «۹۷ چیز که یک برنامه نویس بهتر است بداند». الان میخوام توضیح بدم که این کار رو به چه صورتی انجام دادم.

برای اینکه متن طولانی نشه مطالب در قسمت‌هایی که قسمت‌ها اینها هستن ارائه میشن:

  1. اصلا چطور شروع کنیم.
  2. نرم افزار تولید
  3. بهبود پس از تولید: معمولا کیفیت صدا بهتر میشه و قسمت‌های ناخواسته ویدئو حذف میشه و از این دست چیزها.
  4. انتشار

توی این پست حرف اساسی اینه که از کجا شروع کنیم. شروع کردن حداقل واسه من به شکل زیر اتفاق افتاد.

  • اول از همه مشخص کردم که هدفم چیه؟ به این سوال جواب دادم که میخوام به کجا برسم و اهدافم چیه. این باعث میشه که موضوع و ابزار رو به درستی انتخاب کنم و توی مسیر خیلی گیج نزنم.
  • دوم اینکه موضوعی رو انتخاب کردم که بهش علاقه دارم و ازش لذت میبرم. همچنین توان ارائه اون موضوع رو هم در خودم میدیدم.
  • سعی کردم ابزارها رو بررسی کنم و ابزارهای درست رو انتخاب کنم.

کلا هم روند اینه که من محتوا اسکرین کست (اسلایدها، اگه بشه متن ارائه) رو آماده میکنم و شروع به ضبط کردن میکنم( من از obs برای ضبط استفاده میکنم). من ترجیحم اینه که توی روند تولیدم نیازی به «بهبود پس از تولید» نباشه پس اگه توپق بزنم یا هر چیز دیگه‌ای، روند ضبط رو قطع میکنم و از اول همه ویدئو رو ضبط میکنم. بعد از چندبار ضبط کردن، به نقطه‌ای میرسم که خودم از کیفیت ارائه انجام شده راضی‌ام. اونجاست که میرم سراغ انتشار ویدئو.

برای انتشار ویدئو هم من اول ویدئو رو روی یوتیوب میگذارم و بعدش اون رو به آپارات منتقل میکنم. اینطوری تنها یک بار ویدئو رو آپلود میکنم.

همین!

پ.ن. انشالا در قسمت بعد یکم در مورد نرم‌افزارهای تولید حرف میزنم.

اینم یه تجربه پراکنده دیگه!

امروز یه قسمت دیگه از کتاب «۹۷ چیز که یک برنامه نویس بهتر است بداند» رو اینجا به اشتراک میگذارم. این سومین ویدئو هست که فصل ۵ رو ارائه میده. نکته اینکه با توجه به اینکه ویدئو دوم به خوبی استقبال نشد و یکم سعی کردم با توجه به بازخوردهای شما ویدئو رو بهتر کنم. راستی اضافه کنم که من اول اون فصل‌هایی که رو که خودم باهاشون درگیر بودم رو اول می‌گم و بعدش میرم سراغ مابقی فصلها. انشالا که بتونم بقیه کتاب رو هم ضبط کنم.

یادتون نره که با کامنت‌هاتون و به اشتراک گذاشتناتون می‌تونید من رو تشویق کنید که بقیه اش رو هم ضبط کنم. هر جا که خواستید اینها رو به اشتراک بگذارید و فقط اسمی از من بیارید.

این ویدئو بصورت همزمان توی وب سایت هایو هم به انتشار رسیده.

ویدئو

در یوتیوب:

در آپارات:

اینم یه تجربه پراکنده دیگه!

امروز یه قسمت دیگه از کتاب «۹۷ چیز که یک برنامه نویس بهتر است بداند» رو اینجا به اشتراک میگذارم. این دومین ویدئو از ۴ ویدئو اوله. راستی بگم که من اول اون فصل‌هایی که رو که خودم باهاشون درگیر بودم رو اول می‌گم و بعدش میرم سراغ مابقی فصلها. پس این پست فصل ۳ کتاب رو ارائه میکنه. انشالا که بتونم بقیه کتاب رو هم ضبط کنم.

یادتون نره که با کامنت‌هاتون و به اشتراک گذاشتناتون می‌تونید من رو تشویق کنید که بقیه اش رو هم ضبط کنم. هر جا که خواستید اینها رو به اشتراک بگذارید و فقط اسمی از من بیارید.

این ویدئو بصورت همزمان توی وب سایت هایو هم به انتشار رسیده.

ویدئو

در یوتیوب:

در آپارات:

اینم یه تجربه پراکنده دیگه!

من گفته بودم که به تولید محتوا صوتی تصویری علاقه پیدا کردم. پس کتاب «۹۷ چیز که یک برنامه نویس بهتر است بداند» که به نظرم محتوای خوبی داشت رو انتخاب کردم. در مرحله اول ۴ فصلش رو ارائه دادم. انشاا… در هفته‌های آتی اونها رو به اشتراک میگذارم. این هم قسمت اوله.

یادتون نره که با کامنت‌هاتون و به اشتراک گذاشتناتون می‌تونید من رو تشویق کنید که بقیه اش رو هم ضبط کنم. هر جا که خواستید اینها رو به اشتراک بگذارید و فقط اسمی از من بیارید.

این ویدئو بصورت همزمان توی وب سایت هایو هم به انتشار رسیده.

ویدئو

در یوتیوب:

در آپارات:

اینم یه تجربه پراکنده دیگه!

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

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

برای ضبط صدای با کیفیت به چندتا چیز نیاز داریم:
– یه میکروفن خوب: برای گرفتن صدای شما
– یه کارت صدای با کیفیت: برای تبدیل صدای آنالوگ به دیجیتال
– یه محیط مناسب: محیط کم سر و صدا و بدون نویز
– یه نرم‌افزار ویرایشگر: برای ویرایش صدای ضبط شده

انتخاب میکروفن و کارت صدا برای ضبط

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

راه حل مشابه چیه: اول اینکه بریم سراغ میکرفون‌های حرفه‌ای که خروجی صدا دیجیتال داشته باشن یعنی خروجی usb بدن. این باعث میشه که نیاز به کارت صدا هم مرتفع بشه چون کارت صدا توی میکروفن جاسازی شده. بعد از تحقیق متوجه شدم که یا باید برم سراغ هدست‌های گیمینگ که بتونم میکرفون با کیفیت داشته باشم یا باید برم یه سری میکروفن هایی که برای پادکست‌ها و ویدئو کست‌ها استفاده میشه رو پیدا کنم

راه حل مشابه دوم چیه: اینه که شما از یه voice recorder حرفه‌ای استفاده کنید چیزهایی که مثلا شرکت zoom یا tascam تولید میکنن. اینها خیلی خوب هستن اما برای ویدئو همیشه یه دردسر جدید به اسم همزمان کردن صدای ضبط شده و ویدئو رو بوجود میارن که کم دردسری نیست.

با توجه به این موارد خرید میکروفن usb برای من بهتره و با در نظر گرفتن تحقیقاتی که کردم یکی ازبهترین میکروفن ها blue yeti هست که خب پس از مشقات بسیار گفتم یدونه از ممالک کفر برام آوردن

محیط مناسب

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

راه حلی که من پیدا کردم این بود که بیام اول در زمان سکوت صدا ضبط کنم و از اکثر منابع نویز از نظر فیزیکی دوری کنم. دوم اینکه بیام یه چیزی به نام جrecording booth درست کنم که یه جعبه کوچک عایق صوتی شده است که به مقدار قابل توجهی نویز محیط رو کم میکنه و از رسیدن انعکاس‌های نامناسب صدا به میکروفن جلوگیری میکنه. عکس مراحل انجام این کار رو میتونید اینجا ببینید. هزینه تولید این جعبه هم حدودا ۶۰ هزار تومنه که بیشترش مربوط به جعبه پلاستیکیه

نرم افزار ویرایشگر

من به پیشنهاد اهل فن از نرم افزار audacity استفاده میکنم که نرم افزار متن باز و خوبیه. حالا راه‌حلهای تحت ویندوز دیگه‌ای هم احتمالا وجود داره که من ازش خبر ندارم

پیشنهاد برای مطالعه

پیشنهاد میکنم که پست‌های جادی(۱، ۲ و ۳) رو در مورد نحوه ضبط کردنش ببینید و لذت ببرید.

نکته اضافه

برای کیفیت بهتر ضبط شما معمولا نیاز به پاپ فیلتر یا پ گیر دارید که خب در مجموع بهتون هزینه تحمیل میکنه. من پاپ فیلترم رو با یه کارگاه خیاطی«از اینایی که روش گلدوزی میکنن» و یه جوراب زنونه به قیمت ۵ تومن درست کردم.

اینم یه تجربه پراکنده دیگه!

متاسفانه یه مدت میشه که سرم بیش از اندازه شلوغ شده و نرسیدم وبلاگ بنویسم. قبلا در مورد cmake نشوتم و حالا خواستم یکم بیشتر بنویسم.

خب توی این پست سعی میکنم که بگم که توی دنیای واقعی من از cmake چطور میتونم استفاده کنم. توی دنیای واقعی معمولا پروژه از این بخش‌ها تشکیل شده:

  1. یه سری سورس که اصل منطق برنامه اونجا پیاده سازی شده
  2. یه فایل اصلی یا main که تابع اصلی نرم افزار اونجا قرار گرفته
  3. احتمالا یه سری تست که نرم افزار رو بصورت اتوماتیک مورد تست قرار میدن
  4. احتمالا یه سری کتابخانه که بصورت static یا dynamic به کد اضافه میشن.

یه خورده توضیح بدم که توی مcmake معمولا یه چیزی داریم به عنوان خروجی که میتونه از جنس فایل اجرایی باشه یا از جنس کتابخانه. ما با ترکیب کتابخانه‌ها و سورس کدهای موجود فایل اجرایی نهایی رو درست میکنیم. روند کار هم معمولا به این صورته که:
۱٫ سورسهای اصلی بصورت یه کتابخانه static کامپایل میشه
۲٫ فایل اصلی برنامه بصورت یک فایل اجرایی کامپایل شده و به کتابخانه سورس‌های اصلی لینک میشه
۳٫ تست کیسها بصوت یک فایل اجرایی کامپایل شده و به کتابخانه سورس‌هاس اصلی لینک میشه.
۴٫ کتابخانه ها هم به فایل اجرایی اضافه میشن.

حالا اگه مثال بخوایم یه پروژه رو مثال بزنم که ساختار کدش به شکل زیره

فایل CMakeLists.txt این پروژه یه چیزی شبیه این خواهد بود

شامل یک کتابخانه static و دو فایل اجرایی یکی اصل برنامه و دیگری تست برنامه.

همین!

اینم یه تجربه پراکنده دیگه!

الان حدودا من ۱ سال هست که در دهه ۳۰ دهه چهارم یا همون ۳۰ سالگی از زندگیم قرار گرفتم و نوشتن «من در سی سالگی» کار سختی بود. این پست کاملا برای دل خودم نوشته شده ولی خوشحال میشم که بخونیدش.

سی سالگی اول اندوه بعد ترس

اولین و مهمترین چیزی که حداقل من تجربه کردم اندوه از گذشته زمان و ترس از آینده مبهم بود. ورود به ۲۰ سالگی هیچوقت اینجوری نبوده و نیست. چون با شروع ۲۰ سالگی آدم شروع چیزهای مهمی در زندگیش رو جشن میگیره. اما ۳۰ سالگی سنیه که ناگهان شروع میشه(بخاطر سرگرمی‌های زیاد ۲۰ سالگی) و ناگهان شروع می‌کنی به بررسی کردن اینکه این ۱۰ سال چطور گذشته خوب بوده یا بد؟ من به چی رسیدم؟ چی از دست دادم؟ و این آدم رو توی اندوه زیادی از گذشتن عمر و ترس از اینکه اگه این ۱۰ سال اینجوری بود ۱۰ سال بعد چطور خواهد بود قرار می‌ده.

بررسی

بعد از گذشتن ناراحتی آدم میبینه که واقعا چیکار کرده چی بدست آورده و چی داره بدست میاره. خب من در مجموع ۲۰ سالگی پرباری داشتم. کلی کار که دلم میخواسته رو انجام دادم. کلی کار دیگه هم که دوست دارم انجام بدم رو لیست کردم که انجامش بدم. یه کارهای مهمی هم نتونستم انجام بدم. یه سری کار هم بوده که دوست داشتم انجام بدم اما تصمیم در بین راه عوض شده. حالم بد شده، خوب شده، عاشق شدم، شکست عشقی خوردم، ساختم، ریسک کردم، ضرر کردم، پولم رو خوردن، کارهای بزرگ کردم و همه اینها چیزی نیست که واقعا بشه بهشون گفت خوب یا بد. ازدواج کردم، پدر شدم و کلی کار مهم انجام دادم. یکی از مهم‌ترین کارهایی که کردم اینه که راه کلی زندگی‌م رو انتخاب کردم و توش قدم برداشتم. پایه‌های زندگی‌م رو ساختم. به خودم کلی فشار آوردم و بخشی سلامتم رو از دست دادم. سربازی رفتم و کلا عوض شدم. و هنوز هم به اندازه ۴۰ تا ۵۰ زندگی دیگه انگیزه دارم و کار واسه انجام دادن.

در آخر

من کلی فکر کردم در مورد ۲۰ سالگی که گذشت و ۳۰ سالگی که در پیشه و به این نتیجه رسیدم که خوب زندگی کردم و امیدوار و پرانگیزه‌ام که بتونم کارهای خوبی انجام بدم

همین!

اینم یه تجربه پراکنده دیگه!

من قبلا هم در مورد ابزارهایی مثل makefile و cmake که کامپیال کردن نرم‌افزارها بالاخص در زبان‌های C/C++ رو راحت می‌کنن نوشتم. البته باید بگم که هیچوقت بصورت کامل و درستی یاد نگرفتم که makefile چطوره و چطور میشه باهاش سرو کله زد تا اینکه در یکی از پروژه‌ها مجبور به استفاده از makefile شدم و با کمک یکی از دوستان یه پروژه متن‌باز پیدا کرد که یه مدل آماده makefile که توش تقریبا همه کارهای معمول انجام شده بود رو آورده بود.

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

  1. اینکه بدونید سورس پروژه کجاست.
  2. اینکه فولدرهایی که header ها توش قرار گرفته کجاست
  3. اینکه بدونید برنامه‌تون به چه کتابخانه‌هایی نیاز داره
  4. اینکه بدونید برنامه‌تون برای کامپیال شدن به کمک GCC به چه flagهایی نیاز داره.

بعد از اینکه این موارد رو دونستید و اونها رو پیدا کردید باید برید و بخشها مرتبط با این موارد رو توی makefile تغییر بدید به عنوان Customizable Section مشخص شده.

خب هر یک از این بخش‌های قابل تغییر برای خودش معنایی داره

  1. بخش MY_CFLAGS مقدار flag هایی هست که برای کامپیال کردن فایلها با پسوند c به کار میره. لازه به ذکره که بدونید flagهای C با C++ می‌تونن تفاوت اساسی داشته باشند
  2. بخش MY_LIBS نشون‌دهنده flag هایی هست که در فاز link قرار به linker داده بشه و با استفاده از اون کتابخانه ها شناسونده بشن. یه مثال برای این مقدار -lpthread هست که میگه کتابخانه pthread مورد نیاز این نرم‌افزار هست
  3. بخش CPPFLAGS بخشی هست که نشون میده flagهای کامپایل c++ چیا هستن. مثلا -std=gnu++11 که نشون میده میخوایم از استاندارد C++ 2011 استفاده کنیم. فولدر headerها رو هم توی این بخش اضافه می‌کنیم
  4. اگه به هر دلیل بخوایم flagهای دیگه ای به linker بدیم از LDFLAGS استفاده می‌کنیم.
  5. سورس نرم‌افزار رو با SRCDIRS جاهایی که سورس قرار گرفته رو نشون میده.
  6. و در نهایت PROGRAM نام نرم‌افزار رو نشون میده.

امیدوارم با این توضیحات کوتاه دستتون اومده باشه که چه کاری رو به چه صورت باید انجام بدید و در صورت هرگونه سوالی کامنت بگذارید و یادتون نره که من هنوز makefile رو بخوبی بلد نیستم! 😉

اینم یه تجربه پراکنده دیگه!

من این چند روز بخاطر یه کاری نیاز داشتم یه مساله تئوری گراف رو حل کنم. من معمولا سعی میکنم که توی کارها یه چیز جدید رو یاد بگیرم. به همین خاطر با استفاده از ipython notebook یا jupyter notebook مساله رو حل کردم. اتفاقا جادی هم یه ویدئوی آموزشی خوب در موردش ساخته.

چرا Jupyter Notebook

خب اول از همه میخوام یه چیزایی رو توضیح بدم که به نظر من چرا شاید کسی بخواد از این سیستم‌ها استفاده کنه. مهم‌ترین استفاده‌ای که من براش داشتم اینه که هر جا که به نظرم میخواستم از matlab استفاده کنم میتونستم از jupyter notebook استفاده کنم. بدین شکل که شما برای خیلی کارهای علمی یه کارهایی رو توی matlab پیاده‌سازی میکنی و تست می‌کنی و وقتی لازم شد واقعا در محیط عملیاتی ازش استفاده کنی اون‌ها رو در محیط عملیاتی دوباره پیاده‌سازی می‌کنی.

خب اولین زبانی که jupyter notebook پشتیبانی میکرده python بوده که مثل زبان matlab ساده بوده و بخاطر پکیج‌های عملی که هر دو زبان دارن پیاده‌سازی کارهای علمی به شدت ساده می‌شه.

دوم اینکه هر دو از مفهوم به نام متغیرهای مشترک بین همه برنامه‌های مختلف پشتیبانی می‌کنن که باعث میشه شما یه کار پر هزینه رو یه بار انجام بدی و نتیجه رو داشته باشی و مراحل بعدی رو براساس اون و بدون نیاز به اجرای از اول اون بخش پر هزینه انجام بدی

سوم اینکه هر دو ابزارهای بسیار خوب و قوی برای کشیدن نمودارهای علمی دارن که باعث میشه گزارش ساختن با اونها راحت باشه.

چهارم اینکه در jupyter notebook شما می‌تونید همزمان که کد می‌نویسید گزارش هم بنویسید. یعنی بلوک‌هایی داریم که توش میشه با استفاده از markdown متن هم بنویسید که در نهایت گزارش کاری که دارید انجام می‌دید هم آماده باشه. لازم نیست تکرار کنم که markdown رو من خیلی دوست دارم(۱ و ۲ و ۳)

یه مثال ساده

حالا کار من این بود که بتونم یه گراف جهت‌دار بدون دور بسازم و بتونم اون رو بکشم. خب اول از هم نحوه ساختن اون. کلا در ریاضی اثبات میشه که اگه بخواید گراف جهت‌دار بدون دور بسازید تنها چیزی که نیاز دارید اینه که توی ماتریس مجاورت اون گراف تنها درایه‌های زیر قطر اصلی ۱ باشن. این تضمین می‌کنه که گراف تولید شده گراف جهت‌دار بدون دور باشه.

اول از همه باید نیازمندی ها رو وارد کرد

بعد نوبت به کد ساختن DAG میرسه که کد این کار اینه

بعدش هم میشه نمایش دادنش که به سادگی میشه این

نتیجه کار هم توی github قرار گرفته و از اینجا قابل مشاهده است.
همین!


اینم یه تجربه پراکنده دیگه!

من اگه خدا قبول کنه سالها پیش فوق لیسانس خوندم و کلی پروژه به درد بخور و به درد نحور انجام دادم که بعد از فوق خیلی دوست داشتم اونها رو یه جایی به اشتراک بگذارم ولی نشده. حالا تصمیم گرفتم اولینش رو که در مورد الگوریتم bfso هست اینجا بگذارم که در پاییز ۸۸ برای پروژه درس هوش مصنوعی پیشرفته

ارائه اش کردم. این شما و اینم اولین گزارش پروژه

چکیده:

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

۱- مقدمه

الگوریتم بهینه‌سازی تجمعی غذایابی باکتری‌ها توسط پسینو معرفی گردید[۱]، یکی از جدیدترین الگوریتم‌های بهینه‌سازی ایده گرفته شده از طبیعت است. در پنج دهه اخیر الگوریتم‌های بهینه سازی همانند الگوریتم ژنتیک، برنامه نویسی تکاملی، استراتژی تکامل که از تئوری تکامل و ژنتیک طبیعی ایده گرفته‌شده‌اند در صدر الگوریتم‌های بهینه‌سازی قرار داشته‌اند. اخیراً الگوریتم‌های تجمعی ۳همانند الگوریتم بهینه‌سازی ذرات[۲]، بهینه‌سازی کلونی مورچه‌ها کارایی خود را در این زمینه نشان داده اند. پسینو نیز با توجه به روند این الگوریتم‌ها BFSO را توسعه داد[۱]. ایده اصلی در طراحی این الگوریتم استفاده از استراتژی غذایابی باکتری ای کویل در بهینه‌سازی چند توابع با چند بهینه بوده است. باکتری بدنبال غذا بگونه‌ای جستجو کرده که به بیشینه انرژی در واحد زمان دست یابد. هر باکتری همچنین با دیگر باکتری‌ها با فرستادن سیگنال‌هایی ارتباط بر قرار می‌کند. باکتری با توجه به این دو فاکتور تصمیم اتخاذ می‌کند. روندی که در آن باکتری با قدم‌های کوچک به دنبال غذا می‌گردد را کموتاکیس۴ نامیده می‌شود. ایده کلیدی BFSO تقلید از حرکات کموتاکتیکی۵ یک باکتری مجازی در فضا جستجوی مساله است.

از بادی امر، BFSO توجه محققان زیادی را با زمینه‌های گوناگون به خود جلب کرده است. محققان سعی در تلفیق این روش با الگوریتم‌های دیگر به منظور بررسی ویژگی‌های جستجوی محلی و عمومی داشته‌اند. تا کنون این الگوریتم در مسائل گوناگون بکار گرفته شده و کارایی خود را نسبت به دیگر روش‌ها به اثبات رسانده است[۳].

۲- استراتژی‌های غذایابی

۲-۱- عناصر تئوری غذایابی

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

۲-۲- روش‌های جستجو برای غذا یابی

برای بررسی روش‌های جستجو غذایابی مساله به دو بخش تقسیم می‌شود. ابتدا مهاجم(غذایابنده) بایستی منبع غذا را یافته و سپس آنرا تعقیب کرده و به گروه حمله می‌کند. اهمیت بخش‌های مختلف این روند به رابطه مهاجم و دسته بستگی دارد. بعضی دسته‌ها بزرگند پس مهاجم نیاز به انرژی بیشتری برای شکار دارند اما در عوض به سادگی پیدا می‌شوند[۱].

دو استراتژی جستجو در حیوانات وجود دارد: گشت زدن و کمین کردن. در حالت گشت زدن، مهاجم به دنبال دسته غذایی بصورت ثابت محیط را جستجو می‌کند(ماهی تن و شاهین‌ها از این روش استفاده می‌کنند). در حالت کمین، مهاجم در یک نقطه ثابت می‌ماند و منتظر رد شدن دسته از محدوده حمله خود می‌شود(برخی از مارها از این روش‌ استفاده می‌کنند). اما جستجو به دنبال غذا در بسیاری از گونه‌ها مابین کمین و گشت زدن قرار دارد. به این گونه جستجو، جستجوی افتان و خیزان۶ نیز می‌گویند. در این حالت مهاجم بصورت متناوت گشت زده و در کمین غذا می‌نشیند. ممکن است با گذشت زمان بعد از کمین، جهت حرکت خود را تغییر دهد. برای نشان دادن این حالت میزان حرکت در طول زمان برای این استراتژی‌های جستجو در شکل ۱ نشان داده شده است[۱].

شکل ۱- حالات جستجوی متفاوت در غذایابی[۱]

جستجوی افتان و خیزان می‌تواند براساس تغییرات محیط خود را تطبیق داده و به حالت گشت زدن ویا کمین کردن بسته به شرایط محیطی تبدیل گردد.

۲-۳- رفتار اجتماعی در غذایابی

رفتارهای غذایابی که مورد بررسی قرار گرفت تنها در مورد حیوانات بصورت فردی بود. غذایابی گروهی نیز به قطع نسبت به غذایابی تکی دارای مزایایی است. در غذایابی گروهی وجود راه ارتباطی میان افراد ضروری است. مزایای غذایابی گروهی در زیر آمده است.

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

گاهی مناست تر است به گروه به عنوان مکانی برای بروز هوش تجمعی۷ نگریست. این هوش تجمعی منجر به غذایابی بهتر برای هریک از اعضای گروه می‌شود(دست آوردها نزاع‌های درون گروهی بر سر غذا را پوشش می‌دهد زیرا در گروه غذای بیشتری نسبت به حالتی که همکاری وجود ندارد بدست می‌آید). مثالی از این نمونه غذایابی در گرگ‌ها، پرندگان، زنبور عسل و مورچه‌ها به چشم می‌خورد[۱].

گونه‌های اولیه با همکاری در گروه می‌توانند به گونه‌های بالاتری برای غذایابی دست‌ یابند. افراد گونه‌های بالاتر اما بصورت طبیعی قدرت درک و شناخت بیشتری داشته که به معنای توانایی غذایابی مناسب‌تر است. در این گونه موجودات آنها توانایی‌های خاصی دارند که به عنوان مثال می‌توان به توانایی شناخت نقاط حساس محیط، شناخت ویژگی‌های گروه غذایی و .. . اشاره کرد[۱].

۲-۴- غذایابی در باکتری ای کویل

در هنگام غذایابی باکتری، حرکت۸ توسط مجموعه از فلاژل‌ها۹ با قابلیت کشش انجام می‌شود. فلاژل‌های این امکان را برای باکتری ای کویل فراهم می‌آورد که چرخیده۱۰ یا شنا کند. این دو عمل در زمان غذایابی انجام می‌شود. وقتی فالاژل‌های به سمت عقربه‌های ساعت می‌گردند باعث چرخش سلول می‌شود. چرخش‌ در محیط‌های سمی(عدم وجود غذا) و یا هنگامی که غذا یافت شده است به چشم می‌خورد کمتر است. با چرخش فلاژل‌ها عکس عقربه‌های ساعت، باکتری باسرعت قابل توجهی شنا می‌کند. با توجه به این اعمال باکتری علاقمند به یافتن غذای افزاینده و فرار از محیط‌های سمی است. به طور کلی باکتری در محیط‌های دوستانه طولانی تر عمل می‌کند. در شکل ۱ نحوه این چرخش و چگونگی آن آمده است[۳].

شکل ۱- چرخش، حرکت و رفتار چموماتیک باکتری[۱]

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

۳- الگوریتم غذایابی تجمعی باکتری یا bfso

با فرض اینکه در پی یافتن کمینه تابع \(J(\theta)\) هستیم که در آن \(\theta \in R^{p}\) و تعریف ریاضی گرادیان این تابع در دسترس نیست. الگوریتم بهینه سازی غذایابی تجمعی باکتری چهار رفتار باکتری‌های واقعی را به منظور حل این مساله شبیه سازی کرده که شامل چموماتیک، تجمعی بودن، تولید مجدد و ازبین رفتن و توضیع است. هر باکتری در این الگوریتم جوابی برای مساله است که به منظور یافتن جواب بهینه مساله روی سطح تابع حرکت می‌کند(شکل ۱).

فرض می‌شود که هر مرحله چموماتیک یک چرخش به همراه یک چرخش دیگر و یا شناست. اگر j اندیس مرحله چموماتیک باشد و k اندیس مرحله بازترکیبی l اندیس مرحله ازبین رفتن پخش شدن باشد می‌توان تعاریف زیر را بیان کرد

P: ابعاد فضای جستجو

S: حداکثر تعداد باکتری ها

\(N_{c}\): تعداد قدم‌های چموماتیک

\(N_{S}\): طول شنا کردن

\(N_{\text{re}}\) : تعداد قدم‌های تولید مجدد

\(N_{\text{ed}}\): تعداد قدم‌های ازبین رفتن و پخش شدن

\(P_{\text{ed}}\): احتمال از بین رفتن و پخش شدن

\(C\left( i \right)\): اندازه گامی که در جهت تصادفی برداشته می‌شود

شکل ۱- مساله موردی و مکانی که باکتری‌ها در آن قرار دارند[۳]

\(P\left( j,k,l \right) = \left\{ \theta^{i}\left( j,k,l \right)|i = 1,2,\ldots,S \right\}\) مجموعه نقاط نشان‌دهنده هر فرد جمعیت در j امین مرحله چموماتیک، k امین مرحله تولید مجدد و l امین مرحله از بین رفتن و پخش شدن است. همچنین \(J\left( i,j,\ k,l \right)\) میزان هزینه باکتری i ام در j امین مرحله چموماتیک، k امین مرحله تولید مجدد و l امین مرحله از بین رفتن و پخش شدن است. درجمعیت‌های واقعی تعداد باکتری‌های می‌تواند بسیار بزرگ بوده اما ابعاد ۳ است. در قسمت پایین چهار مرحله اساسی این الگوریتم بصورت خلاصه ارائه می‌گردد.

  1. چموماتیک: این مرحله حرکت باکتری ای کویل با استفاده از چرخش و شنا تولید شده توسط فلاژل‌ها را شبیه‌سازی می‌کند. بصورت بیولوژیک یک باکتری ای کویل می‌تواند به دو طریق حرکت کند. می‌تواند در بازه زمانی در یک جهت حرکت کرده و یا بچرخد و در طول حیات خود مابین این دوحالت یکی را انتخاب کند. اگر \(\theta^{i}\left( j,k,l \right)\) نشاندهنده i ام در j امین مرحله چموماتیک، k امین مرحله تولید مجدد و l امین مرحله از بین رفتن و پخش شدن و \(C\left( i \right)\) طول حرکت در یک جهت تصادفی(ناشی از چرخش) باشد مکان باکتری در مرحله چموماتیک بعد از رابطه زیر محاسبه میگردد:
(۴) \(\theta^{i}\left( j + 1,k,l \right) = \theta^{i}\left( j,k,l \right) + C\left( i \right)*\frac{\Delta\left( i \right)}{\sqrt{\Delta^{T}\left( i \right)\Delta\left( i \right)}}\)

در این رابطه \(\Delta\left( i \right)\) نشاندهنده جهت تصادفی بدست آمده از چرخش است که برداری است با اعضایی در بازه \(\left\lbrack – 1,1 \right\rbrack\).

  1. رفتار تجمعی: رفتارهای جالبی در میان بسیاری از گونه‌های متحرک از جمله باکتری ای کویل مشاهده شده است که آن تولید الگو‌های پیچیده و ثابت از نظر زمان و مکان (تجمع) در محیط‌های غذایی شبه جامد است. گروهی از سلول‌های ای کویل در حالتی که تنها یک گیرنده دارند خورد را به سمت حداکثر گرادیان سوق می‌دهند. همچنین سلول‌ها ماده‌ای از خود ترشح کرده که دیگران را تحریک (جذب یا دفع) کرده و به تجمع گروه کمک می‌کند. این گروه چگال از باکتری‌ها با داشتن الگویی متمرکز حرکت می‌کنند. ارتباط میان سلولی باکتری می‌تواند بصورت زیر معرفی گردد
(۴) \(J_{\text{cc}}\left( \theta,P\left( j,\ k,l \right) \right) = \Sigma_{i = 1}^{S}J_{\text{cc}}\left( \theta,\theta^{i}\left( j,k,l \right) \right) = \sum_{i = 1}^{S}{- d_{\text{attract}}\exp\left( – w_{\text{attract}}\sum_{m = 1}^{p}\left( \theta_{m} – \theta_{m}^{i} \right)^{2} \right)} + \sum_{i = 1}^{S}{h_{\text{repell}}\exp\left( – w_{\text{repell}}\sum_{m = 1}^{p}\left( \theta_{m} – \theta_{m}^{i} \right)^{2} \right)}\)

که در این رابطه \(J_{\text{cc}}\left( \theta,P\left( j,\ k,l \right) \right)\) تابع هدفی است که به مقدار واقعی افزوده می‌شود. این تابع متغیر با زمان است. مقادیر \(d_{\text{attract}}\)، \(w_{\text{attract}}\)،\(h_{\text{repell}}\) و \(w_{\text{repell}}\) بسته به مساله بایستی بصورت مناسبی انتخاب شوند[۱].

  1. تولید مجدد: بنصف اکتری‌هایی با حداقل سلامت مرده و باکتری‌هایی که سالم‌ترند تبدیل به دو باکتری می‌شوند که در همان نقطه قرار دارد. این باعث حفظ اندازه جمعیت می‌شود.
  2. از بین رفتن و پخش شدن: بصورت کم کم یا آنی تغییراتی در محیطی که باکتری زندگی می‌کند رخ می‌دهد. این تغییرات ممکن است بخاطر تغییر دما باشد. با توجه به این تغییرا ت بخش از باکتری‌ها ممکن است کشته شده و یا به جای دیگری بروند. برای شبیه سازی این مفهوم در الگوریتم برخی از باکتری‌های با احتمال کمی از بین رفته و در جای دیگری از محیط بصورت تصادفی مقدار دهی می‌شوند.

شبه کد این الگورتیم در زیر آمده است.

الگوریتم بهینه‌سازی تجمعی غذایابی باکتری:پارامترها:

{قدم اول} مقدار دهی به پارامترها الگوریتم : P،S،\(N_{c}\)، \(N_{S}\)،\(N_{\text{re}}\)، \(N_{\text{ed}}\)، \(P_{\text{ed}}\)،\(C\left( i \right)\)

الگوریتم:

{قدم دوم} حلقه از بین رفتن پخش شدن: l=l+1

{قدم سوم} حلقه تولید مجدد: k=k+1

{قدم چهارم} حلقه چموماتیک: i=i+1

{الف} برای هریک از باکتری ها قدم چموماتیک را بصورت زیر انجام بده

{ب} هزینه باکتری را محاسبه کن،

میزان تاثیر باکتری‌های دیگر را به این هزینه اضافه کن

{ج}این مقدار را به عنوان آخرین هزینه باکتری ذخیره کن

{د} چرخش: برای چرخش یک بردار تصادفی تولید کن

{ه} حرکت: به جهت تصادفی تولید شده با گام مشخص شده حرکت کن

{و} مقدار هزینه و هزینه القا شده از سایرین را محاسبه کن

{ز} شنا: اگر تعداد تکرارهای شنا از حدی نگذشته است و هزینه رو به کاهش دارد به سمت تولید شده حرکت کن

{ح} به سراغ باکتری دیگر برو

{قدم پنجم} اگر مراحل چموماتیک تمام نشده به قدم ۴ بازگرد

{قدم ششم} تولید مجدد:

{الف} سلامت باکتری که برابر مجموع هزینه‌ها در مراحل چموماتیک است را محاسبه کن

{ب} باکتری‌های با بیشترین میزان هزینه مرده و بهترین باکتری ها دو نیمه می‌شوند.

{قدم هفتم} اگر مراحل تولید مجدد تمام نشده به قدم ۳ بازگرد.

{قدم هشتم} ازبین بردن پخش: برای هریک از اعضا به احتمال مشخص را پخش کن. بدین معنا که باکتری را با یک باکتری تصادفی تولید شده جایگزین کن.

{قدم نهم} اگر مراحل از بین بردن و پخش به اتمام نرسیده با قدم ۲ برگرد در غیر اینصورت اتمام الگوریتم

۴- نتایج شبیه سازی و مقایسه با الگوریتم PSO

این بخش بررسی رفتار این الگوریتم در قبال الگوریتم بهینه سازی ذرات می‌پردازد. این دو الگوریتم توسط نویسنده این گزارش در محیط برنامه نویسی MATLAB پیاده سازی شده و با یکدیگر در مسائل بهینه سازی متفاوت مقایسه می‌گردد.

برای مقایسه رفتار این سه الگوریتم سه تابع برای بهینه سازی در نظر گرفته شده است که شکل‌های آنها در زیر آمده است. این توابع بگونه‌ای انتخاب شده اند که دارای حالات مختلف از نظر داشتن کمینه باشند. بدین ترتیب که تابع اول تقریبا به تعداد مساوی کمینه محلی داشته. تابع دوم تنها یک کمینه محلی داشته و تابع سوم کمینه‌های بسیاری دارد. این توابع برای بررسی رفتار جستجوی محلی و جستجوی عمومی الگوریتم مفید خواهند.

شکل ۱- تابعی تولید شده از جمع چند تابع نمایی
شکل ۱- تابع هایپربولیک
شکل ۱- تابع ترکیبی نمایی و مثلثاتی

نتایج بدست آمده با استفاده از روش PSO در شکل ۱،شکل ۱ و شکل ۱ و نتایج بدست آمده از الگوریتم BFSO در شکل ۱، شکل ۱ و شکل ۱ قابل مشاهده است. برای الگوریتم PSO محل ذرات در طول تکرار‌های انجام شده نمایش داده‌شده است. برای الگوریتم BFSO برای هریک از مراحل تولید مجدد(۴ مرحله) و ازبین رفتن و پخش یک نمودار از تمامی جمعیت ارائه شده است.

شکل ۱- نتایج PSO برای تابع اول
شکل ۱- نتایج PSO برای تابع دوم
شکل ۱- تابعی نتایج PSO برای تابع سوم
شکل ۱- نتایج BFSO برای تابع اول

شکل ۱- نتایج BFSO برای تابع دوم

شکل ۱- تابعی نتایج BFSO برای تابع سوم

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

مراجع

[۱] Liu Yanfei and K. M. Passino, “Biomimicry of Social Foraging Behavior for Distributed Optimization: Models, Principles, and Emergent Behaviors,” Journal of Optimization Theory and Applications, vol. 115, pp. 603-628, Dec. 2002.

[۲] R. Eberhart and J. Kennedy, “A new optimizer using particle swarm theory,” in Proceedings of the Sixth International Symposium on Micro Machine and Human Science, 1995, pp. 39 – 43.

[۳] Sambarta Dasgupta, Swagatam Das, A. Abraham, and A. Biswas, “Bacterial Foraging Optimization Algorithm: Theoretical Foundations, Analysis, and Applications,” in Foundations of Computational Intelligence Volume 3: Global Optimization: Springer Verlag, 2009, pp. 23-55.


  1. Bacteria Foraging Swarm Optimization(BFSO)
  2. Escherichia coil
  3. Swarm
  4. chemotaxis
  5. chemotactic
  6. Saltatory search
  7. Collective Intelligence
  8. Locomotion
  9. Flagella
  10. tumble