量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。
量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。
Matlab代码:
①QuantumMain.m
MATLAB
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:MAXGEN
fprintf('%d\n',gen) %提示进化代数
%% 对种群实施一次测量
binary=collapse(chrom);
%% 计算适应度
[fitness,X]=FitnessFunction(binary,lenchrom);
%% 量子旋转门
chrom=Qgate(chrom,fitness,best,binary);
[newbestfitness,newbestindex]=max(fitness); % 找到最佳值
% 记录最佳个体到best
if newbestfitness>best.fitness
best.fitness=newbestfitness;
best.binary=binary(newbestindex,:);
best.chrom=chrom([2*newbestindex-1:2*newbestindex],:);
best.X=X(newbestindex,:);
end
trace(gen)=best.fitness;
end
%% 画进化曲线
plot(1:MAXGEN,trace);
title('进化过程');
xlabel('进化代数');
ylabel('每代的最佳适应度');
%% 显示优化结果
disp(['最优解X:',num2str(best.X)])
disp(['最大值Y:',num2str(best.fitness)]);
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
clc;
clearall;
closeall;
%----------------参数设置-----------------------
MAXGEN=200;% 最大遗传代数
sizepop=40;% 种群大小
lenchrom=[2020];% 每个变量的二进制长度
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.fitnessbestindex]=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)
%%进化
forgen=2:MAXGEN
fprintf('%d\n',gen)%提示进化代数
%% 对种群实施一次测量
binary=collapse(chrom);
%% 计算适应度
[fitness,X]=FitnessFunction(binary,lenchrom);
%% 量子旋转门
chrom=Qgate(chrom,fitness,best,binary);
[newbestfitness,newbestindex]=max(fitness);% 找到最佳值
% 记录最佳个体到best
ifnewbestfitness>best.fitness
best.fitness=newbestfitness;
best.binary=binary(newbestindex,:);
best.chrom=chrom([2*newbestindex-1:2*newbestindex],:);
best.X=X(newbestindex,:);
end
trace(gen)=best.fitness;
end
%%画进化曲线
plot(1:MAXGEN,trace);
title('进化过程');
xlabel('进化代数');
ylabel('每代的最佳适应度');
%%显示优化结果
disp(['最优解X:',num2str(best.X)])
disp(['最大值Y:',num2str(best.fitness)]);
②Qgate.m
MATLAB
function chrom=Qgate(chrom,fitness,best,binary)
%% 量子旋转门调整策略
% 输入 chrom:更新前的量子比特编码
% fitness:适应度值
% best:当前种群中最优个体
% binary:二进制编码
% 输出 chrom:更新后的量子比特编码
sizepop=size(chrom,1)/2;
lenchrom=size(binary,2);
for i=1:sizepop
for j=1:lenchrom
A=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)
delta=0.01*pi;
if A*B>0
s=1;
elseif A*B<0
s=-1;
elseif A==0
s=0;
elseif B==0
s=sign(randn);
end
elseif (x==0)&(b==1)&(fitness(i)>=best.fitness)
delta=0.01*pi;
if A*B>0
s=-1;
elseif A*B<0
s=1;
elseif A==0
s=sign(randn);
elseif B==0
s=0;
end
elseif (x==1)&(b==0)&(fitness(i)
delta=0.01*pi;
if A*B>0
s=-1;
elseif A*B<0
s=1;
elseif A==0
s=sign(randn);
elseif B==0
s=0;
end
elseif (x==1)&(b==0)&(fitness(i)>=best.fitness)
delta=0.01*pi;
if A*B>0
s=1;
elseif A*B<0
s=-1;
elseif A==0
s=0;
elseif B==0
s=sign(randn);
end
end
e=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
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
66
67
68
69
70
71
72
73
74
75
76
functionchrom=Qgate(chrom,fitness,best,binary)
%%量子旋转门调整策略
%输入chrom:更新前的量子比特编码
%fitness:适应度值
%best:当前种群中最优个体
%binary:二进制编码
%输出chrom:更新后的量子比特编码
sizepop=size(chrom,1)/2;
lenchrom=size(binary,2);
fori=1:sizepop
forj=1:lenchrom
A=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)
delta=0.01*pi;
ifA*B>0
s=1;
elseifA*B<0
s=-1;
elseifA==0
s=0;
elseifB==0
s=sign(randn);
end
elseif(x==0)&(b==1)&(fitness(i)>=best.fitness)
delta=0.01*pi;
ifA*B>0
s=-1;
elseifA*B<0
s=1;
elseifA==0
s=sign(randn);
elseifB==0
s=0;
end
elseif(x==1)&(b==0)&(fitness(i)
delta=0.01*pi;
ifA*B>0
s=-1;
elseifA*B<0
s=1;
elseifA==0
s=sign(randn);
elseifB==0
s=0;
end
elseif(x==1)&(b==0)&(fitness(i)>=best.fitness)
delta=0.01*pi;
ifA*B>0
s=1;
elseifA*B<0
s=-1;
elseifA==0
s=0;
elseifB==0
s=sign(randn);
end
end
e=s*delta;% e为旋转角
U=[cos(e)-sin(e);sin(e)cos(e)];% 量子旋转门
y=U*[AB]';% y为更新后的量子位
chrom(2*i-1,j)=y(1);
chrom(2*i,j)=y(2);
end
end
③Objfunction.m
MATLAB
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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function[Y,X]=Objfunction(x,lenchrom)
%%目标函数
%输入x:二进制编码
%lenchrom:各变量的二进制位数
%输出Y:目标值
%X:十进制数
bound=[-3.012.1;4.15.8];% 函数自变量的范围
%%将binary数组转化成十进制数组
X=bin2decFun(x,lenchrom,bound);
%%计算适应度-函数值
Y=sin(4*pi*X(1))*X(1)+sin(20*pi*X(2))*X(2);
④InitPop.m
MATLAB
function chrom=InitPop(M,N)
%% 初始化种群-量子比特编码
% M:为种群大小×2,(α和β)
% N:为量子比特编码长度
for i=1:M
for j=1:N
chrom(i,j)=1/sqrt(2);
end
end
1
2
3
4
5
6
7
8
9
10
11
12
functionchrom=InitPop(M,N)
%%初始化种群-量子比特编码
%M:为种群大小×2,(α和β)
%N:为量子比特编码长度
fori=1:M
forj=1:N
chrom(i,j)=1/sqrt(2);
end
end
⑤FitnessFunction.m
MATLAB
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
fori=1:sizepop
[fitness(i),X(i,:)]=Objfunction(binary(i,:),lenchrom);% 使用目标函数计算适应度
end
⑥collapse.m
MATLAB
function binary=collapse(chrom)
%% 对种群实施一次测量 得到二进制编码
% 输入chrom :为量子比特编码
% 输出binary:二进制编码
[M,N]=size(chrom); %得到种群大小 和编码长度
M=M/2; % 种群大小
binary=zeros(M,N); %二进制编码大小初始化
for i=1:M
for j=1:N
pick=rand; %产生【0,1】随机数
if pick>(chrom(2.*i-1,j)^2) % 随机数大于α的平方
binary(i,j)=1;
else
binary(i,j)=0;
end
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
functionbinary=collapse(chrom)
%%对种群实施一次测量得到二进制编码
%输入chrom:为量子比特编码
%输出binary:二进制编码
[M,N]=size(chrom);%得到种群大小 和编码长度
M=M/2;% 种群大小
binary=zeros(M,N);%二进制编码大小初始化
fori=1:M
forj=1:N
pick=rand;%产生【0,1】随机数
ifpick>(chrom(2.*i-1,j)^2)% 随机数大于α的平方
binary(i,j)=1;
else
binary(i,j)=0;
end
end
end
⑦bin2decFun.m
MATLAB
function X=bin2decFun(x,lenchrom,bound)
%% 二进制转化成十进制
% 输入 x:二进制编码
% lenchrom:各变量的二进制位数
% bound:各变量的范围
% 输出 X:十进制数
M=length(lenchrom);
n=1;
X=zeros(1,M);
for i=1:M
for j=lenchrom(i)-1:-1:0
X(i)=X(i)+x(n).*2.^j;
n=n+1;
end
end
X=bound(:,1)'+X./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
functionX=bin2decFun(x,lenchrom,bound)
%%二进制转化成十进制
%输入x:二进制编码
%lenchrom:各变量的二进制位数
%bound:各变量的范围
%输出X:十进制数
M=length(lenchrom);
n=1;
X=zeros(1,M);
fori=1:M
forj=lenchrom(i)-1:-1:0
X(i)=X(i)+x(n).*2.^j;
n=n+1;
end
end
X=bound(:,1)'+X./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))';
结果:
参考文献:
史峰. MATLAB智能算法30个案例分析[M]. 北京航空航天大学出版社, 2011.