1. 程式人生 > >【尋優演算法】量子遺傳演算法(QGA) 引數尋優的python實現

【尋優演算法】量子遺傳演算法(QGA) 引數尋優的python實現

【尋優演算法】量子遺傳演算法(QGA) 引數尋優的python實現


遺傳演算法用於模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,種群通過選擇、交叉和變異操作使染色體的十進位制數值逼近最優引數值。 遺傳演算法容易陷入區域性最優的陷阱
。量子遺傳演算法是將量子計算與遺傳演算法結合,引入量子編碼和量子旋轉門,增加染色體變化的可能性。

一、量子編碼

1、染色體量子編碼

遺傳演算法中染色體的取值採用二進位制編碼,只要編碼確定,染色體的取值就是確定的,後續的選擇、交叉和變異操作都是在已經確定的二進位制編碼的染色體上進行。為了增加染色體取值的變化,量子遺傳演算法引入量子編碼方法為染色體的取值進行編碼。
在量子編碼中,染色體每一個二進位制位被稱為量子位元,量子位元不是確定的0或1,而是0和1的疊加,一個量子位元的狀態可以取值0或1,其狀態表示為:

φ = α 0 + β
1 \left| \varphi \right\rangle = \alpha \left| 0 \right\rangle + \beta \left| 1 \right\rangle

其中 α 2 {\left| \alpha \right|^2} β 2 {\left| \beta \right|^2} 代表0和1出現的概率,初始染色體取值時,隨機選擇一個位於 a = ( 0 , 2 π ) a=\left( {0,2\pi } \right) 的角度,令 α = sin ( a ) \alpha = \sin \left( a \right) b = cos ( a ) b = \cos \left( a \right)

2、量子編碼轉換為二進位制編碼

如上所說,量子編碼表示染色體二進位制位為0或1的概率,但是具體操作還是要現將染色體量子編碼轉化為二進位制取值進而轉化為十進位制取值。生成一個位於 ( 0 , 1 ) \left( {0,1} \right) 的隨機數,如果該隨機數小於 α 2 {\left| \alpha \right|^2} ,則該二進位制位取值為1,否則取值0。

二、量子進化

1、全乾擾交叉

量子遺傳演算法中,交叉的操作物件是種群中所有染色體取值的位元位角度。交叉是為了增加染色體的變化,防止陷入區域性最優的陷阱【參考資料1】。全乾擾交叉不同於其它的交叉方法,種群中所有的染色體取值都參與交叉,進一步增加了染色體的變化。假設只有一個引數(一個染色體),種群數為5,染色體長度(染色位元位數)為5,則全乾擾交叉前後種群中染色體所有取值分別為:
全乾擾交叉前:

染色體取值在種群中的位置 第1位 第2位 第3位 第4位 第5位
1 A(1) A(2) A(3) A(4) A(5)
2 B(1) B(2) B(3) B(4) B(5)
3 C(1) C(2) C(3) C(4) C(5)
4 D(1) D(2) D(3) B(4) D(5)
5 E(1) E(2) E(3) E(4) E(5)

全乾擾交叉後:

染色體取值在種群中的位置 第1位 第2位 第3位 第4位 第5位
1 A(1) E(2) D(3) C(4) B(5)
2 B(1) A(2) E(3) D(4) C(5)
3 C(1) B(2) A(3) E(4) D(5)
4 D(1) C(2) B(3) A(4) E(5)
5 E(1) D(2) C(3) B(4) A(5)

2、量子變異

量子變異是通過量子旋轉門實現的,本質是通過改變種群中所有染色體取值的每一位量子位元的量子角度,使得染色體取值向更好的染色體靠攏。具體方法可參考【資料2】

三、QGA多引數尋優的python實現

完整程式碼及樣本地址:https://github.com/shiluqiang/QGA_python

1、訓練模型及待尋優引數

本博文選用的多引數機器學習模型為非線性SVM(參考資料【3】),模型的優化問題為:

min W , e 1 2 W 2 + C 2 i = 1 m e i 2 s . t . y i ( W φ ( x i ) + b ) 1 e i , i = 1 ,   , m e 0 , i = 1 ,   , m \begin{array}{l} \mathop {\min }\limits_{W,e} \frac{1}{2}{\left\| W \right\|^2} + \frac{C}{2}\sum\limits_{i = 1}^m {{e_i}^2} \\ s.t.{y_i}\left( {W \cdot \varphi ({x_i}) + b} \right) \ge 1 - {e_i},i = 1, \cdots ,m\\ e \ge 0,i = 1, \cdots ,m \end{array}

通過Lagrange乘數法並轉化為對偶問題,優化問題轉換為:

min α 1 2 i m j m α i α j y i y j K ( x i , x j ) i = 1 m α i s . t . i = 1 m α i y i = 0 0 α i C , i = 1 ,   , m \begin{array}{l} \mathop {\min }\limits_\alpha \frac{1}{2}\sum\limits_i^m {\sum\limits_j^m {{\alpha _i}{\alpha _j}{y^i}{y^j}K\left( {{x_i},{x_j}} \right) - \sum\limits_{i = 1}^m {{\alpha _i}} } } \\ s.t.\sum\limits_{i = 1}^m {{\alpha _i}{y^i} = 0} \\ 0 \le {\alpha _i} \le C,i = 1, \cdots ,m \end{array}

其中: K ( x i , x j ) = exp ( x i x j 2 2 σ 2 ) K\left( {{x_i},{x_j}} \right) = \exp \left( { - \frac{{{{\left\| {{x_i} - {x_j}} \right\|}^2}}}{{2{\sigma ^2}}}} \right)

非線性SVM有兩個引數:正則化引數 C C 和核引數 σ \sigma

2、QGA演算法的python程式碼

## 2. QGA演算法
class QGA(object):
###2.1 類初始化
    '''定義QGA'''
    def __init__(self,population_size,chromosome_num,chromosome_length,max_value,min_value,iter_num,deta):
        '''初始化類引數
        populati