vrp量子遗传matlab,基于量子遗传的函数寻优算法MATLAB实现

量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。

量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。

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))';

结果:

84383c3e87c4af5f04d28e36512517f7.png

参考文献:

史峰. MATLAB智能算法30个案例分析[M]. 北京航空航天大学出版社, 2011.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值