پیدا کردن کمینه تابع Egg Holder با الگوریتم بهینه سازی اجتماع ذرات
پیدا کردن کمینه تابع Egg Holder با الگوریتم بهینه سازی اجتماع ذرات ، در این لحظه از مطلب دی ال قصد داریم به صورت پروژه محور الگوریتم بهینه سازی اجتماع ذرات را به شما آموزش دهیم.ما برای این کار بهینه سازی تابع Egg Holder با الگوریتم pso را انتخاب کرده ایم.
پیدا کردن کمینه تابع Egg Holder با الگوریتم بهینه سازی اجتماع ذرات
امروزه روش های متنوعی برای حل مسائل بهینه سازی و یافتن مقدار بهینه وجود دارد. یکی از روشهای قوی و کارا الگوریتمهای تکاملی [ Evolutionary Algorithm ] میباشد. این الگوریتمها بدون درگیر شدن با ذات مساله، مساله مورد نظر را بهینه میکنند که مزیت و برتری برای این روش ها محسوب میگردد.
هدف از انجام این پروژه پیدا کردن کمینه تابع نگه دارنده تخم مرغ [ Egg Holder Function ] با استفاده از الگوریتم بهینه سازی اجتماع ذرات [ Particle Swarm Optimization ] میباشد.
برای این کار الگوریتم بهینه سازی اجتماع ذرات را در نرم افزار متلب پیاده سازی کرده و با استفاده از این کد و تعریف تابع هدف مناسب مقدار کمینه این تابع را پیدا مینماییم.
برای این کار لازم است تابع هدف مناسب تعریف گردد و پارامترهای الگوریتم بهینه سازی اجتماع ذرات نیز تعیین گردند. در این تحقیق با اعمال تغییرات روی پارامترهای الگوریتم PSO سعی میشود بهترین ترکیب از مقادیر این پارامترها پیدا گشته ،و در تکرار کمتر به جواب بهینه دست یابیم.
لذا در ادامه ی این آموزش در بخش دوم به توضیح در مورد تابع Egg Holder میپردازیم. سپس در قسمت سوم در مورد الگوریتم PSO توضیحات مختصری داده خواهد شد، در قسمت چهارم اعمال الگوریتم PSO روی تابع Egg Holder آورده میشود و در بخش نهایی کد برنامه توضیح داده خواهد شد.با ما هراه باشید.
تابع Egg Holder
رابطهی ۱ نشان دهنده فرمول ریاضی تابع Egg Holder میباشد:
همانگونه که از رابطه ۱ پیداست این تابع یک تابع دو متغیره میباشد ، که محدوده تغییرات این متغیرها در بازه (۵۱۲ و۵۱۲-) میباشد. نکته ای که باید به آن توجه کرد این است که این یک تابع سخت میباشد ، چرا دارای تعداد بیشماری بهینه محلی میباشد.
قطعه کد زیر در متلب برای محاسبه مقدار تابع در نقطه p = (x1,x2) استفاده میشود:
x1 = xx(1);
x2 = xx(2);
Temp1 = -(x2+47) * sin(sqrt(abs(x2+x1/2+47)));
Temp2 = -x1 * sin(sqrt(abs(x1-(x2+47))));
y = Temp1 + Temp2;
که در آن sin مقدار تابع سینوس ورودی و sqrt نیز ریشه دوم ورودی اش را محاسبه می کند.
نمودار این تابع در شکل زیر آمده است:
الگوریتم بهینه سازی اجتماع ذرات
برای یادگیری الگوریتم بهینه سازی اجتماع ذرات اینجا کلیک کنید.
بهینه سازی تابع Egg Holder یا تابع نگه دارنده تخم مرغ با استفاده از الگوریتم PSO
در این قسمت نتایج پیاده سازی PSO آورده میشود. بر این اساس پارامترهای PSO به صورت زیر مقدار دهی شده اند.
MaxVelocity | W | C2 | C1 | پارامتر |
۰٫۱ * (value) | 1.4 | 3 | 2 | مقدار |
در این حالت نمودار همگرایی به صورت زیر بوده است:
همچنین بخوانید: بهینه سازی تابع egg holder با الگوریتم گرگ خاکستری
مراحل پیاده سازی و کد نویسی :
در این قسمت کد PSO توضیح داده میشود. برای این پروژه دو فایل در متلب با نام های pso1.m ، PSO.m ، egg.m و Plot.m ایجاد کنید. که در pso1.m کدهای مربوط به تنظیم پارامترها صورت میگیرد و PSO.m کدهای پیاده سازی الگوریتم بهینه سازی اجتماع ذرات قرار می گیرد.
کدهای زیر را در فایل egg.m قرار دهید:
function [y] = egg(xx)
x1 = xx(1);
x2 = xx(2);
Temp1 = -(x2+47) * sin(sqrt(abs(x2+x1/2+47)));
Temp2 = -x1 * sin(sqrt(abs(x1-(x2+47))));
y = Temp1 + Temp2;
end
این کدها در ابتدای این آموزش و در بخش تابع Egg Holder توضیح داده شد.
کدهای زیر را در فایل pso1.m قرار دهید:
clc;
clear;
close all;
%% Problem Definiton
problem.CostFunction = @(x) egg(x); % Cost Function
problem.nVar = 2; % Number of Unknown (Decision) Variables
problem.VarMin = -512; % Lower Bound of Decision Variables
problem.VarMax = 512; % Upper Bound of Decision Variables
%% Parameters of PSO
params.MaxIt = 1000; % Maximum Number of Iterations
params.nPop = 25; % Population Size (Swarm Size)
% Intertia Coefficient
% Damping Ratio of Inertia Coefficient
params.c1 = 2; % Personal Acceleration Coefficient
params.c2 = 3; % Social Acceleration Coefficient
params.w = 1.4;
params.MaxVelocity=0.1*(problem.VarMax-problem.VarMin); % maxVelocity of particles
params.MinVelocity=-0.1*(problem.VarMax-problem.VarMin); % minVelocity of particles
params.ShowIterInfo = true; % Flag for Showing Iteration Informatin
params.wdamp = 0.99;
%% Calling PSO
out = PSO(problem, params);
BestSol = out.BestSol;
BestCosts = out.BestCosts;
%% Results
figure;
% plot(BestCosts, 'LineWidth', 2);
semilogy(BestCosts, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
خط ۷: تعریف تابع ارزیابی که همان تابع «نگهدارنده تخممرغ» میباشد.
خط ۸: تعداد متغیرها که برابر ۲ میباشد.
خط ۹ و ۱۰: تعریف حد بالا و پایین متغیرها.
خط ۱۴ تا ۲۵: در این قسمت به ترتیب حداکثر تعداد تکرار، تعداد ذرات موجود در الگوریتم PSO ،ضریب پارامتر شخصی مورد استفاده در فرمول ۲ در ، ضریب پارامتر اجتماعی در فرمول ۲ ،مقدار وزن اینرسی، حداکثر سرعت ، حداقل سرعت و نرخ کاهش مقدار وزن اینرسی معین شده است. که با تغییرات در این متغیرها آزمایشات صورت گرفته است.
خط ۲۸: در این قسمت تابع PSO.m فراخوانی شده که ورودی آن مسئله مورد بحث و پارامترهای PSO میباشد.
کدهای زیر را در فایل PSO.m قرار دهید:
function out = PSO(problem, params)
%% Problem Definiton
CostFunction = problem.CostFunction; % Cost Function
nVar = problem.nVar; % Number of Unknown (Decision) Variables
VarSize = [1 nVar]; % Matrix Size of Decision Variables
VarMin = problem.VarMin; % Lower Bound of Decision Variables
VarMax = problem.VarMax; % Upper Bound of Decision Variables
%% Parameters of PSO
MaxIt = params.MaxIt; % Maximum Number of Iterations
nPop = params.nPop; % Population Size (Swarm Size)
w = params.w; % Intertia Coefficient
wdamp = params.wdamp; % Damping Ratio of Inertia Coefficient
c1 = params.c1; % Personal Acceleration Coefficient
c2 = params.c2; % Social Acceleration Coefficient
% The Flag for Showing Iteration Information
ShowIterInfo = params.ShowIterInfo;
MaxVelocity =params.MaxVelocity;
MinVelocity =params.MinVelocity;
%% Initialization
% The Particle Template
empty_particle.Position = [];
empty_particle.Velocity = [];
empty_particle.Cost = [];
empty_particle.Best.Position = [];
empty_particle.Best.Cost = [];
% Create Population Array
particle = repmat(empty_particle, nPop, 1);
% Initialize Global Best
GlobalBest.Cost = inf;
% Initialize Population Members
for i=1:nPop
% Generate Random Solution
particle(i).Position = unifrnd(VarMin, VarMax, VarSize);
% Initialize Velocity
particle(i).Velocity = zeros(VarSize);
% Evaluation
particle(i).Cost = CostFunction(particle(i).Position);
% Update the Personal Best
particle(i).Best.Position = particle(i).Position;
particle(i).Best.Cost = particle(i).Cost;
% Update Global Best
if particle(i).Best.Cost < GlobalBest.Cost
GlobalBest = particle(i).Best;
end
end
% Array to Hold Best Cost Value on Each Iteration
BestCosts = zeros(MaxIt, 1);
%% Main Loop of PSO
for it=1:MaxIt
for i=1:nPop
% Update Velocity
particle(i).Velocity = w*particle(i).Velocity ...
+ c1*rand(VarSize).*(particle(i).Best.Position - particle(i).Position) ...
+ c2*rand(VarSize).*(GlobalBest.Position - particle(i).Position);
% Apply Velocity Limits
particle(i).Velocity = max(particle(i).Velocity, MinVelocity);
particle(i).Velocity = min(particle(i).Velocity, MaxVelocity);
% Update Position
particle(i).Position = particle(i).Position + particle(i).Velocity;
% Apply Lower and Upper Bound Limits
particle(i).Position = max(particle(i).Position, VarMin);
particle(i).Position = min(particle(i).Position, VarMax);
% Evaluation
particle(i).Cost = CostFunction(particle(i).Position);
% Update Personal Best
if particle(i).Cost < particle(i).Best.Cost
particle(i).Best.Position = particle(i).Position;
particle(i).Best.Cost = particle(i).Cost;
% Update Global Best
if particle(i).Best.Cost < GlobalBest.Cost
GlobalBest = particle(i).Best;
end
end
end
% Store the Best Cost Value
BestCosts(it) = GlobalBest.Cost;
%%
% Display Iteration Information
if ShowIterInfo
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCosts(it))]);
end
% Damping Inertia Coefficient
w = w * wdamp;
end
out.pop = particle;
out.BestSol = GlobalBest;
out.BestCosts = BestCosts;
end
تا خط ۳۱ این برنامه مقدارهای اولیه که در برنامه pso1.m تعریف شده بودند در متغیرهای مناسب قرار میگیرند. از خط ۳۱ تا خط ۷۴ جمعیت اولیه تولید شده و سرعت اولیه ذرات نیز مشخص شد. جمعیت اولیه و سرعت اولیه به صورت تصادفی مقداردهی شده اند.
خط ۲۵ تا ۲۹: هر کدام از متغیرها به ترتیب بیان گر موقعیت فعلی ذره، سرعت فعلی ذره، مقدار تابع برازندگی ذره، بهترین موقعیتی که ذره تا بحال دیده است (جهت استفاده در ضریب تاثیر شخصی (فرمول ۲)) و برازندگی بهترین حالت میباشند.
خط ۳۱: ساخت جمعیت اولیه به صورت تابعی خالی که در حلقه for، که در ادامه میآید به صورت تصادفی مقدار دهی میگردد.
خط ۳۳: بهترین برازندگی مشاهده شده در این متغیر ریخته میشود چون هدف کمینه سازی است در ابتدا مقدار آن برابر Inf قرار داده میشود.
خط ۳۸: تولید یک ذره به صورت توزیع یکنواخت در محدوده بالا و پایین متغیرها، که در این مساله برابر ۵۱۲ و ۵۱۲- میباشد.
خط ۴۱: تعیین سرعت ذرات که در ابتدا برابر صفر میباشد.
خط ۴۴: ارزیابی ذرات بر اساس تابع ارزیابی (نگهدارنده تخم مرغ).
خط ۴۷ و ۴۸: تعیین بهترین حالت مشاهده شده هر شخص تاکنون.
خط ۵۱ تا ۵۳: تعیین و بروز رسانی بهترین جوابی که تاکنون مشاهده شده است.
در ادامه به حلقه اصلی برنامه می رسیم که به تعداد حداکثر تکرار مجاز، تکرار میشود. که خود شامل حلقهای است که در هر تکرار به تعداد جمعیت تکرار شده، و موقعیت و سرعت ذرات را به روز رسانی میکند.
خط ۶۸ تا ۷۰: بروز رسانی سرعت ذرات بر اساس فرمول ۲
خط ۷۳ و ۷۴: کنترل اینکه سرعت ذرات که در قسمت قبل بروزرسانی شد، از محدوده تعیین شده برای سرعت تجاوز نکند.
خط ۷۷: بروز رسانی موقعیت ذره بر اساس سرعتی که بر اساس فرمول شماره ۲ (بروز رسانی سرعت ذرات) به دست آمده است.
خط ۸۰ تا ۸۱: چک کردن خارج نشدن ذرات از محدوده تغییرات تعریف شده.
خط ۸۴: ارزیابی ذره در موقعیت جدید.
خط ۸۷ تا ۹۷: بروز رسانی مقادیر بهترین مقادیر مشاهده شده هر ذره تا تکرار کنونی و بهترین موقعیتی که کل ذرات تا بدین جای کار مشاهده کردند.
خط ۱۰۱: تعیین بهترین مقداری که تاکنون مشاهده شده است برای اینکه در نمودار نهایی چاپ گردد.
خط ۱۱۰: کاهش دادن مقدار وزن اینرسی با ضریب wdamp که در این مساله برابر ۰٫۹۹ در نظر گرفته شده است.
کدهای زیر را در فایل Plot.m قرار دهید:
clc
clear all
close all
%% [-۶۵٫۵۳۶, ۶۵٫۵۳۶
x1=-512:1:512;
x2=-512:1:512;
for i=1:length(x1)
for j=1:length(x2)
y(i,j)=egg([x1(i) x2(j)]);
end
end
meshc(x1,x2,y) % Plot 3-D function
colorbar
xlabel('x1')
ylabel('x2')
zlabel('y')
همچنین بخوانید: کتاب بهینه سازی ازدحام ذرات ، کاملترین مرجع الگوریتم PSO
در این آموزش سعی شده است، قسمتهای اصلی کد مورد استفاده توضیح داده شود.امیداورم که این آموزش برای شما مفید بوده باشد.
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگوها شرکت کنید؟در گفتگو ها شرکت کنید.