量子遗传算法原理与MATLAB仿真程序
寫在前面:
1、其實這些智能算法的思想都差不多,只不過是各自搜尋方式、編碼方式、種群更新方式等不一樣而已。
量子遺傳算法是在遺傳算法的基礎上使用了一種新的編碼方式。
2、直接看前面介紹可能會覺得較難,先瀏覽概念任何根據案例走一遍就明白了。
3、遺傳算法及其他智能算法:
遺傳算法的簡介與應用 - 知乎寫在前面遺傳算法是通過大量備選解的 變換、迭代和變異,在解空間中并行動態地進行全局 搜索的最優化方法.由于遺傳算法具有比較完備的 數學模型和理論,在解決很多NP—Hard問題上具有 良好的性能. 1.因為我也是…https://zhuanlan.zhihu.com/p/49055485智能優化算法——粒子群算法原理與仿真程序 - 知乎寫在前面:粒子群算法很古老了,資料也很多,大部分尋優算法思想類似,本文稍作整理, 并在文末分別附上C++、Python、MATLAB程序,如果本文對你有所幫助,請點贊支持一下!這是遺傳算法的原理與程序: 子木:遺傳…https://zhuanlan.zhihu.com/p/460734234
4、如果本文對你有所幫助,請點贊支持一下!
原文鏈接:
量子遺傳算法原理與MATLAB仿真程序 - 知乎寫在前面:1、其實這些智能算法的思想都差不多,只不過是各自搜尋方式、編碼方式、種群更新方式等不一樣而已。 量子遺傳算法是在遺傳算法的基礎上使用了一種新的編碼方式。 2、直接看前面介紹可能會覺得較難,先瀏…https://zhuanlan.zhihu.com/p/462517360
一、量子遺傳算法概述
量子遺傳算法(quantum genetic algorithm,QGA)是量子計算與遺傳算法相結合的產物,是一種新發展起來的概率進化算法。
遺傳算法是處理復雜優化問題的一種方法,其基本思想是模擬生物進化的優勝劣汰規則與染色體的交換機制,通過選擇、交叉、變異三種基本操作尋找最優個體。由于GA不受問題性質、優化準則形式等因素的限制,僅用目標函數在概率引導下進行全局自適應搜索,能夠處理傳統優化方法難以解決的復雜問題,具有極高魯棒性和廣泛適用性,因而得到了廣泛應用并成為跨學科研究的熱點。但是,若選擇、交叉、變異的方式不當,GA會表現出迭代次數多、收斂速度慢、易陷入局部極值的現象。
量子計算中采用量子態作為基本的信息單元,利用量子態的疊加、糾纏和干涉等特性,通過量子并行計算可以解決經典計算中的NP問題。1994年Shor提出第一個量子算法,求解了大數質因子分解的經典計算難題,該算法可用于公開密鑰系統RSA;1996年Grover 提出隨機數據庫搜索的量子算法,在量子計算機上可實現對未加整理的數據庫量級的加速搜索。量子計算正以其獨特的計算性能迅速成為研究的熱點。
量子遺傳算法就是基于量子計算原理的一種遺傳算法。將量子的態矢量表達引入遺傳編碼,利用量子邏輯門實現染色體的演化,達到了比常規遺傳算法更好的效果。
量子遺傳算法建立在量子的態矢量表示的基礎之上,將量子比特的幾率幅表示應用于染色體的編碼,使得一條染色體可以表達多個態的疊加,并利用量子邏輯門實現染色體的更新操作,從而實現了目標的優化求解。
二、量子染色體關鍵概念
2.1 量子比特編碼
(該部分了解即可,看完全文再回來看即知為什么稱為量子遺傳算法)
在量子計算機中,充當信息存儲單元的物理介質是一個雙態量子系統,稱為量子比特。量子比特與經典位不同就在于它可以同時處在兩個量子態的疊加態中,比如:
是兩個幅常數,滿足
其中, 和分別表示自旋向下和自旋向上態。所以一個量子比特可同時包含態 和的信息。
在量子遺傳算法中,采用量子比特存儲和表達一個基因。該基因可以為“0”態或“1”態,或它們的任意疊加態。即該基因所表達的不再是某一確定的信息,而是包含所有可能的信息,對該基因的任一操作也會同時作用于所有可能的信息。
采用量子比特編碼使得一個染色體可以同時表達多個態的疊加,使得量子遺傳算法比經典遺傳算法擁有更好的多樣性特征。采用量子比特編碼也可以獲得較好的收斂性,隨著 或 趨于0或1,量子比特編碼的染色體將收斂到一個單一態。
2.2 量子門更新
(量子遺傳算法中的量子門更新的作用可理解為遺傳算法中的變異或交叉操作)
量子門作為演化操作的執行機構,可根據具體問題進行選擇,目前已有的量子門有很多種,根據量子遺傳算法的計算特點,選擇量子旋轉門較為合適。量子旋轉門的調整操作為:
其更新過程如下:
其中,和 代表染色體第i個量子比特旋轉門更新前后的概率幅;為旋轉角,它的大小和符號由事先設計的調整策略確定。
于是可以得出和 分別為:
所以
可以看出變換之后 的值仍為1。
三、量子遺傳算法案例分析
3.1 問題描述
對于復雜二元函數求最值
該函數圖像為:
?二元函數圖像
該圖像程序為:
close all;clear;clc; t1=-3:0.08:12.1; t2=4.1:0.08:5.8; x=t1; y=t2; [X,Y] = meshgrid(x,y); Z=X.*sin(4.*pi.*X)+Y.*sin(20.*pi.*Y); mesh(X,Y,Z);從圖可以看出,該非線性函數在給定范圍內分布著許多局部極值,通常的尋優算法極易陷入局部極值或在各局部極值間振蕩,比較適合于驗證量子遺傳算法的性能。
3.2 解題思路及步驟
1、量子遺傳算法流程
量子遺傳算法的流程如下:
(1)初始化種群,隨機生成n個以量子比特為編碼的染色體;
(2)對初始種群中的每個個體進行一次測量,得到對應的確定解;
(3)對各確定解進行適應度評估;
(4)記錄最優個體和對應的適應度;
(5)判斷計算過程是否可以結束,若滿足結束條件則退出,否則繼續計算;
(6)對種群中的每個個體實施一次測量,得到相應的確定解;
(7)對各確定解進行適應度評估;
(8)利用量子旋轉門對個體實施調整,得到新的種群 ;
(9)記錄最優個體和對應的適應度;
(10)將迭代次數t加1,返回步驟(5)。
對應的流程圖如圖所示。
量子遺傳算法求解流程框圖
算法步驟(1)是初始化種群,種群中全部染色體的所有基因 都被初始化為 ,這意味著一個染色體所表達的是其全部可能狀態的等概率疊加:
其中, 為該染色體的第k種狀態,表現形式為一長度為m的二進制串,的值為0或者1。
算法的步驟(2)是對初始種群中的個體進行一次測量,以獲得一組確定的解 ,其中, 為第t代種群中第j個解(第j個個體的測量值),表現形式為長度為m的二進制串,其中每一位為0或1,是根據量子比特的概率( 或 ,i=1,2,…,m)選擇得到的。測量過程為,隨機產生一個[0,1]區間的數,若它大于概率幅的平方,則測量結果取值1,否則取值0。然后,對這一組解進行適應度評估,記錄下最佳適應度個體作為下一步演化的目標值。
隨后,算法進入循環迭代階段,隨著迭代的進行,種群的解逐漸向最優解收斂。在每一次迭代中,首先對種群進行測量,以獲得一組確定解 ,然后計算每個解的適應度值,再根據當前的演化目標和事先確定的調整策略,利用量子旋轉門對種群中的個體進行調整,獲得更新后的種群,記錄下當前的最優解,并與當前的目標值進行比較,如果大于當前目標值,則以新的最優解作為下一次迭代的目標值,否則保持當前的目標值不變。
2、量子遺傳算法實現
(1)量子比特編碼
采用遺傳算法中的二進制編碼,對存在多態的問題進行量子比特編碼,如兩態用一個量子比特進行編碼,四態用兩個量子比特進行編碼。該方法的優點是通用性好,且實現簡單。采用多量子比特編碼m個參數的基因如下:
其中, 代表第t代,第j個個體的染色體;k為編碼每一個基因的量子比特數;m為染色體的基因個數。
將種群各個個體的量子比特編碼 都初始化為 ,這意味著一個染色體所表達的全部可能狀態是等概率的。
(2)量子旋轉門
量子遺傳算法中,旋轉門是最終實現演化操作的執行機構。這里使用一種通用的、與問題無關的調整策略,如表所示。
?旋轉角選擇策略
其中,為當前染色體的第i位; 為當前的最優染色體的第i位;為適應度函數; 為旋轉角方向;為旋轉角度大小,其值根據表中所列的選擇策略確定。該調整策略是將個體 當前的測量值的適應度 與該種群當前最優個體的適應度值 進行比較,如果 ,則調整中相應位量子比特,使得幾率幅對向著有利于出現的方向演化;反之,如果 ,則調整中相應位量子比特,使得幾率幅對向著有利于出現的方向演化。
3.3 MATLAB程序實現
1、種群初始化
種群初始化函數為InitPop,其作用是產生初始種群的量子比特編碼矩陣chrom。
function chrom=InitPop(M,N) %% 初始化種群-量子比特編碼 % M:為種群大小×2,(α和β) % N:為量子比特編碼長度 for i=1:Mfor j=1:Nchrom(i,j)=1/sqrt(2);end end2、測量函數
對種群實施一次測量,得到二進制編碼,函數名為collapse。
function binary=collapse(chrom) %% 對種群實施一次測量 得到二進制編碼 % 輸入chrom :為量子比特編碼 % 輸出binary:二進制編碼 [M,N]=size(chrom); %得到種群大小 和編碼長度 M=M/2; % 種群大小 binary=zeros(M,N); %二進制編碼大小初始化 for i=1:Mfor j=1:Npick=rand; %產生【0,1】隨機數if pick>(chrom(2.*i-1,j)^2) % 隨機數大于α的平方binary(i,j)=1;elsebinary(i,j)=0;endend end3、量子旋轉門函數
旋轉門是最終實現演化操作的執行機構,量子旋轉門函數為Qgate,代碼如下:
function chrom=Qgate(chrom,fitness,best,binary) %% 量子旋轉門調整策略 % 輸入 chrom:更新前的量子比特編碼 % fitness:適應度值 % best:當前種群中最優個體 % binary:二進制編碼 % 輸出 chrom:更新后的量子比特編碼 sizepop=size(chrom,1)/2; lenchrom=size(binary,2); for i=1:sizepopfor j=1:lenchromA=chrom(2*i-1,j); % αB=chrom(2*i,j); % βx=binary(i,j);b=best.binary(j);if ((x==0)&(b==0))||((x==1)&(b==1))delta=0; % delta為旋轉角的大小s=0; % s為旋轉角的符號,即旋轉方向elseif (x==0)&(b==1)&(fitness(i)<best.fitness)delta=0.01*pi;if A*B>0s=1;elseif A*B<0s=-1;elseif A==0s=0;elseif B==0s=sign(randn);endelseif (x==0)&(b==1)&(fitness(i)>=best.fitness)delta=0.01*pi;if A*B>0s=-1;elseif A*B<0s=1;elseif A==0s=sign(randn);elseif B==0s=0;endelseif (x==1)&(b==0)&(fitness(i)<best.fitness)delta=0.01*pi;if A*B>0s=-1;elseif A*B<0s=1;elseif A==0s=sign(randn);elseif B==0s=0;endelseif (x==1)&(b==0)&(fitness(i)>=best.fitness)delta=0.01*pi;if A*B>0s=1;elseif A*B<0s=-1;elseif A==0s=0;elseif B==0s=sign(randn);endende=s*delta; % e為旋轉角U=[cos(e) -sin(e);sin(e) cos(e)]; % 量子旋轉門y=U*[A B]'; % y為更新后的量子位chrom(2*i-1,j)=y(1);chrom(2*i,j)=y(2);end end4、適應度函數
這里以求解最大值問題為例進行說明。如果是求解最小值問題,可以將之轉變成求最大值問題(加個負號即可),目標值越大的個體,其適應度值也應該越大,所以可以直接將所優化的目標函數作為適應度函數。
適應度主函數FitnessFunction的代碼如下:
function [fitness,X]=FitnessFunction(binary,lenchrom) %% 適應度函數 % 輸入 binary:二進制編碼 % lenchrom:各變量的二進制位數 % 輸出 fitness:適應度 % X:十進制數(待優化參數) sizepop=size(binary,1); fitness=zeros(1,sizepop); num=size(lenchrom,2); X=zeros(sizepop,num); for i=1:sizepop[fitness(i),X(i,:)]=Objfunction(binary(i,:),lenchrom); % 使用目標函數計算適應度 end其中,函數Objfunction是待優化的目標函數,這里以前面提到的二元函數為例進行說明。函數Objfunction的代碼:
function [Y,X]=Objfunction(x,lenchrom) %% 目標函數 % 輸入 x:二進制編碼 % lenchrom:各變量的二進制位數 % 輸出 Y:目標值 % X:十進制數 bound=[-3.0 12.1;4.1 5.8]; % 函數自變量的范圍 %% 將binary數組轉化成十進制數組 X=bin2decFun(x,lenchrom,bound); %% 計算適應度-函數值 Y=sin(4*pi*X(1))*X(1)+sin(20*pi*X(2))*X(2);其中,函數bin2decFun是將二進制編碼轉換成十進制數。
5、量子遺傳算法主函數
量子遺傳算法主函數代碼如下:
clc; clear all; close all; %----------------參數設置----------------------- MAXGEN=200; % 最大遺傳代數 sizepop=40; % 種群大小 lenchrom=[20 20]; % 每個變量的二進制長度 trace=zeros(1,MAXGEN); %-------------------------------------------------------------------------- best=struct('fitness',0,'X',[],'binary',[],'chrom',[]); % 最佳個體 記錄其適應度值、十進制值、二進制編碼、量子比特編碼 %% 初始化種群 chrom=InitPop(sizepop*2,sum(lenchrom)); %% 對種群實施一次測量 得到二進制編碼 binary=collapse(chrom); %% 求種群個體的適應度值,和對應的十進制值 [fitness,X]=FitnessFunction(binary,lenchrom); % 使用目標函數計算適應度 %% 記錄最佳個體到best [best.fitness bestindex]=max(fitness); % 找出最大值 best.binary=binary(bestindex,:); best.chrom=chrom([2*bestindex-1:2*bestindex],:); best.X=X(bestindex,:); trace(1)=best.fitness; fprintf('%d\n',1) %% 進化 for gen=2:MAXGENfprintf('%d\n',gen) %提示進化代數%% 對種群實施一次測量binary=collapse(chrom);%% 計算適應度[fitness,X]=FitnessFunction(binary,lenchrom);%% 量子旋轉門chrom=Qgate(chrom,fitness,best,binary);[newbestfitness,newbestindex]=max(fitness); % 找到最佳值% 記錄最佳個體到bestif newbestfitness>best.fitnessbest.fitness=newbestfitness;best.binary=binary(newbestindex,:);best.chrom=chrom([2*newbestindex-1:2*newbestindex],:);best.X=X(newbestindex,:);endtrace(gen)=best.fitness; end%% 畫進化曲線 plot(1:MAXGEN,trace); title('進化過程'); xlabel('進化代數'); ylabel('每代的最佳適應度');%% 顯示優化結果 disp(['最優解X:',num2str(best.X)]) disp(['最大值Y:',num2str(best.fitness)]);6、結果分析
輸出優化結果:
最優解×:11.62555.72504
最大值Y:17.3503
量子遺傳算法優化200代得到的進化過程如圖所示。
?
量子遺傳算法進化過程圖
本例是針對前面所描述的案例進行編寫,用戶可以根據自己的實際問題修改函數Objfunction(待優化的問題也并不局限在函數優化,可以是一個復雜的運算過程),再簡單修改下主函數中的相應變量設置即可。
四、量子遺傳算法的拓展思路
前面使用的是未改進的量子遺傳算法,該算法可以做一些改進:
(1)前面使用的是固定旋轉角策略,可以根據進化進程動態調整量子門的旋轉角大小。算法運行初期設置較大的旋轉角,隨著進化代數的增加逐漸減小旋轉角。調整策略是對個體進行測量,評估其適應度 ,與保留的最優個體的適應度值進行比較,根據比較結果調整中相應位量子比特,使得 朝著有利于最優確定解的方向進化。
(2)加入量子交叉操作。量子遺傳算法中最能體現個體結構信息的是其進化目標,即個體當前最優確定解以及對應的適應度值,因此,可以考慮互換個體的進化目標以實現個體間信息的互換,從而實現量子交叉的目的。其基本操作就是在個體之間暫時交換最優確定解和最優適應度值,個體接受交叉操作后,它的進化方向將受到其他個體的影響,從而獲取新的進化信息。
(3)加入量子變異操作。量子變異的作用是輕微地打亂某個個體當前的進化方向,以防止該個體的進化陷入局部最優。量子變異通過操作染色體編碼實現,互換量子比特概率幅的值,可將個體的進化方向徹底反轉。量子變異操作采用單點變異和多點變異相結合的方式,以增強種群中基因的多樣性。
(4)加入量子災變。當算法經歷數代穩定后,最優個體保持穩定時,算法可能陷入了局部最優解,此時采取量子災變操作,可使其擺脫局部最優解。具體方法是,將種群中部分個體施加大的擾動,重新隨機生成部分個體。
五、參考文獻
本文主要參考了《MATLAB智能算法三十個案例分析》!
[1]楊俊安,莊鎮泉。量子遺傳算法研究現狀[J].計算機科學,2003(11):13-15,43.
[2]曾成,趙錫均,改進量子遺傳算法在PID參數整定中應用[J].電力自動化設備,2009,29(10):125-127,139.
[3]楊淑媛,焦李成,劉芳。量子進化算法[J].工程數學學報,2006,23(02):235-246.
[4]周傳華,錢鋒。改進量子遺傳算法及其應用[J].計算機應用,2008,28(02):286-288.
[5]袁書卿,張葛祥。一種改進的遺傳量子算法及其應用[J].計算機應用與軟件,2003(10):1-2,14.
如果本文對你有所幫助,請點贊支持一下!
總結
以上是生活随笔為你收集整理的量子遗传算法原理与MATLAB仿真程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVM一些细节说明
- 下一篇: 基于FPGA的AM信号调制与解调详细步骤