维度划分策略进行大规模优化:《A Recursive Decomposition Method for Large Scale Continuous Optimization 》。高维度问题的求解一般通过“分而治之”的思想,将问题分解为多个独立的子问题解决,此论文采用了递归差分分组(RDM)的方法将维度划分,再进行合作共同进化。
一、算法流程
- 将所有决策变量设置为搜索空间(xl,l)的下限(lb);
- 将(xl,l)的决策变量X1从下界向上界(ub)扰动,用(xu,l)表示;
- 计算(xl,l)和(xu,l)间的差值(δ1);
- 将(xl,l)和(xu,l)的决策变量X2从下界和中界之间的下界和上界进行扰动,分别用(xl,m)和(xu,m)表示;
- 计算(xl,m)和(xu,m)之间的差值(δ2);
- 如果δ1和δ2之间的差值大于阈值E,则X1和X2之间存在一些相互作用。
二、核心功能INTERACT
INTERACT主要用来判断集合X1与集合X2的变量之间是否独立。总的来说,就是一个嵌套循环,使集合X1部分上界减下界,集合X2部分取中值,通过差值之间的变化与阈值相比看X1与X2是否存在独立的关系。这就出现了一个问题,阈值的大小该怎么设置?太大了会导致变量分离不彻底,太小了可能又会使独立的变量不能分离。
matlab实现如下:
function [X1]=interact(X1,X2,xll,yll,ub,lb,E)
xul=xll(1,:);
count=length(X1);
if count==1
xul(X1(1))=ub(X1(1));
else
for i=1:count
xul(X1(i))=ub(X1(i));
end
end
e1=yll-fun(xul);
xlm=xll(1,:);
count=length(X2);
if count==1
xlm(X2(1))=(lb(1)+ub(1))/2;
else
for i=1:count
if(X2(i))==0
X2(i)=[];
else
xlm(X2(i))=(lb(X2(i))+ub(X2(i)))/2;
end
end
end
xum=xul(1,:);
count=length(X2);
if count==1
xum(X2(1))=(lb(X2(1))+ub(X2(1)))/2;
else
for i=1:count
if(X2(i))==0
X2(i)=[];
else
xum(X2(i))=(lb(X2(i))+ub(X2(i)))/2;
end
end
end
e2=fun(xlm)-fun(xum);
e=abs(e1-e2);
if e>E
if length(X2)==1
X1=[X1,X2];
X1=unique(X1);
else
G=buffer(X2,ceil(length(X2)/2));
G1(1,:)=G(:,1);
G2(1,:)=G(:,2);
X1_1=interact(X1,G1,xll,yll,ub,lb,E);
X2_1=interact(X1,G2,xll,yll,ub,lb,E);
X1=union(X1_1,X2_1);
end
end
三、结果分析
设置阈值E=0.1,(x1,x2,…xn)∈[-1,1],输出相关性矩阵M,‘1’代表相关,‘0’代表无关,M定为对称矩阵,且对角线为‘1’。
看起来分组挺准确的,再换个函数试试:
好像没有什么问题,但是,把函数中变量的符号改变一下,就出现问题了。显而易见,通过计算就能得出此函数使得(δ1-δ2)=0.
然而造成这一现象的原因:
1.各变量的上下界相同且对称;(后期通过改变上下界并没有太大的影响)
2.函数式特殊;
3.阈值设置太大。
总的来说,RDM可以将一些相对简单的函数维度进行划分,对于含有重叠变量的函数效率不高,并且灵敏度与阈值的设置有很大的关系,但是对某一问题的解决,相对的阈值设置也不同,算法改进的方向就可以从阈值着手。