30th-birthday-pinata

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

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

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

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

بررسی

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

در آخر

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

همین!

Makefile_diagram

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

من قبلا هم در مورد ابزارهایی مثل 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 رو بخوبی بلد نیستم! 😉

ipy-notebook-spectral

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

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

چرا Jupyter Notebook

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

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

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

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

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

یه مثال ساده

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

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

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

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

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

bfso_image2


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

من اگه خدا قبول کنه سالها پیش فوق لیسانس خوندم و کلی پروژه به درد بخور و به درد نحور انجام دادم که بعد از فوق خیلی دوست داشتم اونها رو یه جایی به اشتراک بگذارم ولی نشده. حالا تصمیم گرفتم اولینش رو که در مورد الگوریتم 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

process_calculi

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

به نظر میرسه که من در توییتر گفتم که میخوام در مورد کلا async و روندهای پیاده سازی اون توی وبلاگ بنویسم.

از اونجایی هم که من هنوز هم علم رو دوست دارم رفتم یکم عمیق تر نگاه کردم ببینم کل این ماجرا از کجا آب میخوره رسیدم به چیزی به نام process calculus یا همون حسابان پروسه‌ها! بالاخره علما آدم‌های پایه‌ای هستن که میان و خیلی عمیق و گاها عجیب به مسائل نگاه میکنن. کل ماجرا از این قراره که در این علم تلاش شده که بصورت formal سیستم های همروند یا concurent توصیف بشن و روابط بین پروسه‌ها مختلف در این سیستم‌ها نحوه تعاملشون رو توصیف و تفصیل بشه.

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

حسابان پروسه‌ها یا process calculi

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

سه ویژگی اصلی هست که توی تمام این روش‌های مدل سازی اینه که:

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

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

شاخه‌های اصلی

شاخه‌های اصلی این علم سه دسته هستند که عبارتند از موارد زیر. این موارد رو تنها برای اونهایی که دوست دارن بیشتر بدونن آوردم
– حسابان سیستم‌های در ارتباط یا Calculus of Communicating Systems(CCS)
– ارتباط سیستم‌های ترتیبی یا Communicating Sequential Processes (CSP)
– جبر پروسه‌های در ارتباط یا Algebra of Communicating Processes (ACP)

منابع و مطلاعات بیشتر

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

pfCaptive

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

این ماه‌ها خیلی شلوغه و من نرسیدم به وبلاگ سر بزنم و این پست قرار نیست خیلی بلند باشه. من مدت‌هاست که هرجا میرم pfsense رو به عنوان ورتر و فایروال اونجا توصیه میکنم و خب همه جا هم از استفاده ازش راضی بودن. کل این پست در مورد captive portal هست.

یکی از ویژگی‌های این محصول استفاده می‌کنیم captive portal هست. کاری که میکنه اینه که اولین چیزی که شما توی بروزر میزنی رو redirect میکنه به صفحه لاگین. حالا یکی از چیزایی که من توی محصولاتی مثل cyberoam دیدم که یه کلاینت دارن واسه لاگین کردن توی captive portal هست. من هم دچار این مشکل بودم که چون معمولا tab های زیادی توی بروزر باز دارم همه صفحات redirect میشه و خیلی مدیریتش سخت میشه. حالا من هم یه کلاینت با پایتون توسعه دادم که خیلی ساده این کار رو انجام میده. اون رو هم توی github گذاشتم که اگه کسی خواست استفاده کنه. امیدوارم این کلاینت کمک کنه که آدم‌های بیشتری از محصولات متن باز استفاده کنن.

همین!

sync-async

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

خب من به مسائل مرتبط با کارایی و اجرای غیر همزمان کدها یا همون async رو دوست دارم. یکم هم تجربه کد نویسی رو باهاشون دارم. توی این پست میخوام بصورت ساده یکی از روشهای این پیاده‌سازی رو براتون توضیح بدم. خیلی دنبال این نیستم که بگم دقیقا این روش کجاها به درد میخوره و چرا به درد میخوره بلکه هدف یه معرفی اولیه است. انشالا در یه پست مفصل بیشتر توضیح میدم. کل موضوع حول دوتا واژه promise و future میگرده که در c++0x11 معرفی شده.

