前面幾篇中台诗,我們介紹了優(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)]);
得到如下圖像