الگوریتم بهینه سازی ازدحام ذرات یک روش محاسباتی مبتنی بر تکرار برای حل مسائل بهینه سازی می باشد. بطور کلی در روشهای الهام گرفته شده از طبیعت تعدادی پاسخ اولیه موجود می باشد که هدف الگوریتم بهبود این پاسخ ها بعد از چند بار بروز رسانی پاسخ ها می باشد. در این روش بهینه سازی هر ذره دارای دو مشخصه موقعیت و سرعت می باشد که با یک رابطه ریاضی ساده در هر تکرار سرعت هر لحظه بروز شده و بر اساس این سرعت موقعیت ذره بروز رسانی می گردد. سرعت هر لحظه هنگام بروز رسانی وابسته به چندین پارامتر می باشد که به دو دسته تقسیم می گردند. دسته اول ضرایبی هستند که اجرا کننده الگوریتم مشخص می نماید و دسته دوم مقادیری هستند که ذاتی خود الگوریتم بوده و بسته به روند اجرای الگوریتم تغییر می نمایند. پارامترهای دسته دوم عبارت اند از موقعیت ذره نسبت به بهترین موقعیتی که تا بحال تجربه کرده و موقعیت ذره نسبت به بهترین موقعیتی که کل جمعیت تا بحال تجربه کرده است. پارامترهای دسته اول ضرایبی برای تعیین میزان تاثیر پارامترهای دسته دیگر است.
رابطه زیر نحوه بروز رسانی موقعیت یک ذره را نشان می دهد:
v_{i,j} = \omega v_{i,j} + \phi_{p} r_{p} (P^{b}_{i,j}-P_{i,j}) + \phi_{g} r_{g} (P^{b}_{j} - P_{i,j})
P_{i,j} = P_{i,j} + v_{i,j}
رابطه بالا برای بروز رسانی مشخصه های موقعیت هر ذره از جمعیت در تکرارهای متوالی مورد استفاده قرار می گیرد تا زمانی که الگوریتم همگرا گشته یا شرط توقف براورده گردد.
پیاده سازی الگوریتم بهینه سازی ازدحام ذرات شاید برای برخی کار دشواری باشد، بخصوص افرادی که در زمینه میان رشته ای در حال فعالیت هستند. در این صورت می توان از کتابخانه های آماده استفاده نمود. در این بسته کتابخانه الگوریتم بهینه سازی ازدحام ذرات که توسط این سایت برنامه نویسی شده، برای تسهیل کار افراد مشتاق به استفاده از این الگوریتم در پژوهشهای علمی، ارائه شده است. نحوه استفاده از این کتابخانه بسیار آسان بوده و تنها نیاز به تعریف سه تابع هست. این سه تابع عبارت اند از:
- تابع هدف مسئله بهینه سازی
- تابع ایجاد جمعیت اولیه
- تابع ایجاد سرعت اولیه
علاوه بر این باید محدوده تعریف متغیرها نیز به عنوان ورودی سازنده کلاس PSO_Solver داده شود. مثال زیر برای یک مسئله بهینه سازی نمونه نوشته شده است:
#include <iostream> #include <vector> #include <tuple> #include <cmath> #include <ctime> #include "PSO.h" using namespace std; #define PI 3.14159265359 #define N 10 vector<double> sol_gen() { vector<double> solution; for(int i = 0; i < N; i++) { solution.push_back(PI * double(rand())/RAND_MAX - PI/2); } return solution; } vector<double> vel_gen() { vector<double> velocity; for(int i = 0; i < N; i++) { velocity.push_back(PI * double(rand())/RAND_MAX - PI/2); } return velocity; } double cost(Particle p) { double c = 0; for(vector<double>::iterator it = p.solution.begin(); it != p.solution.end(); ++it) { c += abs(sin(*it)); } return c; } int main() { srand(static_cast<unsigned>(time(0))); vector<tuple<double, double>> limits; for(int i = 0; i < N; i++) { limits.push_back(tuple<double, double> (-PI, PI)); } PSO_Solver mySolver(N, 100, limits, &cost, &sol_gen, &vel_gen); for(int i = 0; i < 100; i++) { mySolver.iterate(0.3, 0.3, 2.1); cout<<"Iter. "<< i + 1 <<"\n"; cout<<"Cost: " << mySolver.best_cost<<"\n"; } cout<<"Solution: \n"; for(int i = 0; i < N; i++) { cout<<mySolver.best_solution[i]<<" "; } cout<<"\n"; return 0; }
ورودیهای کلاس حل کننده به ترتیب طول بردار پاسخ، جمعیت ذرات، محدوده متغیرها، تابع هزینه بهینهسازی، تابع ایجاد کننده موقعیت اولیه و تابع ایجاد کننده سرعت اولیه می باشد. تابع iterate از کلاس PSO_Solver نیز هر تکرار از الگوریتم را با سه پارامتر ω، φ_p و φ_g بعنوان ورودی انجام می دهد. طبیعتا آشنایی ابتدایی با زبان برنامه نویسی سی++ لازمه استفاده از این کتابخانه می باشد. خروجی کد بالا به شکل زیر خواهد بود:
Iter. 1 Cost: 2.34854 Iter. 2 Cost: 1.31756 Iter. 3 Cost: 1.07334 ... Iter. 93 Cost: 3.29238e-09 Iter. 94 Cost: 3.21902e-09 Iter. 95 Cost: 1.54199e-09 Iter. 96 Cost: 1.43792e-09 Iter. 97 Cost: 9.81981e-10 Iter. 98 Cost: 9.57258e-10 Iter. 99 Cost: 7.40219e-10 Iter. 100 Cost: 6.60842e-10 Solution: ۳٫۸۶۰۰۸e-12 1.58105e-11 7.9602e-11 -2.63935e-10 -2.03055e-11 5.2477e-11 -7.09283e-11 3.14159 1.06551e-10 4.71655e-11
محتویات بسته:
- فایلهای حل کننده الگوریتم بهینه سازی ازدحام ذرات (PSO.h و PSO.cxx)
- فایل مثال استفاده از حل کننده (E1.cxx)
- فایل اسکریپت bash برای کامپایل
امیدوارم از خرید این محصول نهایت رضایت را داشته باشید.
با ما در تماس باشید.