文化算法
算法说明:文化算法是基于人类社会进化原理的算法,他可以利用领域的先验知识以及在进化过程中获得的知识来指导搜索过程。文化能使种群以一定的速度进化和适应环境,而这个速度是超越单纯依靠基因遗传生物进化速度的。
文化算法是一种用于解决复杂计算的新型全局优化搜索算法,它模拟人类社会的演化过程。在人类社会中,文化可以被看做是信息的载体,这些信息潜在地影响所有社会成员,并且有益于指导同代及其后代解决问题的实践活动。区别于其他进化算法,文化算法是基于知识的双层进化系统,其包含两个进化空间:一个是由在进化过程中获取的经验和知识组成的信仰空间;另一个是由具体个体组成的种群空间,通过进化操作和性能评价进行自身的迭代。下图是文化算法的基本框架:
种群空间与信仰空间是两个相对独立的进化过程,两个空间通过一组由接收函数accept()和影响函数influence()组成的通信协议联系在一起。种群空间的个体在进化过程中,形成个体经验,通过accept()函数将个体经验传递到信仰空间。信仰空间将个体经验,根据一定行为规则进行比较优化,形成种群经验,信仰空间根据现有的种群经验和新个体经验用update()函数进行更新;而influence()函数能够利用信仰空间中待解决的问题的经验知识来指导种群空间的进化,以使种群空间得到更高的进化效率。objective()函数是目标函数(适应度函数)。其作用是用来评价种群空间中个体的适应值的。generate()函数根据个体行为规则和父辈个体参数生成下一代个体,select()函数根据规则从新生成个体中选择一部分个体作为下代个体的父辈。
算法的具体作用机理:
1)初始化一个种群空间p,然后通过目标函数(适应度函数)对种群空间中的个体进行评价;2)根据目标函数给定的取值范围和初始种群中的候选解,按照信仰空间结构,生成初始信仰空间;3)根据影响函数influence(),对种群中的每个父个体进行变异,生成相因个数的子个体;4)对于生成的父、子共2p新中群的每个个体,从中随机选取c个个体与其进行比较,如果该个体适应值优于与其比较的个体则称其获胜一次,记录每个个体获胜次数。选取p个具有最多胜利次数的个体作为下一代的父个体;5)设定接收函数,更新信仰空间;6)不满足结束条件,则重复(3)至结束。
可用文化算法求解的问题:
1.
在不同的种群内可按不同的速度进行进化求解的复杂系统问题;
2.
结合搜索和知识引导的混合系统求解问题;
3.
需多种群及其交互的求解问题;
4.
将不同算法结合利用其各自特性进行混合求解的问题等。
用于简单函数优化的算法代码(MATLAB)
%===============文化算法---解决非线性无约束函数优化问题=======================
clc,clear
popSize=40; %初始种群规模
pop=[]; %种群空间, 一维函数函数优化
popSon=zeros(popSize,1); %子代种群
f=zeros(popSize,1); %种群的适应度值
c=60; %从种群中随机取出的个体数
suitKnowledge=[]; %形势知识
normKnowledge=zeros(popSize,2); %规范知识
gmax=40; %最大进化代数
acc=0.7; %接受函数的接受概率
%=======================初始化种群空间======================================
% 一维函数
for i=1:popSize
pop(i)=5.12*(2*rand-1); %实数编码结构
end
%=======================计算种群适应度======================================
for i=1:popSize
f(i)=fit(pop(i));
end
%========================初始化信仰空间=====================================
[fbest,bestnum]=min(f);
suitKnowledge=pop(bestnum); %初始化形势知识
for i=1:popSize
normKnowledge(i,1)=-5.12; %n为规范知识
normKnowledge(i,2)=5.12; %n的第一列为x取值下限第二列为取值上限
end
%-----------------------
《进入大循环》-------------------------------------
for u=1:gmax
%========================影响函数(生成子代)================================
�-version1:使用规范知识调整变量变化步长,使用形势知识调整其变化方向.
for
i=1:popSize if(pop(i)
popSon(i)=pop(i)+abs((normKnowledge(i,2)-normKnowledge(i,1))*rand);
elseif(pop(i)>suitKnowledge)
popSon(i)=pop(i)-abs((normKnowledge(i,2)-normKnowledge(i,1))*rand);
elseif(pop(i)==suitKnowledge)
popSon(i)=pop(i)+(normKnowledge(i,2)-normKnowledge(i,1))*rand;
end
end
popSon; %生成的子代个体
for i=(popSize+1):(2*popSize)
pop(i)=popSon(i-popSize); %将生成的子代个体放到父代个体后面 end
%=========================父子竞争(记录胜率)==============================
winnum=zeros(2*popSize,1); %记录每个个体的胜利次数
for i=1:2*popSize
cnum=randperm(2*popSize);
winsingle=0;
for j=1:c
if(fit(pop(i))
winsingle=winsingle+1; %记录胜利次数
end
end
winnum(i)=winsingle;
end
index=1;
for
i=1:2*popSize %将pop按获胜次数排序, 冒泡法
for j=(i+1):2*popSize
if(winnum(i) %将胜利次数从大到小排列
uusee=winnum(i);
winnum(i)=winnum(j);
winnum(j)=uusee; index=j; % index
是对应第i个获胜次数最多pop的索引 end end
pptv=pop(i);
pop(i)=pop(index); %将pop按获胜次数从新排, 将获胜次数多的前40个个体放入父代
pop(index)=pptv;
end
for
i=1:2*popSize f(i)=fit(pop(i)); %计算新生成的父代个体的适应度值
end
[fbest,bestnum]=min(f(1:popSize));
%取出前40个新生种群的最优个体
f;
pop;
%=====================概率为acc的接受函数=====================================
if(fbest
if(rand<=acc) %以概率acc择优接受形势知识
suitKnowledge=pop(bestnum); end
end
for i=1:popSize
if((pop(i)
if(rand<=acc) %以概率acc择优接受规范知识
normKnowledge(i,1)=pop(i);
end
end
if((pop(i)>normKnowledge(i,2))||(fit(pop(i))
if(rand<=acc) %以概率acc择优接受接受规范知识
normKnowledge(i,2)=pop(i);
end
end
end
pop;
%↑↑↑↑↑↑↑↑↑形势知识和规范知识(信仰空间)完成了更新↑↑↑↑↑↑↑↑↑↑↑↑
trend(u)=fbest;
trendindex(u)=suitKnowledge;
%drawca(trendindex(u),trend(u)); %画图函数
end
%-------------------------《大循环结束》------------------------------------
trend
fbest
g=1:40;
figure(2);
plot(g,trend,'k');
title('适应值随进化代数变化曲线');
text(15,0.007,['最终搜索结果:最小值为',num2str(fbest)]);
fit.m
function f=fit(x)
% x is a Vector with xi between [-5.12, 5.12]
% min is at (0, 0, ..., 0)
% Generalized Rastrigin’s Function
n = size(x, 2);
output=0;
for i = 1:n
output = output+x(i)^2-10*cos(2*pi*x(i))+10;
end
f=output;