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) 粒子群算法浩考。