優(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ū)ο蟮乃枷搿T趍atlab中使用類(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è)體的公共屬性比較簡單只有兩個(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.測試(bushi)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怜俐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌季稳,老刑警劉巖景鼠,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓恶,死亡現(xiàn)場離奇詭異包晰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人停忿,你說我怎么就攤上這事吮铭∥缴危” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我酷愧,道長案铺,這世上最難降的妖魔是什么笔诵? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任谢翎,我火速辦了婚禮森逮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烟央。我一直安慰自己,他們只是感情好怠硼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布舟误。 她就那樣靜靜地躺著眯牧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪版确。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音士修,去河邊找鬼矩桂。 笑死雹锣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攒射。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捣鲸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酣衷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啊片,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笤昨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醒颖。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匿辩,死狀恐怖挺庞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情援制,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站答捕,受9級(jí)特大地震影響晌缘,放射性物質(zhì)發(fā)生泄漏选酗。R本人自食惡果不足惜呜叫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一娱颊、第九天 我趴在偏房一處隱蔽的房頂上張望箱硕。 院中可真熱鬧,春花似錦惠昔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽考传。三九已至僚楞,卻和暖如春泉褐,著一層夾襖步出監(jiān)牢的瞬間挺邀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留换淆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓具壮,卻偏偏與公主長得像攘已,于是被迫代替她去往敵國和親样勃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容