优化算法matlab实现(二)框架编写

分享
程序员 2024-10-3 03:34:54 70 0 来自 中国
1.编写框架的目的

在优化算法条记(一)优化算法的先容中,已经先容过了优化算法的根本布局。大多数优化算法的布局都好坏常相似的。
  实现单个算法时,我们大概不须要什么框架。但是我们须要算法之间的对比,免不了须要实现多个算法。
  由于优化算法之间的布局大抵类似,以是我们可以将其类似的部门大概模块抽离出来,形成公共的部门,我们只须要关注每一个算法自身独特的部门即可。
  为了实现公共部门的抽离,我们须要用到面向对象的头脑。在matlab中使用类(classdef)来界说一个底子类,此中编写公共代码,在其他类中只需继承底子类并实现自身独有的方法即可。
2.优化算法公共部门

将优化算法举行抽象可以得到三个部门:种群(个体),规则,情况
  此中种群即优化算法中个体构成的种群,规则则是各个优化算法中的算子,情况为我们须要求解的顺应度情况。优化算法也可以形貌成:在种群中求解在肯定规则下最顺应目的情况的个体
形貌种群由个体构成的群体(列表)规则优化算法布局及算子情况待解顺应度函数(外部输入)具体实现时,我们须要实现的是
(1)个体(种群为个体的列表)
(2)规则(优化算法流程)
2.1个体

各算法中个体的差异实在还是挺大的,不外个体的公共属性比力简单只有两个
(1)位置:顺应度函数的输入。
(2)值:顺应度函数的值。
2.2 规则

规则实在就是算法的主题,算法的实行过程。每个算法的实行过程一定不一样(一样那就是同一个算法了)。但是算法的实行流程还是有许多类似的部门的。

1.png
(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)

这里只是实现了优化算法框架的公共部门,这还不是一个完备的优化算法,我们无法使用它来求解,在下一篇,在框架的底子上实现 粒子群算法。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-21 19:47, Processed in 0.183412 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表