遗传算法优化程序

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

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;

%% 画进化曲线

plot(1:MAXGEN,trace);

title('进化过程');

xlabel('进化代数');

ylabel('每代的最佳适应度');

%% 显示优化结果

disp(['最优解X:',num2str(best.X)])

disp(['最大值Y:',num2str(best.fitness)]);

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

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

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

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

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

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;

%% 画进化曲线

plot(1:MAXGEN,trace);

title('进化过程');

xlabel('进化代数');

ylabel('每代的最佳适应度');

%% 显示优化结果

disp(['最优解X:',num2str(best.X)])

disp(['最大值Y:',num2str(best.fitness)]);

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

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

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

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

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 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 [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

%


相关内容

  • 惩罚函数法在遗传算法处理约束问题中的应用
  • 第24卷 第2期2002年2月 武 汉 理 工 大 学 学 报 JOURNAL OF WUHAN UNIVERSITY OF TECHNOLOGY V o l. 24 No. 2 Feb. 2002 文章编号:1671-4431(2002) 02-0056-04 惩罚函数法在遗传算法处理约束问题中的 ...

  • 遗传算法的发展历程
  • 遗传算法的发展历程 遗传算法(Genetic Algorithm, GA) 是近年来迅速发展起来的一种全新的随机搜索与优化算法, 其基本思想是基于Darw in的进化论和Mendel 的遗传学说.该算法由密执安大学教授Holland 及其学生于1975年创建.此后,遗传算法的研究引起了国内外学者的关 ...

  • Matlab遗传算法工具箱的应用
  • ^工●砷化聩件技m0.I.Automation2005年第24卷第6期Softwwe1khnjque2005.VbI.24.No.6文章蚺号l10D6一],76(2D05)06一0115一02 Matlab遗传算法工具箱的应用 曾日波 (江西财经大学电子学院,江西南昌330013) 摘要:Matla ...

  • 传统多目标优化方法和多目标遗传算法的比较综述
  • 2010年第32卷第3期第48页 电气传动自动化 ELECTRlCDRIVE V01.32,No.3 AUT()MATIoN2010.32(3):48-50 传统多目标优化方法和多目标遗传算法的比较综述 马小妹L2,李宇龙3,严浪3 (1.西安电子科技大学计算机学院.陕西西安710071:2.天水师 ...

  • 数学建模十大经典算法
  • 1.蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,是比赛时必用的方法) 2.数据拟合.参数估计.插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab 作为工具) 3.线性规划. ...

  • 遗传算法与易算算法
  • 一.引    言 从伏羲画卦到<连山>易的出现,即有象的观念,数已开始萌芽,数与筮联系即有筮数,主要用于占卜.春秋时期,"象"和"数"同时出现在<管子·七法>篇中:"则,象,法,化,决塞,心术,计数."但象数在春秋 ...

  • 基于混合遗传算法的宽带阶梯阻抗变换器的优化设计
  • 基于混合遗传算法的宽带阶梯阻抗变换器的优 化设计* 马国田 梁昌洪 摘要 提出了一种将标准遗传算法和确定性方法相结合的混合遗传算法,并应用该方法对相对带宽为100%的宽带阶梯阻抗变换器进行优化设计,克服了标准遗传算法效率太低及确定性方法易收敛于局部极小点的缺点.分别对负载阻抗为纯实数和复数的两种情况 ...

  • 模拟退火与遗传算法
  • 在工程实践中,经常会接触到一些比较"新颖"的算法或理论,比如模拟退火,遗传算法,禁忌搜索,神经网络等.这些算法或理论都有一些共同的特性(比如模拟自然过-程),通称为"智能算法".它们在解决一些复杂的工程问题时大有用武之地. 这些算法都有什么含义?首先给出个局部 ...

  • 基于遗传算法的装配线平衡_宋华明
  • 第20卷第1期(总第109期) 系 统 工 程 Vol.20,No.1 2002年1月 SystemsEngineering Jan.,2002 文章编号:1001-4098(2002)01-0087-05 基于遗传算法的装配线平衡 宋华明,韩玉启 (南京理工大学经济管理学院,江苏南京 210094 ...

  • 遗传算法实例
  • 遗传算法实例 % 下面举例说明遗传算法 % % 求下列函数的最大值 % % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] % % 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 . % % 将变 ...