前言:
当前兄弟们对“优化算法matlab程序”大概比较讲究,我们都需要了解一些“优化算法matlab程序”的相关知识。那么小编在网络上网罗了一些对于“优化算法matlab程序””的相关资讯,希望我们能喜欢,看官们快快来学习一下吧!注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。
.代码实现
文件
名描述
..\optimization algorithm\frame\Unit.m
个体
..\optimization algorithm\frame\Algorithm_Impl.m
算法主体
文件名
描述
..\optimization algorithm\frame\Get_Functions_details.m
测试函数,求值用
..\optimization algorithm\frame\func_plot.m
函数图像,画图用
秃鹰算法的个体没有独有属性。
秃鹰算法个体
文件名:.. \optimization algorithm\algorithm_bald_eagle_search\BES_Unit.m
% 秃鹰算法个体classdef BES_Unit < Unit properties end methods function self = BES_Unit() end end end
秃鹰算法算法主体
文件名:..\optimization algorithm\algorithm_bald_eagle_search\BES_Base.m
% 秃鹰算法classdef BES_Base < Algorithm_Impl properties % 算法名称 name = 'BES'; c1 = 2; c2 = 2; alpha = 2; a = 10; R = 1.5; end % 外部可调用的方法 methods function self = BES_Base(dim,size,iter_max,range_min_list,range_max_list) % 调用父类构造函数 self@Algorithm_Impl(dim,size,iter_max,range_min_list,range_max_list); self.name ='BES'; end end % 继承重写父类的方法 methods (Access = protected) % 初始化种群 function init(self) init@Algorithm_Impl(self) %初始化种群 for i = 1:self.size unit = BES_Unit(); % 随机初始化位置:rand(0,1).*(max-min)+min unit.position = unifrnd(self.range_min_list,self.range_max_list); % 计算适应度值 unit.value = self.cal_fitfunction(unit.position); % 将个体加入群体数组 self.unit_list = [self.unit_list,unit]; end end % 每一代的更新 function update(self,iter) update@Algorithm_Impl(self,iter) % 选择搜索区域 self.select_space(); %搜索 self.search_in_space(); %俯冲 self.swoop(); end % 选择搜索的区域 function select_space(self) % 计算群体的平均位置 pos_mean = self.get_mean_pos(); % 遍历每一个个体 for i = 1:self.size % 计算新位置 new_pos = self.position_best + self.alpha*unifrnd(0,1,1,self.dim).*(pos_mean-self.unit_list(i).position); % 越界检查 new_pos = self.get_out_bound_value(new_pos); new_value = self.cal_fitfunction(new_pos); % 贪心一下 if new_value > self.unit_list(i).value % 更新个体 self.unit_list(i).value = new_value; self.unit_list(i).position = new_pos; if new_value > self.value_best % 更新全局最优 self.value_best = new_value; self.position_best = new_pos; end end end end % 在区域内搜索 function search_in_space(self) % 计算群体的平均位置 pos_mean = self.get_mean_pos(); % 生成随机theta和r向量,向量长度为总群个数,即一个个体一个值 theta = self.a*pi*unifrnd(0,1,1,self.size); r = theta + self.R*unifrnd(0,1,1,self.size); xr = get_xr(theta,r); yr = get_yr(theta,r); % 获取xr,yr中的最大绝对值 xr_max = max(abs(xr)); yr_max = max(abs(yr)); % 遍历每一个个体 for i = 1:self.size % 第一下一个个体,即最后一个的下一个是第一个 if i == self.size next_pos = self.unit_list(1).position; else next_pos = self.unit_list(i+1).position; end % 计算新位置 new_pos = self.unit_list(i).position + xr(i)/xr_max.*(self.unit_list(i).position-pos_mean)+ yr(i)/yr_max.*(self.unit_list(i).position-next_pos) ; % 越界检查 new_pos = self.get_out_bound_value(new_pos); new_value = self.cal_fitfunction(new_pos); % 贪心一下 if new_value > self.unit_list(i).value % 更新个体 self.unit_list(i).value = new_value; self.unit_list(i).position = new_pos; if new_value > self.value_best % 更新全局最优 self.value_best = new_value; self.position_best = new_pos; end end end end %俯冲 function swoop(self) % 计算群体的平均位置 pos_mean = self.get_mean_pos(); % 生成随机theta和r向量,向量长度为总群个数,即一个个体一个值 theta = self.a*pi*unifrnd(0,1,1,self.size); r = theta + self.R*unifrnd(0,1,1,self.size); xrl = get_xrl(theta,r); yrl = get_yrl(theta,r); % 获取xrl,yrl中的最大绝对值 xrl_max = max(abs(xrl)); yrl_max = max(abs(yrl)); % 遍历每一个个体 for i = 1:self.size % 计算新位置 new_pos = self.position_best.*unifrnd(0,1,1,self.dim) + xrl(i)/xrl_max.*(self.unit_list(i).position-self.c1*pos_mean)+ yrl(i)/yrl_max.*(self.unit_list(i).position-self.c2*self.position_best) ; % 越界检查 new_pos = self.get_out_bound_value(new_pos); new_value = self.cal_fitfunction(new_pos); % 贪心一下 if new_value > self.unit_list(i).value % 更新个体 self.unit_list(i).value = new_value; self.unit_list(i).position = new_pos; if new_value > self.value_best % 更新全局最优 self.value_best = new_value; self.position_best = new_pos; end end end end % 获取种群平均位置 function pos_mean = get_mean_pos(self) pos_mean = zeros(1,self.dim); for i=1:self.size pos_mean = pos_mean + self.unit_list(i).position/self.size; end end % 获取当前最优个体的id function best_id=get_best_id(self) % 求最大值则降序排列 [value,index] = sort([self.unit_list.value],'descend'); best_id = index(1); end endendfunction xr = get_xr(theta,r)xr = r.*sin(theta);endfunction yr = get_yr(theta,r)yr = r.*cos(theta);endfunction xrl = get_xrl(theta,r)xrl = r.*sinh(theta);endfunction yrl = get_yrl(theta,r)yrl = r.*cosh(theta);end
文件名:..\optimization algorithm\algorithm_bald_eagle_search\BES_Impl.m
算法实现,继承于Base,图方便也可不写,直接用BES_Base,这里为了命名一致。
% 秃鹰算法实现classdef BES_Impl < BES_Base % 外部可调用的方法 methods function self = BES_Impl(dim,size,iter_max,range_min_list,range_max_list) % 调用父类构造函数设置参数 self@BES_Base(dim,size,iter_max,range_min_list,range_max_list); end end end2.测试
测试F1
文件名:..\optimization algorithm\algorithm_bald_eagle_search\Test.m
%% 清理之前的数据% 清除所有数据clear all;% 清除窗口输出clc;%% 添加目录% 将上级目录中的frame文件夹加入路径addpath('../frame')%% 选择测试函数Function_name='F1';%[最小值,最大值,维度,测试函数][lb,ub,dim,fobj]=Get_Functions_details(Function_name);%% 算法实例% 种群数量size = 50;% 最大迭代次数iter_max = 300;% 取值范围上界range_max_list = ones(1,dim).*ub;% 取值范围下界range_min_list = ones(1,dim).*lb;% 实例化秃鹰算法类base = BES_Impl(dim,size,iter_max,range_min_list,range_max_list);base.is_cal_max = false;% 确定适应度函数base.fitfunction = fobj;% 运行base.run();disp(base.cal_fit_num);%% 绘制图像figure('Position',[500 500 660 290])%Draw search spacesubplot(1,2,1);func_plot(Function_name);title('Parameter space')xlabel('x_1');ylabel('x_2');zlabel([Function_name,'( x_1 , x_2 )'])%Draw objective spacesubplot(1,2,2);% 绘制曲线,由于算法是求最大值,适应度函数为求最小值,故乘了-1,此时去掉-1semilogy((base.value_best_history),'Color','r')title('Objective space')xlabel('Iteration');ylabel('Best score obtained so far');% 将坐标轴调整为紧凑型axis tight% 添加网格grid on% 四边都显示刻度box offlegend(base.name)display(['The best solution obtained by ',base.name ,' is ', num2str(base.value_best)]);display(['The best optimal value of the objective funciton found by ',base.name ,' is ', num2str(base.position_best)]);