一种新的自适应量子遗传算法研究
传统的量子进化算法基于二进制编码,α和β分别是0和1的概率幅[1]。所以传统的量子进化算法求解二进制参数的优化函数和组合问题时,具有较好的性能[2]。为了使量子进化算法能够更好地解决实参优化函数,需要设计基于实数参数的量子进化算法[3]。HichemTalbi针对实际参数优化问题,通过将本地搜索技术与量子激发的进化算法相结合,提出了一种新的实编码量子激励进化算法来解决连续优化问题[4]。Luciano Reisda Silveira提出了一种新的量子启发进化算法来解决排序问题,并对旅行商问题和车辆路径问题这两个基准应用程序进行了评估[5]。为了充分挖掘量子启发进化算法在多目标设计优化中的潜力,S L Ho提出了一个考虑整体目标函数的改进数和特定目标函数的改进量的适合性赋值公式来寻求最佳解决方案[6]。
实现实参量子进化方法的一种直接方法是,每个参数用多个量子比特进行编码,然后把通过量子测量得到的二进制编码转换为0到1之间的实数[7]。然而,这种方法处理某些区间突变的函数时,需要使用大量的量子比特表示参数,这将导致计算量和搜索空间的增长,使计算效率降低。而且使用这种表示方法的另一个弊端是,一个二进制数的改变,有时不能得到临近解(例如,00和10)。灰色的编码方法可以缓解上述问题[8-9],但是灰色编码方法由于其灰色关联理论的不确定性和模糊性,难以设计出准确且有意义的遗传算子。所以需要设计性能较好的实数编码的量子遗传算法来解决数值优化问题[10]。
1 实数编码的遗传算法编码方法
实数编码的量子遗传算法(Real-coded Quantum Genetic Algorithm,RQGA)的初始染色体包括实数值和量子比特值,表示为:{P1(t)P2(t)… PNp(t)},其中,Ng)是实数编码值,(j=1,2,…,Ng)表示量子比特相位角,所以每个染色体同时包含实数空间和相位空间的信息。
实数编码的量子遗传算法在搜寻过程中生成实数候选解字符串。一组Np个量子比特串,(i=1,2,…,Np)是第t代的第i个量子位串,相应地,另一组Ng个实数的Np个字符串(i=1,2,…,Np),保持不变。每个Qi有Ng个量子比特,代表αi的概率幅。生成比现值的大(小)的实数的概率由确定。搜索初期,所有概率相等,Qi的αi和βi都被初始化为0.707[11-13]。Pi(i=1,2,…,Np)的每个元素初始化为参数允许范围内的随机数。每对Qi和Pi代表第t代的第i个族。
对第i个族的Nc个解的字符串(j=1,2,…,Nc)由、和(当前找到的适应度最好的解)生成。适应度在确定约束条件后计算。生成的示意图如图1所示。
2 实数编码的遗传算法进化方法
RQGA利用两种临近算符实现进化。两个临近算符,临近算符1(NO1)和临近算符2(NO2)用于生成 Nc个临近解字符串。其中,最好的临近解决定第i个族。如果优于,代替成为。所有中的最优值(若其优于)代替成为。
在RQGA中,量子比特的进化表示0和1的重叠状态的进化,|α|2和|β|2的改变转化为问题空间中用两个临近算符进行实参的改变。
临近算符1:第t代,Nq个量子比特串Qi,每个量子比特串有Ng个元素。NO1生成解字符串(j=1,2,…,Nc),每个解字符串有Ng个元素。
图1 生成新Pbest的示意图
生成有Ng个元素的数组Rij,Rij中的元素为随机的+1或-1。ρijk为Rij中的第k个元素,则其中δ是角度的变化,是旋转角,=arctan(βijk/αijk),若 ρijk=-1,δ 是的随机数;若 ρijk=+1,δ是的随机数。
新的概率幅计算公式是:
则个体元素的计算公式是:
其中,Pkmax和Pkmin是允许范围的最大值和最小值。
临近算符2:NO2的机制大部分和NO1一样,除此之外,NO2生成一个Pb和Pbest之间的点,并用这个点进行初始搜索空间的开发。NO2用公式确定,其中,Pkmax=max(Pbestik,),Pkmin=min(Pbestik,),是第t代第i族的最优个体。
两种临近算符的特点如下:NO1有更好的搜索性能,因为由所给字符串生成的解很大程度上与所给字符串是不同的;NO2有更好的求精性能,因为随着算法的进行,Pj会向着Pbestj收敛。这一算法避免了二进制表示实数的缺点,同时可以在搜索和求精中取得平衡。用临近算符1计算第t代,第i个种群的第 j个个体的第k个元素的流程图如图2所示。
图2 临近算符1计算第t代,第i个种群的第 j个个体的第k个元素的流程图
NO1具有较好的寻优性能,NO2有较好的求精性能。由于在进化初期,算法以搜索为主,在进化后期,以求精为主,所以在进化前期以较大的频率比率进行NO1,在进化后期以较大的频率比率进行NO2。具体的频率比率按式(2)确定。其中,FNO1是NO1的使用频率比率,FNO2是NO2的使用频率比率,t是RQGA的当前进化代数,T是每次循环的RQGA的进化总代数。