1.编写框架的目的
在优化算法条记(一)优化算法的先容中,已经先容过了优化算法的根本布局。大多数优化算法的布局都好坏常相似的。
实现单个算法时,我们大概不须要什么框架。但是我们须要算法之间的对比,免不了须要实现多个算法。
由于优化算法之间的布局大抵类似,以是我们可以将其类似的部门大概模块抽离出来,形成公共的部门,我们只须要关注每一个算法自身独特的部门即可。
为了实现公共部门的抽离,我们须要用到面向对象的头脑。在matlab中使用类(classdef)来界说一个底子类,此中编写公共代码,在其他类中只需继承底子类并实现自身独有的方法即可。
2.优化算法公共部门
将优化算法举行抽象可以得到三个部门:种群(个体),规则,情况。
此中种群即优化算法中个体构成的种群,规则则是各个优化算法中的算子,情况为我们须要求解的顺应度情况。优化算法也可以形貌成:在种群中求解在肯定规则下最顺应目的情况的个体。
形貌种群由个体构成的群体(列表)规则优化算法布局及算子情况待解顺应度函数(外部输入)具体实现时,我们须要实现的是
(1)个体(种群为个体的列表)
(2)规则(优化算法流程)
2.1个体
各算法中个体的差异实在还是挺大的,不外个体的公共属性比力简单只有两个
(1)位置:顺应度函数的输入。
(2)值:顺应度函数的值。
2.2 规则
规则实在就是算法的主题,算法的实行过程。每个算法的实行过程一定不一样(一样那就是同一个算法了)。但是算法的实行流程还是有许多类似的部门的。
(1)初始化:初始化个体,一样平常是在解空间内随机初始化。
(2)循环迭代:在最大迭代次数内实行指定步调
(3)纪录:纪录每代的最优解,最优值
3.实现
下面是完备的代码,须要自己动手构成框架。
总目次:../optimization algorithm
框架目次:../optimization algorithm/frame
框架文件:
文件名形貌../optimization algorithm/frame/Unit.m个体../optimization algorithm/frame/Algorithm_Impl.m算法主体文件内容:
Unit.m
% 个体基类classdef Unit properties % 个体的位置 position % 个体的顺应度值 value end methods function self = Unit() end end endAlgorithm_Impl.m
% 优化算法基类classdef Algorithm_Impl < handle properties %当前最优位置 position_best; %当前最优顺应度 value_best; %汗青最优顺应度 value_best_history; %汗青最优位置 position_best_history; %是否为求最大值,默以为是 is_cal_max; %顺应度函数,须要单独传入 fitfunction; % 调用顺应度函数次数 cal_fit_num = 0; end properties(Access = protected) %维度 dim; %种群中个体的数目 size; %最大迭代次数 iter_max; %解空间下界 range_min_list; %解空间上界 range_max_list; %种群列表 unit_list; end methods % 运行,调用入口 function run(self) tic self.init() self.iteration() toc disp(['运行时间: ',num2str(toc)]); end end methods (Access = protected) % 构造函数 function self = Algorithm_Impl(dim,size,iter_max,range_min_list,range_max_list) self.dim =dim; self.size = size; self.iter_max = iter_max; self.range_min_list = range_min_list; self.range_max_list = range_max_list; %默以为求最大值 self.is_cal_max = true; end % 初始化 function init(self) self.position_best=zeros(1,self.dim); self.value_best_history=[]; self.position_best_history=[]; %设置初始最优值,由于是求最大值,以是设置了最大浮点数的负值 self.value_best = -realmax('double'); end % 开始迭代 function iteration(self) for iter = 1:self.iter_max self.update(iter) end end % 处理惩罚一次迭代 function update(self,iter) % 纪录最优值 for i = 1:self.size if(self.unit_list(i).value>self.value_best) self.value_best = self.unit_list(i).value; self.position_best = self.unit_list(i).position; end end disp(['第' num2str(iter) '代']); if(self.is_cal_max) self.value_best_history(end+1) = self.value_best; disp(['最优值=' num2str(self.value_best)]); else self.value_best_history(end+1) = -self.value_best; disp(['最优值=' num2str(-self.value_best)]); end self.position_best_history = [self.position_best_history;self.position_best]; disp(['最优解=' num2str(self.position_best)]); end function value = cal_fitfunction(self,position) if(isempty(self.fitfunction)) value = 0; else % 假如顺应度函数不为空则返回顺应度值 if(self.is_cal_max) value = self.fitfunction(position); else value = -self.fitfunction(position); end end self.cal_fit_num = self.cal_fit_num+1; end % 越界检查,超出边界则停顿在边界上 function s=get_out_bound_value(self,position,min_list,max_list) if(~exist('min_list','var')) min_list = self.range_min_list; end if(~exist('max_list','var')) max_list = self.range_max_list; end % Apply the lower bound vector position_tmp=position; I=position_tmp<min_list; position_tmp(I)=min_list(I); % Apply the upper bound vector J=position_tmp>max_list; position_tmp(J)=max_list(J); % Update this new move s=position_tmp; end % 越界检查,超出边界则在解空间内随机初始化 function s=get_out_bound_value_rand(self,position,min_list,max_list) if(~exist('min_list','var')) min_list = self.range_min_list; end if(~exist('max_list','var')) max_list = self.range_max_list; end position_rand = unifrnd(self.range_min_list,self.range_max_list); % Apply the lower bound vector position_tmp=position; I=position_tmp<min_list; position_tmp(I)=position_rand(I); % Apply the upper bound vector J=position_tmp>max_list; position_tmp(J)=position_rand(J); % Update this new move s=position_tmp; end end events endend注意:此代码实现的是求目的函数最大值,求最小值可将顺应度函数乘以-1(框架代码已实现)。
注意:此代码实现的是求目的函数最大值,求最小值可将顺应度函数乘以-1(框架代码已实现)。
注意:此代码实现的是求目的函数最大值,求最小值可将顺应度函数乘以-1(框架代码已实现)。
4.测试(bushi)
这里只是实现了优化算法框架的公共部门,这还不是一个完备的优化算法,我们无法使用它来求解,在下一篇,在框架的底子上实现 粒子群算法。 |