当前位置:   article > 正文

量子遗传算法仿生计算_量子遗传算法的原理及应用

量子遗传算法的原理及应用


一、量子计算

1.量子力学

       由于微观粒子具有波粒二象性,微观粒子(即量子)本身的状态是由某个力学量的多个本征态叠加构成的,测量时无法获得他们所有确定的量值,而是以被测量值发生在一定概率区间的概率幅得到他们的某个本征值。微观粒子不同于宏观物质,他们不服从确定性的规律,而是服从统计规律。
       本征态:在量子力学中,一个力学量所可能取的数值,就是它的算符的全部本征值。本征函数所描写的状态称为这个算符的本征态。
       叠加态:一个量子系统处于多个本征态的叠加状态。
(1)量子态叠加性
       在量子力学中,所有的物理规律在一个希尔伯特空间(完备的内积空间)中表示,而这个希尔伯特空间可以称为态矢空间,在这个空间中,每一个物理态都对应一个矢量
       一般来说,一个量子态是由某个力学量的多个本征态叠加构成的,一个微观粒子的状态可以用一个粒子坐标和时间的复函数 ψ ( r , t ) \psi(r,t) ψ(r,t) 来完全描述,称该复函数为波函数
       在波函数分布区内的小体积元dV中找到粒子的概率为 dP= ψ ∗ ψ \psi^*\psi ψψdV ,其中 ψ ∗ \psi^* ψ ψ \psi ψ复共轭,模平方 ∣ ψ ∣ 2 |\psi|^2 ψ2称为概率密度。在测量时无法获得他们所有确定的量值,而是以被测量值发生在一定概率区间的概率幅得到它们的某个本征值。概率幅是负数,其模平方是概率,概率幅具有模量和相角,因此量子状态的叠加还会产生干涉现象。
(2)量子态相干性
       因为微观粒子具有波动性,导致同一个粒子不同动量的本征态之间是相干的。
(3)态叠加原理
       测量结果的不确定性源于量子态的叠加性,叠加的本质在于态的相干性,相干性导致态的叠加,量子态的相干叠加性及测量结果的概率特性称为态叠加原理。
(4)量子态纠缠性
       如果量子态不能分解成两个粒子态的直积形式,即每个粒子的状态不能单独表示出来,则两个粒子彼此关联,量子态是两个粒子共有的状态,这种特性称为量子态纠缠性。
(5)不可分离性
        量子力学把研究对象及其所处的环境看成一个整体,它不允许把世界看成有彼此分离的、独立的部分组成。当微观粒子处于某一状态时,它的力学量(如坐标、动量、角动量、能量等)一般不具有确定的数值,而具有一系列可能值,每个可能值以一定的概率出现。当粒子所处的状态确定时,其力学量具有某一可能值的概率也就完全确定。
(6)不确定性
       在量子力学中,不确定性指测量物理量的不确定性。**在一定条件下,一些力学量在不同时间测量,就有可能得到不同的值,会出现不确定值。**只有在这个力学量的本征态上测量它,才能得到确切的值。
       在量子力学中,测量过程本身对系统造成影响。要描写一个可观察量的测量,需要将一个系统的状态线性分解为该可观察量的一组本征态的线性组合。

2.量子计算

(1)量子信息
       在经典计算机中,比特是构成计算机内信息的最小单位,所有的信息都是由0和1组成、保存、运算及传递的,比特只能处在一个状态,非0即1;
       在量子信息中,量子比特可以同时处在∣0⟩和∣1⟩两个状态,量子信息的存储单元称为量子比特。一个量子比特的状态是一个二维复数空间的矢量,它的两个极化状态∣0⟩和∣1⟩对应于经典状态的0和1。
       在量子力学中使用狄拉克标记“∣ ⟩”和“⟨ ∣”表示量子态。即表示左矢(左向量)和右矢(右向量)。
       量子的状态叠加原理,即如果状态∣0⟩和∣1⟩是两个相互独立的量子态,他们的任意线性叠加 ∣ ϕ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ ∣\phi ⟩=\alpha∣0⟩+\beta∣1⟩ ϕ=α0+β1也是某一时刻的一个量子态,而系数 α \alpha α β \beta β的平方则描述系统分别处在∣0⟩和∣1⟩的概率。
       量子态可用矩阵的形式表示。如一对量子比特 ∣ 0 ⟩ ≡ ( 1 0 ) ∣0⟩ \equiv

