热点新闻
优化算法matlab实现(三十七)非洲野狗算法matlab实现
2023-07-05 16:22  浏览:548  搜索引擎搜索“手机速企网”
温馨提示:为防找不到此信息,请务必收藏信息以备急用! 联系我时,请说明是在手机速企网看到的信息,谢谢。
展会发布 展会网站大全 报名观展合作 软文发布

注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。
注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。
注意:此代码实现的是求目标函数最大值,求最小值可将适应度函数乘以-1(框架代码已实现)。

1.代码实现

不了解非洲野狗算法可以先看看优化算法笔记(三十七)非洲野狗算法
实现代码前需要先完成优化算法matlab实现(二)框架编写中的框架的编写

文件 名描述
..\optimization algorithm\frame\Unit.m 个体
..\optimization algorithm\frame\Algorithm_Impl.m 算法主体

以及优化算法matlab实现(四)测试粒子群算法中的测试函数、函数图像的编写。

文件名 描述
..\optimization algorithm\frame\Get_Functions_details.m 测试函数,求值用
..\optimization algorithm\frame\func_plot.m 函数图像,画图用

非洲野狗算法的个体有一个独有属性:存活率。
非洲野狗算法个体
文件名:.. \optimization algorithm\algorithm_dingo\DOA_Unit.m

% 非洲野狗算法个体 classdef DOA_Unit < Unit properties % 存活率 survival_rate; end methods function self = DOA_Unit() end end end

非洲野狗算法主体
文件名:.. \optimization algorithm\algorithm_dingo\DOA_base.m

% 非洲野狗算法 classdef DOA_base < Algorithm_Impl properties % 算法名称 name = 'DOA'; P = 0.5; Q = 0.7; % 随机id区间 na_ini; na_end; end % 外部可调用的方法 methods function self = DOA_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 ='DOA'; self.na_ini = 2; self.na_end = floor(self.size/2); end end % 继承重写父类的方法 methods (Access = protected) % 初始化种群 function init(self) init@Algorithm_Impl(self) %初始化种群 for i = 1:self.size unit = DOA_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.update_survival_rate(); self.update_position(); end % 计算存活率 function update_survival_rate(self) [value,index] = sort([self.unit_list.value],'descend'); for i = 1:self.size % 根据是适应度函数计算存活率 survival_rate = abs(value(1) - self.unit_list(i).value)/abs(value(1)-value(end))+realmin('double'); self.unit_list(i).survival_rate=survival_rate; end end function update_position(self) % 获取随机个体 na = randi([self.na_ini,self.na_end]); for i = 1:self.size beta1 = unifrnd(-2, 2); beta2 = unifrnd(-1, 1); if rand<self.P if rand<self.Q pos_sumatory = self.get_sumatory(na,i); new_pos = pos_sumatory*beta1 - self.position_best; else % 随机选择1个个体 r_id = randi(self.size); new_pos = self.position_best + beta1*exp(beta2)*(self.unit_list(r_id).position-self.unit_list(i).position); end else % 随机选择1个个体 r_id = randi(self.size); binary = 1; if rand<0.5 binary = -1; end new_pos = (exp(beta2)*self.unit_list(r_id).position+binary*self.unit_list(i).position)/2; end if(self.unit_list(i).survival_rate<0.3) % 随机选择2个个体 r_id1 = randi(self.size); r_id2 = randi(self.size); binary = 1; if rand<0.5 binary = -1; end new_pos = self.position_best + (self.unit_list(r_id1).position+binary*self.unit_list(r_id2).position)/2; end % 越界检查,越界后再解空间随机 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).position = new_pos; self.unit_list(i).value = new_value; end end end % 获取群体的平均位置 function pos_sumatory = get_sumatory(self,na,id) % 随机排列id A = randperm(self.size); % 取前na+1个id r_ids = A(1:na+1); % 移除列表中值为id的元素 r_ids(r_ids==id)=[]; pos_sumatory = zeros(1,self.dim); for i = 1:length(r_ids) pos_sumatory = pos_sumatory + self.unit_list(id).position-self.unit_list(r_ids(i)).position; end pos_sumatory = pos_sumatory/length(r_ids); end % 获取当前最优个体的id function best_id=get_best_id(self) % 求最大值则降序排列 [value,index] = sort([self.unit_list.value],'descend'); best_id = index(1); end end end function o=Levy(d) beta=1.5; sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta); u=randn(1,d)*sigma;v=randn(1,d);step=u./abs(v).^(1/beta); o=step; end

文件名:..\optimization algorithm\algorithm_dingo\DOA_Impl.m
算法实现,继承于base,图方便也可不写,直接用DOA_base,这里为了命名一致。

% 非洲野狗算法实现 classdef DOA_Impl < DOA_base % 外部可调用的方法 methods function self = DOA_Impl(dim,size,iter_max,range_min_list,range_max_list) % 调用父类构造函数设置参数 self@DOA_base(dim,size,iter_max,range_min_list,range_max_list); end end end

2.测试

测试F1
文件名:..\optimization algorithm\algorithm_dingo\Test.m

%% 清理之前的数据 % 清除所有数据 clear all; close all; % 清除窗口输出 clc; %% 添加目录 % 将上级目录中的frame文件夹加入路径 addpath('../frame') %% 选择测试函数 Function_name='F1'; %[最小值,最大值,维度,测试函数] [lb,ub,dim,fobj]=Get_Functions_details(Function_name); %% 算法实例 % 种群数量 size = 50; % 最大迭代次数 iter_max = 1000; % 取值范围上界 range_max_list = ones(1,dim).*ub; % 取值范围下界 range_min_list = ones(1,dim).*lb; % 实例化非洲野狗算法类 base = DOA_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 space subplot(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 space subplot(1,2,2); % 绘制曲线,由于算法是求最大值,适应度函数为求最小值,故乘了-1,此时去掉-1 semilogy((base.value_best_history),'Color','r') title('Objective space') xlabel('Iteration'); ylabel('Best score obtained so far'); % 将坐标轴调整为紧凑型 axis tight % 添加网格 grid on % 四边都显示刻度 box off legend(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)]);


figure1.png

发布人:004d****    IP:117.173.23.***     举报/删稿
展会推荐
让朕来说2句
评论
收藏
点赞
转发