

matlab代码及该函数的图形如下。
- x = linspace(0, 12.1, 200);
- y = linspace(4.1, 5.8, 200);
- [x, y] = meshgrid(x,y);
- f = 21.5+x.*sin(4*pi*x)+y.*sin(20*pi*y);
-
- figure;
- surf(x,y,f);
- colormap(gca, 'jet')
- xlabel('x');
- ylabel('y');
- zlabel('f(x,y)');
- title('函数图像')





- function chrom=InitPop(M,N)
- %% 初始化种群-量子比特编码
- % M:为种群大小×2,(α和β)
- % N:为量子比特编码长度
- for i=1:M
- for j=1:N
- chrom(i,j)=1/sqrt(2);
- end
- end
- 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
- 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)<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
- 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)<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)>=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
- 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
- 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);
- 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))';
- 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)]);
-