(10)
0(10) ∣ 1 ⟩ ≡ ( 0 1 ) ∣1⟩ \equiv
(01)
1(01)
能够组成4个不重复的量子比特对∣00⟩、∣01⟩、∣10⟩、∣11⟩,他们张量积的矩阵表示如下:
∣ 00 ⟩ ≡ ∣ 0 ⟩ ⊗ ∣ 0 ⟩ = ( 1 0 ) ⊗ ( 1 0 ) = ( 1 × ( 1 0 ) 0 × ( 1 0 ) ) = ( 1 0 0 0 ) ∣00⟩ \equiv ∣0⟩ \otimes ∣0⟩=
(10)
\otimes
(10)
=
\begin{pmatrix}1 \times \begin{pmatrix}1\\0\end{pmatrix}
\\0 \times
(10)
\end{pmatrix}=
(1000)
00≡∣00=(10)(10)= 1×(10)0×(10) = 1000

∣ 01 ⟩ ≡ ∣ 0 ⟩ ⊗ ∣ 1 ⟩ = ( 1 0 ) ⊗ ( 0 1 ) = ( 1 × ( 0 1 ) 0 × ( 0 1 ) ) = ( 0 1 0 0 ) ∣01⟩ \equiv ∣0⟩ \otimes ∣1⟩=
(10)
\otimes
(01)
=
\begin{pmatrix}1 \times \begin{pmatrix}0\\1\end{pmatrix}
\\0 \times
(01)
\end{pmatrix}=
(0100)
01≡∣01=(10)(01)= 1×(01)0×(01) = 0100

∣ 10 ⟩ ≡ ∣ 1 ⟩ ⊗ ∣ 0 ⟩ = ( 0 1 ) ⊗ ( 1 0 ) = ( 0 × ( 1 0 ) 1 × ( 1 0 ) ) = ( 0 0 1 0 ) ∣10⟩ \equiv ∣1⟩ \otimes ∣0⟩=
(01)
\otimes
(10)
=
\begin{pmatrix}0 \times \begin{pmatrix}1\\0\end{pmatrix}
\\1 \times
(10)
\end{pmatrix}=
(0010)
10≡∣10=(01)(10)= 0×(10)1×(10) = 0010

∣ 11 ⟩ ≡ ∣ 1 ⟩ ⊗ ∣ 1 ⟩ = ( 0 1 ) ⊗ ( 0 1 ) = ( 0 × ( 0 1 ) 1 × ( 0 1 ) ) = ( 0 0 0 1 ) ∣11⟩ \equiv ∣1⟩ \otimes ∣1⟩=
(01)
\otimes
(01)
=
\begin{pmatrix}0 \times \begin{pmatrix}0\\1\end{pmatrix}
\\1 \times
(01)
\end{pmatrix}=
(0001)
11≡∣11=(01)(01)= 0×(01)1×(01) = 0001

很显然,集合{ ∣00⟩,∣01⟩,∣10⟩,∣11⟩ }是四维向量空间的生成集合。

(2)量子比特测定
       对于给定的一个量子比特 ∣ ϕ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ ∣\phi ⟩=\alpha∣0⟩+\beta∣1⟩ ϕ=α0+β1,通过一个被称为测定或观测的过程,可以把一个量子比特的状态以概率幅(概率区域)的方式变换成经典比特信息,即 ∣ ϕ ⟩ ∣\phi ⟩ ϕ以概率 ∣ α ∣ 2 |\alpha|^2 α2取值bit0、以 ∣ β ∣ 2 |\beta|^2 β2取值bit1.特别当 α = 1 \alpha=1 α=1 ∣ ϕ ∣ |\phi| ϕ取值0的概率为1,当 β = 1 \beta=1 β=1 ∣ ϕ ∣ |\phi| ϕ取值1的概率为1。在这种情况下,量子比特的行为与bit完全一致。

