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

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

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

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

ویدئو

در یوتیوب:

در آپارات:

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

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

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

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

ویدئو

در یوتیوب:

در آپارات:

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

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

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

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

ویدئو

در یوتیوب:

در آپارات:

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

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

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

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

ویدئو

در یوتیوب:

در آپارات:

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

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

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

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

ویدئو

در یوتیوب:

در آپارات:


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

فعلا همین!

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

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

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

چرا آموزش

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

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

سوم اینکه من خودم همیشه به آموزش دادن علاقه داشتم و دارم!

مزایا و معایب آموزش دادن

مزایای آموزش به نظر من اینهاست
* علاقه شخصی منه
* به نسبت پول خوب در میاره
* نیاز به سرمایه گذاری آنچنانی نداره و بیشتر سرمایه گذاریش از جنس وقت و زمان مدرسه

معایب آموزش هم اینه که
* خیلی قابل توسعه نیست و شما بیشتر از ۸ ساعت در روز نمیتونی درس بدی
* بصورت فصلی میتونی روش حساب کنی و دائم نیست

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

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

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

چه چیزهایی رو آموزش خواهم داد

من اگه واقعا بخوام به شخصه چیزی رو آموزش بدم یکی از موارد زیر رو انتخاب می‌کنم:

  • نحوه کار و استفاده از pfsense: چون از نظر من یه روتری هست که کل کارهای یه شرکت به نسبت بزرگ تقریبا ۲۰۰ نفره رو الان دارم باهاش انجام میدم و خیلی کم هزینه تر و بهتر از مشابه‌هاش عمل می‌کنه
  • به دیگران python یاد میدم: به نظر من python یه زبان بسیار ساده و خوبه که خیلی از کارها توش به سادگی و راحتی انجام میشه و ارزش داره که همه اونهایی که توی نرم‌افزار کار میکنن یه سری بهش بزنن.
  • دروپال یاد میدم: چون تقریبا یک سال و نیم ازش استفاده کردم و میدونم قابلیت‌هایی داره که به درد خیلی از آدمها میخوره. لازم به ذکر میدونم که بگم کلاس بار طراحی و وبش کمتر از دورپال خواهد بود چون من خیلی وب و front end بلد نیستم
  • به آدمها سی توی لینوکس یاد میدم: یکی از جاهایی که آدم واقعا عمق کامپیوتر رو درک میکنه وقتیه که داری با سی سرو کله میزنی

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

جمع بندی و نتیجه گیری

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

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

فعلا همین!