目录
0 引言
帝国主义竞争算法(Imperialist Competitive Algorithm,ICA)是由Atashpaz-Gargarl and Lycas于2007年基于人类社会进化提出的智能算法。ICA算法将每个个体赋予为国家,将优势个体赋予帝国主义国家,劣势个体赋予殖民地,按照一定比列将殖民地划入帝国主义国家。帝国之间通过竞争来获得更多殖民地,同时竞争力差帝国开始衰落,殖民地之间竞争和更强大帝国对其文化等输入使其强大,就会取代弱的帝国成为新的帝国参与帝国竞争,直至最后所有殖民地被一个帝国统治,算法结束。
1 数学模型
ICA算法主要对殖民地和帝国划分,殖民地竞争,殖民地向帝国发展和帝国之间竞争等算法原理进行数学模型构建:
1)初始化:形成帝国
式p为帝国个体,var为个体问题维度,f为对应适应度,ICA算法中称其为成本,Nimp为帝国,Ncol为殖民地,Cn为帝国成本,Pn为帝国相关力量,NCn为第n个帝国所拥有殖民地的数量。
2)同化作用(殖民地向帝国主义发展):为了实现吸收壮大的目的,帝国试图去吸收它们的殖民地并使其成为帝国的一部分。更准确的说,殖民地沿着坐标轴向着帝国移动,如下图所示,
其中X为服从均匀分布随机数,β为大于1的数,d为殖民地和帝国之间距离,θ为殖民地随机偏差量,γ为调整与原始方向偏差的参数。
3)革命:在ICA术语中,革命可以使一个国家的社会政治特征突然产生变化。这种发生趋势是随机,给算法增加随机性,以免陷入局部收敛状态。
4)内部竞争(殖民地和帝国位置互换):随着时间不断发展,殖民地不断强大,成本越来越少(适应度优),则在帝国竞争中较弱帝国低于殖民地时,就会被取代,从而互换位置,如下图所示:
5)帝国总权力:帝国权力不仅仅在于自身,也在于殖民地的多少。故其数学模式如下:
式中ξ为较小正数,其越大会使殖民地对帝国影响变大,通常取0.1。
6)外部竞争(帝国主义之间竞争):帝国主义竞争过程中,强国在不断变强,弱国不断变弱,在ICA算法最弱帝国不一定被最强占领,根据一定概率进行占领,强国占领的可能性无限变大,提高随机性,如下图所示:
先在帝国中选出最弱的殖民地,确定每个国家占领其的可能性,该概率由帝国总权力确定:
依据相对帝国力量进行占领决定:
根据上述殖民地的占领概率在帝国中进行划分,形成向量P:
同时创建一个与P大小相同向量提高其随机性:r为均匀分布随机数
参考D向量内对应的概率,将上述殖民按照D中相关概率分配帝国进行竞争,类似GA等进化算法中轮盘赌策略。
2 优化的方式
前篇对BP神经网络原理讲解(BP神经网络原理及matlab代码-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述ICA原理介绍,可以将BP神经网络权值和阈值作为ICA算法中的国家,每一个种群对应BP神经网络的预测值,将这个预测值作为国家成本进行帝国和殖民地的化分,进行上述活动,更新出最强的帝国。
3 Matlab代码
3.1 伪代码
3.2 ICA主函数代码
主代码
%% 参数
%CostFunction 适应度函数
%alpha 压力参数
%beta 同化概率
%pRevolution 革命概率
%mu 革命率
%zeta 殖民地平均系数
%VarSize 问题维度
%VarMin,VarMax 问题维度边界
%MaxIt 最大迭代次数
%nPop 国家数量
%nEmp 帝国数量
%AssimilateColonies 同化函数
%DoRevolution 革命函数
%IntraEmpireCompetition 内部竞争
%UpdateTotalCost 总权力
%InterEmpireCompetition 外部竞争
%
global ProblemSettings;
ProblemSettings.CostFunction=CostFunction;
net.trainParam.showWindow = 0;
ProblemSettings.nVar=nVar;
ProblemSettings.VarSize=VarSize;
ProblemSettings.VarMin=VarMin;
ProblemSettings.VarMax=VarMax;
global ICASettings;
ICASettings.MaxIt=MaxIt;
ICASettings.nPop=nPop;
ICASettings.nEmp=nEmp;
ICASettings.alpha=alpha;
ICASettings.beta=beta;
ICASettings.pRevolution=pRevolution;
ICASettings.mu=mu;
ICASettings.zeta=zeta;
%% 初始化
% 初始化帝国
emp=CreateInitialEmpires();
net.trainParam.showWindow = 0;
% 保存最佳成本值的数组
BestCost=zeros(MaxIt,1);
%开始主函数
for it=1:MaxIt
% 同化作用
emp=AssimilateColonies(emp);
net.trainParam.showWindow = 0;
% 革命,从模型角度上有利扩展搜索空间,类似GA的突变
emp=DoRevolution(emp);
net.trainParam.showWindow = 0;
% 帝国内部竞争
emp=IntraEmpireCompetition(emp);
% 更新帝国殖民的总成本
emp=UpdateTotalCost(emp);
net.trainParam.showWindow = 0;
% 帝国外部竞争(帝国之间)
emp=InterEmpireCompetition(emp);
% 更新找到的最佳解
imp=[emp.Imp];
[~, BestImpIndex]=min([imp.Cost]);
BestSol=imp(BestImpIndex);
% 更新最佳解
BestCost(it)=BestSol.Cost;
end
同化函数代码
%% 同化作用
% 同化殖民地向自身发展
function emp=AssimilateColonies(emp)
global ProblemSettings;
CostFunction=ProblemSettings.CostFunction;
net.trainParam.showWindow = 0;
VarSize=ProblemSettings.VarSize;
VarMin=ProblemSettings.VarMin;
VarMax=ProblemSettings.VarMax;
global ICASettings;
beta=ICASettings.beta;
nEmp=numel(emp);
for k=1:nEmp
for i=1:emp(k).nCol
emp(k).Col(i).Position = emp(k).Col(i).Position ...
+ beta*rand(VarSize).*(emp(k).Imp.Position-emp(k).Col(i).Position);
emp(k).Col(i).Position = max(emp(k).Col(i).Position,VarMin);
emp(k).Col(i).Position = min(emp(k).Col(i).Position,VarMax);
emp(k).Col(i).Cost = CostFunction(emp(k).Col(i).Position);
net.trainParam.showWindow = 0;
end
end
end
革命:
% 革命
function emp=DoRevolution(emp)
global ProblemSettings;
CostFunction=ProblemSettings.CostFunction;
nVar=ProblemSettings.nVar;
VarSize=ProblemSettings.VarSize;
VarMin=ProblemSettings.VarMin;
VarMax=ProblemSettings.VarMax;
global ICASettings;
pRevolution=ICASettings.pRevolution;
mu=ICASettings.mu;
nmu=ceil(mu*nVar);
sigma=0.1*(VarMax-VarMin);
nEmp=numel(emp);
for k=1:nEmp
NewPos = emp(k).Imp.Position + sigma*randn(VarSize);
jj=randsample(nVar,nmu)';
NewImp=emp(k).Imp;
NewImp.Position(jj)=NewPos(jj);
NewImp.Cost=CostFunction(NewImp.Position);
net.trainParam.showWindow = 0;
if NewImp.Cost<emp(k).Imp.Cost
emp(k).Imp = NewImp;
end
for i=1:emp(k).nCol
if rand<=pRevolution
NewPos = emp(k).Col(i).Position + sigma*randn(VarSize);
jj=randsample(nVar,nmu)';
emp(k).Col(i).Position(jj) = NewPos(jj);
emp(k).Col(i).Position = max(emp(k).Col(i).Position,VarMin);
emp(k).Col(i).Position = min(emp(k).Col(i).Position,VarMax);
emp(k).Col(i).Cost = CostFunction(emp(k).Col(i).Position);
net.trainParam.showWindow = 0;
end
end
end
end
外部竞争代码
%% 帝国之间竞争,通过总成本对比
function emp=InterEmpireCompetition(emp)
if numel(emp)==1
return;
end
global ICASettings;
alpha=ICASettings.alpha;
TotalCost=[emp.TotalCost];
[~, WeakestEmpIndex]=max(TotalCost);
WeakestEmp=emp(WeakestEmpIndex);
P=exp(-alpha*TotalCost/max(TotalCost));
P(WeakestEmpIndex)=0;
P=P/sum(P);
if any(isnan(P))
P(isnan(P))=0;
if all(P==0)
P(:)=1;
end
P=P/sum(P);
end
if WeakestEmp.nCol>0
[~, WeakestColIndex]=max([WeakestEmp.Col.Cost]);
WeakestCol=WeakestEmp.Col(WeakestColIndex);
WinnerEmpIndex=RouletteWheelSelection(P);
WinnerEmp=emp(WinnerEmpIndex);
WinnerEmp.Col(end+1)=WeakestCol;
WinnerEmp.nCol=WinnerEmp.nCol+1;
emp(WinnerEmpIndex)=WinnerEmp;
WeakestEmp.Col(WeakestColIndex)=[];
WeakestEmp.nCol=WeakestEmp.nCol-1;
emp(WeakestEmpIndex)=WeakestEmp;
end
if WeakestEmp.nCol==0
WinnerEmpIndex2=RouletteWheelSelection(P);
WinnerEmp2=emp(WinnerEmpIndex2);
WinnerEmp2.Col(end+1)=WeakestEmp.Imp;
WinnerEmp2.nCol=WinnerEmp2.nCol+1;
emp(WinnerEmpIndex2)=WinnerEmp2;
emp(WeakestEmpIndex)=[];
end
end
内部竞争代码
%% 内部革命
function emp=IntraEmpireCompetition(emp)
nEmp=numel(emp);
for k=1:nEmp
for i=1:emp(k).nCol
if emp(k).Col(i).Cost<emp(k).Imp.Cost
imp=emp(k).Imp;
col=emp(k).Col(i);
emp(k).Imp=col;
emp(k).Col(i)=imp;
end
end
end
end
总成本代码
% 更新帝国殖民总成本
function emp=UpdateTotalCost(emp)
global ICASettings;
zeta=ICASettings.zeta;
nEmp=numel(emp);
for k=1:nEmp
if emp(k).nCol>0
emp(k).TotalCost=emp(k).Imp.Cost+zeta*mean([emp(k).Col.Cost]);
else
emp(k).TotalCost=emp(k).Imp.Cost;
end
end
end
3.3 ICA-SVM
1)回归模型:私信
2)分类模型:分类模型:帝国主义竞争算法优化支持向量机模型(ICA-SVM)
4 视频讲解
B站搜索:‘ 不想学习的陈成 ’