優(yōu)化算法matlab實現(xiàn)(五)改進粒子群算法

前面幾篇中台诗,我們介紹了優(yōu)化算法的框架完箩,在框架的基礎上實現(xiàn)了粒子群算法,并找了測試函數(shù)來進行測試拉庶∈茹荆可以看出,基于框架來實現(xiàn)優(yōu)化算法還是挺復雜的氏仗,那么為什么要做的這么復雜呢吉捶?當然是為了方便改進和實現(xiàn)新算法。
  下面將實現(xiàn)粒子群算法的改進皆尔,作為例子呐舔,看看如何改進優(yōu)化算法。
  需要已實現(xiàn)的代碼

文件名 描述
..\optimization algorithm\frame\Unit.m 個體
..\optimization algorithm\frame\Algorithm_Impl.m 算法主體
..\optimization algorithm\frame\Get_Functions_details.m 測試函數(shù)慷蠕,求值用
..\optimization algorithm\frame\func_plot.m 函數(shù)圖像珊拼,畫圖用
..\optimization algorithm\algorithm_particle_swarm\PSO_Unit.m 粒子群算法個體
..\optimization algorithm\algorithm_particle_swarm\PSO_Base.m 粒子群算法主體
..\optimization algorithm\algorithm_particle_swarm\PSO_Impl.m 粒子群算法實現(xiàn)

改進方式:慣性系數(shù)W,隨著迭代次數(shù),從1線性遞減至0流炕。

..\optimization algorithm\algorithm_particle_swarm\PSO_Impl_1.m

% PSO修改澎现,慣性系數(shù)W線性遞減,由1->0
classdef PSO_Impl_1 < PSO_Base
  
   % 外部可調(diào)用的方法
   methods
       function self = PSO_Impl_1(dim,size,iter_max,range_min_list,range_max_list)
           % 調(diào)用父類構造函數(shù)設置參數(shù)
            self@PSO_Base(dim,size,iter_max,range_min_list,range_max_list);
            self.name = 'PSO_1';
       end
   end 
   
   % 重寫父類的方法
   methods (Access = protected)
       % 每一代的更新
       function update(self,iter)
           update@PSO_Base(self,iter)
           % 慣性系數(shù)線性遞減每辟,由1->0
           self.W = (1.0-iter/self.iter_max);
       end 
   end
   
end

這樣就實現(xiàn)好了剑辫,是不是非常的簡單。因為面向?qū)ο缶幊糖郏恍枰獙崿F(xiàn)修改的部分就好了妹蔽,相同的部分不用動。這樣也大大降低了出錯的概率挠将。
  下面進行測試胳岂,只需要將Test.m中的PSO_Impl改成PSO_Impl_1即可
  下面來修改測試代碼

%% 清理之前的數(shù)據(jù)
% 清除所有數(shù)據(jù)
clear all;
% 清除窗口輸出
clc;

%% 添加框架路徑
% 將上級目錄中的frame文件夾加入路徑
addpath('../frame')

%% 選擇測試函數(shù)
Function_name='F1';
% [最小值,最大值舔稀,維度乳丰,測試函數(shù)]
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);

%% 算法實例
% 種群數(shù)量
size = 50;
% 最大迭代次數(shù)
iter_max = 1000;
% 取值范圍上界
range_max_list = ones(1,dim)*ub;
% 取值范圍下界
range_min_list = ones(1,dim)*lb;

% 實例化粒子群類
base = PSO_Impl_1(dim,size,iter_max,range_min_list,range_max_list);
% 告訴算法求不是求最大值
base.is_cal_max = false;
% 確定適應度函數(shù)
base.fitfunction = fobj;
% 運行
base.run();

%% 繪制圖像
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);
% 繪制曲線
semilogy(base.value_best_history,'Color','r')
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
% 將坐標軸調(diào)整為緊湊型
axis tight
% 添加網(wǎng)格
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)]);

那么現(xiàn)在我們想比較一下PSO和PSO_1,相把曲線畫在一張圖中,該怎么做呢内贮?上代碼

%% 清理之前的數(shù)據(jù)
% 清除所有數(shù)據(jù)
clear all;
% 清除窗口輸出
clc;

%% 添加框架路徑
% 將上級目錄中的frame文件夾加入路徑
addpath('../frame')

%% 選擇測試函數(shù)
Function_name='F1';
%[最小值成艘,最大值,維度贺归,測試函數(shù)]
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);

%% 算法實例
% 種群數(shù)量
size = 50;
% 最大迭代次數(shù)
iter_max = 1000;
% 取值范圍上界
range_max_list = ones(1,dim)*ub;
% 取值范圍下界
range_min_list = ones(1,dim)*lb;

% 實例化粒子群PSO_Impl
base = PSO_Impl(dim,size,iter_max,range_min_list,range_max_list);
%告訴算法求不是求最大值
base.is_cal_max = false;
% 確定適應度函數(shù)
base.fitfunction = fobj;
% 運行
base.run();

% 實例化粒子群類PSO_Impl_1
base_1 = PSO_Impl_1(dim,size,iter_max,range_min_list,range_max_list);
%告訴算法求不是求最大值
base_1.is_cal_max = false;
% 確定適應度函數(shù)
base_1.fitfunction = fobj;
% 運行
base_1.run();

%% 繪制圖像
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);
% 繪制曲線,由于算法是求最大值断箫,適應度函數(shù)為求最小值拂酣,故乘了-1,此時去掉-1
h1 = semilogy(base.value_best_history,'Color','r');
hold on
h2 = semilogy(base_1.value_best_history,'Color','b');
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
% 將坐標軸調(diào)整為緊湊型
axis tight
% 添加網(wǎng)格
grid on
% 四邊都顯示刻度
box off
legend([h1,h2],base.name,base_1.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)]);
display(['The best solution obtained by ',base_1.name ,' is ', num2str(base_1.value_best)]);
display(['The best optimal value of the objective funciton found by ',base_1.name ,' is ', num2str(base_1.position_best)]);

得到如下圖像

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仲义,一起剝皮案震驚了整個濱河市婶熬,隨后出現(xiàn)的幾起案子剑勾,更是在濱河造成了極大的恐慌,老刑警劉巖赵颅,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽另,死亡現(xiàn)場離奇詭異,居然都是意外死亡饺谬,警方通過查閱死者的電腦和手機捂刺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來募寨,“玉大人族展,你說我怎么就攤上這事“斡ィ” “怎么了仪缸?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長列肢。 經(jīng)常有香客問我恰画,道長,這世上最難降的妖魔是什么瓷马? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任拴还,我火速辦了婚禮,結果婚禮上决采,老公的妹妹穿的比我還像新娘自沧。我一直安慰自己,他們只是感情好树瞭,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布拇厢。 她就那樣靜靜地躺著,像睡著了一般晒喷。 火紅的嫁衣襯著肌膚如雪孝偎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天凉敲,我揣著相機與錄音衣盾,去河邊找鬼。 笑死爷抓,一個胖子當著我的面吹牛势决,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓝撇,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼果复,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渤昌?” 一聲冷哼從身側(cè)響起虽抄,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤走搁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迈窟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體私植,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年车酣,在試婚紗的時候發(fā)現(xiàn)自己被綠了曲稼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡骇径,死狀恐怖躯肌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情破衔,我是刑警寧澤清女,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站晰筛,受9級特大地震影響嫡丙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜读第,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一曙博、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怜瞒,春花似錦父泳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漾橙,卻和暖如春杆融,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霜运。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工脾歇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淘捡。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓藕各,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焦除。 傳聞我的和親對象是個殘疾皇子激况,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

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