(3)量子门
       在量子计算中,一些逻辑变换功能是通过对量子比特状态进行一系列的幺正变换来实现的。而在一定时间间隔内实现逻辑变换的量子装置称为量子门。
       量子门可以由作用于希尔伯特空间中的矩阵描述。 由于量子态可以叠加的物理特性,量子门对希尔伯特空间中量子状态的作用将同时作用于所有基态。
       描述逻辑门的矩阵 U U U都是幺正矩阵( U ∗ U = I U^*U=I UU=I U ∗ U^* U U U U的伴随矩阵, I I I是单位矩阵)。量子门按照其作用的量子位数目的不同分为一位门、二位门、三位门、多位门。
       量子信息输入到量子门、经过量子门的操作等价于量子信息与逻辑门矩阵 U U U的乘积。
①一位门
       常见一位门主要有量子非门( X X X)、Hadmard门( H H H)和相移门( Φ \Phi Φ)。在基失 { ∣ 0 ⟩ = ( 1 0 ) , ∣ 1 ⟩ = ( 0 1 ) }

{0=(10),1=(01)}
{0=(10),1=(01)}下,可以用矩阵语言来表示上面几个常见的典型一位量子门,如下表:

量子门名称功能矩阵表示输入输出
量子非门( X X X对一个量子位的态进行“非”变换 X = ∣ 0 ⟩ ⟨ 1 ∣ + ∣ 1 ⟩ ⟨ 0 ∣ = [ 0 1 1 0 ] X=∣0⟩⟨1∣+∣1⟩⟨0∣=
[0110]
X=∣01+10∣=[0110]
∣0⟩
∣1⟩
∣1⟩
∣0⟩
Hadmard门( H H H相当于将∣0⟩态顺时针旋转 4 5 。 45^。 45
,将∣1⟩态逆时针旋转 4 5 。 45^。 45
H = 1 2 [ 1 1 1 − 1 ] H= \frac{1}{\sqrt{2}}
[1111]
H=2 1[1111]
∣0⟩
∣1⟩
1 2 ∣ 0 ⟩ + 1 2 ∣ 1 ⟩ \frac{1}{\sqrt{2}}∣0⟩+\frac{1}{\sqrt{2}}∣1⟩ 2 10+2 11
1 2 ∣ 0 ⟩ − 1 2 ∣ 1 ⟩ \frac{1}{\sqrt{2}}∣0⟩-\frac{1}{\sqrt{2}}∣1⟩ 2 102 11
相移门( Φ \Phi Φ使∣x⟩旋转一个角度 Φ = [ 1 0 0 e i ϕ ] \Phi=
[100eiϕ]
Φ=[100eiϕ]
∣0⟩
∣1⟩
∣0⟩
e i ϕ ∣ 1 ⟩ e^{i\phi}∣1⟩ eiϕ1

②二位门
       量子“异或”门是最常用的二位门(二比特量子门)之一,其中的两个量子位分别为控制位∣x⟩与目标位∣y⟩。其特征在于:控制位∣x⟩不随门的操作而改变,当控制位∣x⟩为∣0⟩时,它不改变目标位∣y⟩;当控制位∣x⟩为∣1⟩时,它将翻转目标位∣y⟩,所以量子异或门又可称为量子受控非门。在两个量子位的基失下,用矩阵表示为:
C n o t = ( 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 ) C_{not}=

(1000010000010010)
Cnot= 1000010000010010
       两个量子位信息输入到二位门,量子信息与逻辑门矩阵 C n o t C_{not} Cnot的乘积,量子态转换关系为 ∣ 00 ⟩ → ∣ 00 ⟩ ∣00⟩\rightarrow∣00⟩ 00→∣00 ∣ 01 ⟩ → ∣ 01 ⟩ ∣01⟩\rightarrow∣01⟩ 01→∣01 ∣ 10 ⟩ → ∣ 11 ⟩ ∣10⟩\rightarrow∣11⟩ 10→∣11 ∣ 11 ⟩ → ∣ 10 ⟩ ∣11⟩\rightarrow∣10⟩ 11→∣10。如下表:

输入输出
控制位∣x⟩目标位∣y⟩目标位输出
∣0⟩∣0⟩
∣1⟩
∣0⟩
∣1⟩
∣1⟩∣0⟩
∣1⟩
∣1⟩
∣0⟩
③三位门

       三位门中常用的是量子“与”门,它有三个输入端∣x⟩、∣y⟩、∣z⟩。两个输入量子位∣x⟩和∣y⟩(控制位)控制第三个量子位∣x⟩(目标位)的状态,两控制位∣x⟩和∣y⟩不随门操作而改变。当两控制位∣x⟩和∣y⟩同时为∣1⟩时目标位∣z⟩改变;否则,保持不变。用矩阵表示如下:

C C n o t = ( 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 ) {CC}_{not}=

(1000000001000000001000000001000000001000000001000000001000000001)
CCnot= 1000000001000000001000000001000000001000000001000000001000000001
       两个量子位信息输入到二位门,量子信息与逻辑门矩阵 C C n o t {CC}_{not} CCnot的乘积,量子态转换关系为: ∣ 000 ⟩ → ∣ 000 ⟩ ∣000⟩\rightarrow∣000⟩ 000→∣000 ∣ 001 ⟩ → ∣ 001 ⟩ ∣001⟩\rightarrow∣001⟩ 001→∣001 ∣ 010 ⟩ → ∣ 010 ⟩ ∣010⟩\rightarrow∣010⟩ 010→∣010 ∣ 011 ⟩ → ∣ 011 ⟩ ∣011⟩\rightarrow∣011⟩ 011→∣011 ∣ 100 ⟩ → ∣ 100 ⟩ ∣ 100⟩\rightarrow∣100⟩ 100→∣100 ∣ 101 ⟩ → ∣ 101 ⟩ ∣101⟩\rightarrow∣101⟩ 101→∣101 ∣ 110 ⟩ → ∣ 111 ⟩ ∣110⟩\rightarrow∣111⟩ 110→∣111 ∣ 111 ⟩ → ∣ 110 ⟩ ∣111⟩\rightarrow∣110⟩ 111→∣110。如下表:

输入输出
控制位∣x⟩控制位∣y⟩目标位∣z⟩目标位输出
∣0⟩∣0⟩∣0⟩∣0⟩
∣0⟩∣1⟩∣0⟩∣0⟩
∣1⟩∣0⟩∣0⟩∣0⟩
∣1⟩∣1⟩∣0⟩∣1⟩
∣0⟩∣0⟩∣1⟩∣1⟩
∣0⟩∣1⟩∣1⟩∣1⟩
∣1⟩∣0⟩∣1⟩∣1⟩
∣1⟩∣1⟩∣1⟩∣0⟩

(4)量子态特性
①量子态叠加性
②量子态纠缠性
③量子并行性
④量子态不可克隆性

二、量子进化算法

       量子进化算法(QEA)是将量子计算与进化计算相结合的一种崭新的优化算法。目前,量子进化算法的融合点主要集中在种群编码方式和进化策略的构造上,与传统的进化算法相比,它最大的优点是具有更好的保持种群多样性的能力。
       其种群编码方式的本质是利用量子计算的一些概念和理论,如量子位、量子叠加态等构造染色体编码,这种方式可以使用一个量子染色体同时表征多个状态的信息,隐含着强大的并行性,并且能够保持种群多样性。以当前最优个体的信息为引导,通过量子门作用和量子门更新来完成进化搜索。在量子进化算法中,个体用量子位的概率幅编码,利用基于量子门的量子位相位旋转实现个体进化,用量子非门实现个体变异以增加种群多样性。
       下面将介绍量子进化算法体系中的量子遗传算法,通过与传统进化算法进行比较,体会量子计算的特点和优势。

三、量子遗传算法及其在聚类分析中的应用

1.基本原理

       与传统的遗传算法一样,量子遗传算法中也包括个体种群的构造、适应度值的计算、个体的改变,以及种群的更新。而与传统遗传算法不同的是,量子遗传算法中的个体是包含多个量子位的量子染色体,具有叠加性、纠缠性等特性,一个量子染色体可呈现多个不同状态的叠加。量子染色体利用量子旋转门或量子非门等变异机制实现更新,并获得丰富的种群多样性。通过不断的迭代,每个量子位的叠加态将坍缩到一个确定的态,从而达到稳定,趋于收敛。量子遗传算法就是通过这样的方式,不断进行探索、进化,最后达到寻优的目的。

2.基本流程和代码实现(matlab)

聚类样品如下:
待聚类样品编号

(1)给定算法参数,包括种群的大小(popSize)、最大迭代次数(MaxIter)、聚类中心数(centerNum)、交叉概率、变异概率。

%参数:m_pattern,样品特征库;patternNum,样品数目
%返回值:m_pattern,样品特征库
%函数功能:按照遗传算法对全体样品进行聚类
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[m_pattern]=C_QGA(m_pattern,patternNum)
popSize=100;%种群大小
pm=0,05;%变异概率
%初始化种群结构
disType=DisSelDlg();%获得距离计算类型
[centerNum,MaxGeneration]=InputClassDlg();%获得类中心数和最大迭代次数
%计算二进制码长
flag=1;
num=1;
while flag
	if centerNum>2^num
		num=num+1;
	else
		flag=0;
	end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(2)种群初始化:
       初始化 N N N条染色体 P ( t ) = ( X 1 t , X 2 t , ⋯   , X N t ) P(t)=(X^t_1,X^t_2,\cdots ,X^t_N) P(t)=(X1t,X2t,,XNt),将每条染色体 X i t X^t_i Xit的每一个基因用二进制表示,每一个二进制位对应一个量子位,设每条染色体有 m m m个量子位, X i t = ( X i 1 t , X i 2 t , ⋯   , X i m t ) ( i = 1 , 2 , ⋯   , N ) X^t_i=(X^t_{i1},X^t_{i2},\cdots ,X^t_{im})(i=1,2,\cdots,N) Xit=(Xi1t,Xi2t,,Ximt)(i=1,2,,N)为一个长度为 m m m的二进制,有 m m m个观察角度 Q i t = ( ϕ i 1 t , ϕ i 2 t , ⋯   , ϕ i m t ) Q^t_i=(\phi^t_{i1},\phi^t_{i2},\cdots ,\phi^t_{im}) Qit=(ϕi1t,ϕi2t,,ϕimt),其值决定量子位的观测概率 ∣ α i t ∣ 2 |\alpha_i^t|^2 αit2 ∣ β i t ∣ 2 ( i = 1 , 2 , ⋯   , m ) |\beta_i^t|^2(i=1,2,\cdots,m) βit2(i=1,2,,m) ( α i β i ) = ( c o s ( ϕ ) s i n ( ϕ ) )

(αiβi)
=
(cos(ϕ)sin(ϕ))
(αiβi)=(cos(ϕ)sin(ϕ)),通过观察角度 Q ( t ) Q(t) Q(t)的状态来生成二进制解集 P ( t ) P(t) P(t)
       初始化使所有量子染色体的每个量子位的观察角度 ϕ i j 0 = π 4 ( i = 1 , 2 , ⋯   , N , j = 1 , 2 , ⋯   , m ) \phi^0_{ij}={{\pi}\over{4}}(i=1,2,\cdots,N,j=1,2,\cdots,m) ϕij0=4π(i=1,2,,N,j=1,2,,m)
       概率幅初始化为 1 2 {1}\over{\sqrt{2}} 2 1,表示在 t = 0 t=0 t=0代,每条染色体以相同的概率 1 2 m {1}\over{\sqrt{2^m}} 2m 1处于所有可能状态的线性叠加态之中,即 ∣ ψ q j 0 ⟩ = ∑ k = 1 2 m 1 2 m ∣ s k ⟩ ∣\psi^0_{qj}⟩=\sum_{k=1}^{2m}{{1}\over{\sqrt{2^m}}}∣s_k⟩ ψqj0=k=12m2m 1sk。其中 s k s_k sk是由二进制串 ( x 1 , x 2 , ⋯   , x m ) (x_1,x_2,\cdots,x_m) (x1,x2,,xm)描述的第 k k k个状态。
       根据上面的例子可以构造如下表所示的染色体:

基因位1234
量子位12345678
基因值string3(类)2(类)4(类)1(类)
量子位值p10011100
相位角(初始值)φπ/4π/4π/4π/4π/4π/4π/4π/4
概率幅αi(q(1,:))
概率幅βi(q(1,:))
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
Cos(φ)
Sin(φ)
%初始化染色体
for i=1:popSize
	m_pop(i).string=zeros(1,patternNum);%个体位串
	m_pop(i).p=zeros(1,patternNum*num);%用于存储二进制编码
	m_pop(i).fai=pi/4*ones(1,patternNum*num);%相位角
	m_pop(i).q=zeros(2,patternNum*num);%余弦值和正弦值
	m_pop(i).fitness=0;%适应度
end
for i=1:popSize
	for j=1:patternNum*num
		m_pop(i).q(1,j)=cos(m_pop(i).fai(1,j));%q(1,:)为cos值
		m_pop(i).q(2,j)=sin(m_pop(i).fai(1,j));%q(2,:)为sin值
	end
end
%初始化全局最优个体
cBest=m_pop(1);%其中cBest的index属性记录最优个体出现在第几代

%由随机初始化的相位计算该位是0和1的概率,即相位的余弦值和正弦值
for i=1:popSize
	for j=1:pattern*num
		r=rand;
		if r>0.5 %初始化时概率都是0.5,依据概率初始化群体
			m_pop(i).p(1,j)=1;
		else
			m_pop(i).p(1,j)=0;
		end
	end
	%解码得到类别
	for j=1:patternNum
		s=0;
		for k=1:num
			s=s+m_pop(i).p(1,(j-1)*num+k)*2^(num-k);
		end
		m_pop(i).string(1,j)=s+1;
		if m_pop(i).string(1,j)>centerNum
			m_pop(i).string(1,j)=ceil(rand*centerNum);
		end
	end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数名称:FindBest()
%参数:m_pop,种群结构;popSize,种群规模;
%cBest,最优个体;cWorst,最差个体;generation,当前代数
%cBest,最优个体;cWorst,最差个体
%函数功能:寻找最优个体,更新总的最优个体
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[cBest]=FindBest(m_pop,popSize,cBest,generation)
%初始化局部最优个体
best=m_pop(1);
for i=2:popSize
	if(m_pop(i).fitness>best.fitness)
		best=m_pop(i);
	end
end
if(generation==1)
	cBest=best;
	cBest.index=1;
else
	if(best.fitness>cBest.fitness)
		cBest=best;
		cBest.index=generation;
	end
end

	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

(3)计算适应度
       适应度值代表每个个体优劣的程度。其计算过程类似于遗传算法中适应度的计算方法。计算公式如下:
C i = 1 n i ∑ k = 1 n i X k ( i ) C_i={{1}\over{n_i}}\sum_{k=1}^{n_i}{X_k^{(i)}} Ci=ni1k=1niXk(i)
m _ p o p ( i ) . f i t n e s s = ∑ i = 1 c e n t e r N u m ∑ j = 1 n i ∥ X j ( i ) − C i ∥ 2 = ∑ i = 1 c e n t e r N u m D i m\_pop(i).fitness=\sum_{i=1}^{centerNum}{\sum_{j=1}^{n_i}{\parallel X_j^{(i)}-C_i\parallel^2 }} = \sum_{i=1}^{centerNum}{D_i} m_pop(i).fitness=i=1centerNumj=1niXj(i)Ci2=i=1centerNumDi
m _ p o p ( i ) . f i t n e s s = 1 m _ p o p ( i ) . f i t n e s s + d m\_pop(i).fitness={{1}\over{m\_pop(i).fitness+d}} m_pop(i).fitness=m_pop(i).fitness+d1
       centerNum为聚类类别总数, n i n_i ni为属于第 i i i类的样品总数, X j ( i ) X_j^{(i)} Xj(i)为属于第 i i i个类的第 j j j个样品的特征值, C i C_i Ci为第 i i i个类中心, d d d表示的是某一类中包含一个样品的类数。
        m _ p o p ( i ) . f i t n e s s m\_pop(i).fitness m_pop(i).fitness越大,说明这种分类方法的误差越小,即其适应度值越大。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数名称:CalFitness()
%参数:m_pop,种群结构;popSize,种群规模;patternNum,样品数目;
%centerNum,类中心数;m_pattern,样品特征库;disType,距离类型
%返回值:m_pop,种群结构
%函数功能:计算个体的评估值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[m_pop]=CalFitness(m_pop,popSize,patternNum,centerNum,m_pattern,disType)
global Nwidth;%特征矩阵的宽度,即样品特征7*7矩阵
for i=1:popSize %初始化聚类中心
	for j=1:centerNum
		m_center(j).index=i;
		m_center(j).feature=zeros(Nwidth,Nwidth);
		m_center(j).patternNum=0;
	end
	for j=1:patternNum  %计算聚类中心
		m_center(m_pop(i).string(1,j)).feature=m_center(m_pop(i).string(1,j)).feature+m_pattern(j).feature;
		m_center(m_pop(i).string(1,j)).patternNum=m_center(m_pop(i).string(1,j)).patternNum+1;
	end
	d=0;
	for j=1:centerNum
		if(m_center(j).patternNum~=0)  %计算每个类的中心,即Ci
			m_center(j).feature=m_center(j).feature/m_center(j).patternNum;
		else d=d+1;
		end
	end
	m_pop(i).fitness=0;
	
	for j=1:patternNum  %计算个体评估值
		m_pop(i).fitness=m_pop(i).fitness+GetDistance(m_center(m_pop(i).string(1,j)),m_pattern(j),disType)^2;
	end
	m_pop(i).fitness=1/(m_pop(i).fitness+d);
end		
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

(4)量子旋转门
       在量子遗传算法中,使用量子旋转门来实现量子染色体的变异操作。同时在角度旋转时考虑了最优个体信息,这样可以使种群更好趋于最优解,从而加快算法收敛。
       在0、1编码问题中,令 U ( Δ θ ) = [ c o s ( Δ θ ) − s i n ( Δ θ ) s i n ( Δ θ ) c o s ( Δ θ ) ] U(\Delta\theta)=

[cos(Δθ)sin(Δθ)sin(Δθ)cos(Δθ)]
U(Δθ)=[cos(Δθ)sin(Δθ)sin(Δθ)cos(Δθ)]表示量子旋转门,设 ϕ \phi ϕ为原量子位的相位角,旋转后的角度调整操作为: ( α i ′ β i ′ ) = ( c o s ( Δ θ ) − s i n ( Δ θ ) s i n ( Δ θ ) c o s ( Δ θ ) ) ( α i β i ) = ( c o s ( ϕ + Δ θ ) sin ⁡ ( ϕ + Δ θ ) ) , ( α i β i ) = ( c o s ( ϕ ) sin ⁡ ( ϕ ) )
(αiβi)
=
(cos(Δθ)sin(Δθ)sin(Δθ)cos(Δθ))
(αiβi)
=
(cos(ϕ+Δθ)sin(ϕ+Δθ))
(αiβi)
=
(cos(ϕ)sin(ϕ))
(αiβi)=(cos(Δθ)sin(Δθ)sin(Δθ)cos(Δθ))(αiβi)=(cos(ϕ+Δθ)sin(ϕ+Δθ))(αiβi)=(cos(ϕ)sin(ϕ))

旋转变异的角度 θ \theta θ可由下表得到。

旋转角度旋转角度符号s(αiβi )
xixibestf(x)≥f(xbest)Δθiαiβi > 0αiβi < 0αi = 0βi = 0
0000000
0000000
0100000
010.05π-1+1±10
100.01π-1+1±10
100.025π+1-10±1
110.025π+1-10±1
110.025π+1-10±1

        x i x_i xi表示当前量子染色体的第 i i i位;
        x i b e s t x_i^{best} xibest表示当前最优染色体的第 i i i位;
        f ( X ) f(X) f(X)表示适应度函数;
        Δ θ i \Delta\theta_i Δθi表示旋转角度的大小,控制算法收敛的速度;
        α i 、 β i \alpha_i、\beta_i αiβi表示当前染色体第 i i i位量子位的概率幅;
        s ( α i β i ) s(\alpha_i\beta_i) s(αiβi)表示旋转角度的方向,保证算法的收敛;
       如当 x i = 0 , x i b e s t = 1 , f ( X ) > f ( X i b e s t ) x_i=0,x_i^{best}=1,f(X)>f(X_i^{best}) xi=0xibest=1,f(X)>f(Xibest)时,为使当前解收敛到一个具有更高适应度的染色体,应增大当前解取0的概率,即要使 ∣ α ∣ 2 |\alpha|^2 α2变大,如果 ( α i β i ) (\alpha_i\beta_i) (αiβi)在第一、三象限, θ \theta θ应向顺时针旋转 0.05 π 0.05\pi 0.05π;如果 ( α i β i ) (\alpha_i\beta_i) (αiβi)在二、四象限, θ \theta θ应向逆时针旋转 0.05 π 0.05\pi 0.05π。如下图所示:
在这里插入图片描述

(5)量子非门变异
       为避免陷入早熟和局部极值,在量子旋转门的基础上进一步采用量子非门实现染色体的变异操作,这样能够保持种群多样性和避免选择压力。假设 [ α i β i ]

[αiβi]
[αiβi]为该染色体的第 i i i个量子位概率幅,使用量子非门实施变异操作的过程可描述为:
[ 0 1 1 0 ] [ α i β i ] = [ β i α i ]
[0110]
[αiβi]
=
[βiαi]
[0110][αiβi]=[βiαi]

c o s ( ϕ ) → s i n ( ϕ ) , s i n ( ϕ ) → c o s ( ϕ ) cos(\phi) \rightarrow sin(\phi),sin(\phi) \rightarrow cos(\phi) cos(ϕ)sin(ϕ),sin(ϕ)cos(ϕ)
c o s ( ϕ + π 2 ) → s i n ( ϕ ) , s i n ( ϕ + π 2 ) → c o s ( ϕ ) cos(\phi+{{\pi}\over{2}}) \rightarrow sin(\phi),sin(\phi+{{\pi}\over{2}}) \rightarrow cos(\phi) cos(ϕ+2π)sin(ϕ),sin(ϕ+2π)cos(ϕ)
       从式子中可以看出,量子非门实施的变异操作是量子位的两个概率幅互换,实质上还是使用量子旋转门,区别在于旋转角度是确定的,即是正向旋转 π 2 {\pi}\over{2} 2π,即 Δ θ = π 2 \Delta\theta={{\pi}\over{2}} Δθ=2π。由于改变了该量子比特态叠加的状态,使其由原来倾向于坍缩到状态“1”变为倾向于坍缩到状态“0”,或者相反,因此起到了变异的作用。

for i=1:popSize
	delta_site=0;
	for j=1:patternNum*num
		s=0;
		if m_pop(i).p(1,j)==0 && cBest.p(1,j)==0
			if m_pop(i).fitness<cBest.fitness
				delta_site=table(1,1);
			else
				delta_site=table(2,1);
			end
		elseif m_pop(i).p(1,j)==0 && cBest.p(1,j)==1
			if m_pop(i).fitness<cBest.fitness
				delta_site=table(3,1);
			else
				delta_site=table(4,1);
				if m_pop(i).q(1,j)*m_pop(i).q(2,j)>0
					s=table(4,2);
				elseif m_pop(i).q(1,j)*m_pop(i).q(2,j)>0
					s=table(4,3);
				elseif m_pop(i).q(1,j)==0
					s=table(4,4);
				else m_pop(i).q(2,j)==0
					s=table(4,5);
				end
			end
		end
		
		newpop=m_pop(i);
		newpop.fai(1,j)=newpop.fai(1,j)+s*delta_sita;
		if rand<pm
			newpop.fai(1,j)=newpop.fai(1,j)+pi/2;
		end
		newpop.q(1,j)=cos(newpop.fai(1,j));
		newpop.q(2,j)=sin(newpop.fai(1,j));
		m_pop(i).q=newpop.q;
		
		for 1:patternNum*num
			r=rand;
			if r>m_pop(i).q(1,j)*m_pop(i).q(1,j)
				m_pop(i).p(1,j)=1;
			else
				m_pop(i).p(1,j)=0;
			end
		end
		
		for j=1:patternNum
			s=0;
			for k=1:num
				s=s+m_pop(i).p(1,(j-1)*num+k)*2^(num-k);
			end
			m_pop(i).string(1,j)=s+1;
			if m_pop(i).string(1,j)>centerNum
				m_pop(i).string(1,j)=fix(rand*centerNum)+1;
			end
		end

		%对当前群体进行评估,计算个体评估值
		m_pop=CalFitness(m_pop,popSize,patternNum,centerNum,m_pattern,disType);
		%寻找最优个体,更新总的最优个体
		cBest=FindBest(m_pop,popSize,cBest,iter);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

(6)终止条件
经过多次迭代,算法逐渐收敛,若已经达到最大迭代次数,则退出循环,将总的最优个体的染色体编码,返回各个样品的类别号。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/429974
推荐阅读
相关标签
  

闽ICP备14008679号