داستان از این قراره که در مدل sync شما یه تابع رو صدا میزنی و منتظر میمونی که جواب به شما برگرده. اما در این مدل بعد از صدا زدن یک تابع بجای منتظر موندن برای جواب همون موقع یک مقدار از نوع future برمیگرده که تا زمانی که تابع صدا زده شده به اتمام نرسیده مقداری نداره. بعد از تموم شدن تابع مقدار future همون مقداری هست که نتیجه محاسباته. حالا اگه از منظر تابعی که صدا زده میشه نگاه کنیم اون تابع خروجیش از نوع promise هست که بعد از اتمام اون رو پر میکنه و برمیگردونه. همین!

حالا این نمونه کد رو هم ببنید که یه مثال ساده از future و promise هست.

مثالها از اینجا گرفته شده. اولین مثال از این قرار که ما یه تابع که خروجیش void هست رو با استفاده future مورد استفاده قرار می‌دیم.

اتفاقی که اینجا میفته اینه که با استفاده از ‍std::async ما سعی میکنیم که اون تابع رو در یک thread دیگه اجرا کنیم و نتیجه رو بصورت یک future از اون بگیریم. با اجرای result.get() مطمئن می‌شیم که اجرای اون thread به اتمام رسیده.

مثال دوم یه محاسبه بصورت غیر همزمان اجرا میشه و نتیجش به کمک future برگردونده میشه

امیدوارم که این بدردتون خورده باشه.
همین!

photo398911112595220508

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

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

به نظرم لیست کارهای ایناست:
– بخاطر داشتن پکیجهای aria2 و transmission به همراه داشتن usb گزینه مناسبی برای دانلود کردن اتوماتیک هست
– میشه کارهای مدل Internet of Things انجام داد. مثلا میشه یه سری کلید تحت شبکه رو کنترل کرد. این کلیدها با گرفتن یه دستور خاص خاموش یا روشن میشن. پس میشه کلی کار جذاب تو مایه‌های اتوماسیون خانگی و خانه هوشمند و اینا انجام داد.
– میشه بصورت ساده دسترسی به اینترنت رو به ساعاتی محدود کرد. مثلا میشه گفت که فلان دستگاه فقط تو این ساعات به اینترنت درسترسی داره. این به درد دستگاه‌هایی میخوره که امکان زمانبندی کارها توشون وجود نداره
– میشه با کمک minidlna یا emby تبدیلش کرد به یه media server برای اشتراک گذاری فیلم و موسیقی

و کلا چون یه لینوکس با کلی پکیج هست کارهایی بسیار دیگه‌ای هم میشه انجام داد.

همین!

پ. ن. من واسه اینکه usb رو روی یکی از مدلهای tp-link راه بندازم یکبار روتر رو تا دم مرگ بردم و با روشهایی سخت افزاری که تو عکس هست دوباره زندش کردم!

SelfOrgTeam_9_0611_v2

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

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

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

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

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

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

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

tywp

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

اول از همه باید اعتراف کنم که برخلاف علاقه‌ی درونیم خیلی کم کتاب می‌خونم و این من رو خجالت زده می‌کنه. الان یه مدت هست که کتاب the year without pants یا «سال بدون شلوار»، که در مورد تجربه یکی از مدیران میانی شرکت اتوماتیک هست میخونم و دوست دارم اونرو معرفی کنم. این شرکت توسعه دهنده اصلی wordpress هست. اول از همه باید بگم که این کتاب خیلی خوب هست و خوندنش رو به همه اونهایی که دوست دارند بدونن حال و هوای دور کاری و توسعه محصول چطوریه پیشنهاد می‌کنم.

من سعی می‌کنم جاهایی که به نظر خودم مهم و تاثیر گذار هست رو در قالب پست‌هایی اینجا بیارم تا شاید به درد دیگران هم بخوره.

فعلا همین!