優(yōu)化算法matlab實(shí)現(xiàn)(二)框架編寫

1.編寫框架的目的

優(yōu)化算法筆記(一)優(yōu)化算法的介紹中,已經(jīng)介紹過了優(yōu)化算法的基本結(jié)構(gòu)。大多數(shù)優(yōu)化算法的結(jié)構(gòu)都是十分相似的。
  實(shí)現(xiàn)單個(gè)算法時(shí),我們可能不需要什么框架。但是我們需要算法之間的對(duì)比,免不了需要實(shí)現(xiàn)多個(gè)算法。
  由于優(yōu)化算法之間的結(jié)構(gòu)大致相同,所以我們可以將其相同的部分或者模塊抽離出來,形成公共的部分,我們只需要關(guān)注每一個(gè)算法自身獨(dú)特的部分即可。
  為了實(shí)現(xiàn)公共部分的抽離,我們需要用到面向?qū)ο蟮乃枷?。在matlab中使用類(classdef)來定義一個(gè)基礎(chǔ)類,其中編寫公共代碼,在其他類中只需繼承基礎(chǔ)類并實(shí)現(xiàn)自身獨(dú)有的方法即可。

2.優(yōu)化算法公共部分

將優(yōu)化算法進(jìn)行抽象可以得到三個(gè)部分:種群(個(gè)體),規(guī)則,環(huán)境
  其中種群即優(yōu)化算法中個(gè)體組成的種群,規(guī)則則是各個(gè)優(yōu)化算法中的算子,環(huán)境為我們需要求解的適應(yīng)度環(huán)境。優(yōu)化算法也可以描述成:在種群中求解在一定規(guī)則下最適應(yīng)目標(biāo)環(huán)境的個(gè)體。

描述
種群 由個(gè)體組成的群體(列表)
規(guī)則 優(yōu)化算法結(jié)構(gòu)及算子
環(huán)境 待解適應(yīng)度函數(shù)(外部輸入)

具體實(shí)現(xiàn)時(shí),我們需要實(shí)現(xiàn)的是
(1)個(gè)體(種群為個(gè)體的列表)
(2)規(guī)則(優(yōu)化算法流程)

2.1個(gè)體

各算法中個(gè)體的差異其實(shí)還是挺大的,不過個(gè)體的公共屬性比較簡(jiǎn)單只有兩個(gè)
(1)位置:適應(yīng)度函數(shù)的輸入。
(2)值:適應(yīng)度函數(shù)的值。

2.2 規(guī)則

規(guī)則其實(shí)就是算法的主題,算法的執(zhí)行過程。每個(gè)算法的執(zhí)行過程必然不一樣(一樣那就是同一個(gè)算法了)。但是算法的執(zhí)行流程還是有很多相同的部分的。



(1)初始化:初始化個(gè)體,一般是在解空間內(nèi)隨機(jī)初始化。
(2)循環(huán)迭代:在最大迭代次數(shù)內(nèi)執(zhí)行指定步驟
(3)記錄:記錄每代的最優(yōu)解,最優(yōu)值

3.實(shí)現(xiàn)

下面是完整的代碼,需要自己動(dòng)手組成框架。
總目錄:../optimization algorithm
框架目錄:../optimization algorithm/frame
框架文件:

文件名 描述
../optimization algorithm/frame/Unit.m 個(gè)體
../optimization algorithm/frame/Algorithm_Impl.m 算法主體

文件內(nèi)容:
Unit.m

% 個(gè)體基類
classdef Unit
    properties
        % 個(gè)體的位置
        position
        % 個(gè)體的適應(yīng)度值
        value
    end
    
    methods
        function self = Unit()
        end
    end
    
end

Algorithm_Impl.m

% 優(yōu)化算法基類
classdef Algorithm_Impl < handle
    properties
        %當(dāng)前最優(yōu)位置
        position_best;
        %當(dāng)前最優(yōu)適應(yīng)度
        value_best;
        %歷史最優(yōu)適應(yīng)度
        value_best_history;
        %歷史最優(yōu)位置
        position_best_history;
        %是否為求最大值,默認(rèn)為是
        is_cal_max;
        %適應(yīng)度函數(shù),需要單獨(dú)傳入
        fitfunction;
        % 調(diào)用適應(yīng)度函數(shù)次數(shù)
        cal_fit_num = 0;
    end
    properties(Access = protected)
        %維度
        dim;
        %種群中個(gè)體的數(shù)量
        size;
        %最大迭代次數(shù)
        iter_max;
        %解空間下界
        range_min_list;
        %解空間上界
        range_max_list;
        %種群列表
        unit_list;
    end
    
    methods
         % 運(yùn)行,調(diào)用入口
        function run(self)
            tic
            self.init()
            self.iteration()
            toc
            disp(['運(yùn)行時(shí)間: ',num2str(toc)]);

        end
    end
    
    methods (Access = protected)
        % 構(gòu)造函數(shù)
        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;
            %默認(rèn)為求最大值
            self.is_cal_max = true;
        end
        
        % 初始化
        function init(self)
            self.position_best=zeros(1,self.dim);
            self.value_best_history=[];
            self.position_best_history=[];
            %設(shè)置初始最優(yōu)值,由于是求最大值,所以設(shè)置了最大浮點(diǎn)數(shù)的負(fù)值
            self.value_best = -realmax('double');
        end
        
        % 開始迭代
        function iteration(self)
            for iter = 1:self.iter_max
                self.update(iter)
            end
        end
        
        % 處理一次迭代
        function update(self,iter)
            % 記錄最優(yōu)值
            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(['最優(yōu)值=' num2str(self.value_best)]);
            else
                self.value_best_history(end+1) = -self.value_best;
                disp(['最優(yōu)值=' num2str(-self.value_best)]);
            end
            self.position_best_history = [self.position_best_history;self.position_best];
            disp(['最優(yōu)解=' num2str(self.position_best)]);
        end
        
        function value = cal_fitfunction(self,position)
            if(isempty(self.fitfunction))
                value = 0;
            else
                % 如果適應(yīng)度函數(shù)不為空則返回適應(yīng)度值
                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
        
        % 越界檢查,超出邊界則在解空間內(nèi)隨機(jī)初始化
        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
    end
end

注意:此代碼實(shí)現(xiàn)的是求目標(biāo)函數(shù)最大值,求最小值可將適應(yīng)度函數(shù)乘以-1(框架代碼已實(shí)現(xiàn))。
注意:此代碼實(shí)現(xiàn)的是求目標(biāo)函數(shù)最大值,求最小值可將適應(yīng)度函數(shù)乘以-1(框架代碼已實(shí)現(xiàn))。
注意:此代碼實(shí)現(xiàn)的是求目標(biāo)函數(shù)最大值,求最小值可將適應(yīng)度函數(shù)乘以-1(框架代碼已實(shí)現(xiàn))。

4.測(cè)試(bushi)

這里只是實(shí)現(xiàn)了優(yōu)化算法框架的公共部分,這還不是一個(gè)完整的優(yōu)化算法,我們無法使用它來求解,在下一篇,在框架的基礎(chǔ)上實(shí)現(xiàn) 粒子群算法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容