反向学习(Opposition-based Learning)是机器学习中的一个概念,其灵感来源于现实世界中事物之间的相对关系,例如:阴与阳、冷与热、干与湿等。该方法于2005年首次提出,在之后的十余年中被广泛研究,大量经典算法(例如:强化学习、启发式算法、人工神经网络等)借助该方法来提高性能。下面以启发式算法中(例如:GA),生成自然数编码初始种群的反向种群为例,介绍反向学习的实现方法。
首先,生成个体长度为n,种群规模为m的初始种群InitPop,代码如下:
var n,m:=8 --n:个体长度,m:种群规模
var tab:table[integer,real] --临时个体保存列表
for var i:=1 to m --生成随机种群
tab.create
for var j:=1 to n
tab[1,j]:=j --自然数编码方式
tab[2,j]:=z_uniform(1,0,n) --生成随机数
next
tab.sort(2,"up") --根据随机数排序
tab.copyRangeTo({1,1}..{1,*},InitPop,i,1) --随机个体保存至InitPop列表
next
其次,生成初始种群InitPop对应的反向学习种群OppoPop,其中已知数x,x∈[a,b],其反向数x’的计算方法为:x’=a+b-x,代码如下:
for var i:=1 to InitPop.XDim
var MaxValue:=InitPop.max({i,1}..{i,*}) --个体最大值
var MinValue:=InitPop.min({i,1}..{i,*}) --个体最小值
for var j:=1 to InitPop.YDim
OppoPop[i,j]:=MaxValue+MinValue-InitPop[i,j] --计算反向基因值
next
next
最后,可以采用种群合并、并行融合等算法策略,将反向学习种群与原算法进行结合,有效扩大搜索范围,避免寻优过程陷入局部最优,从而提高仿真优化算法性能。
参考文献:Sedigheh Mahdavi, Shahryar Rahnamayan, Kalyanmoy Deb, Opposition based learning: A literature review, Swarm and Evolutionary Computation, 39(2018), 1-23