一种仿真量子遗传算法(matlab)
代码来自《量子信息处理技术及算法设计》–周日贵 著
运行环境 win10x64 matlab r2016b
QGA.m
clear
tic;
clf
clc
global popsize; % 种群大小
global lchrom; % 染色体长度
popsize = 10;
lchrom = 20;
oldpop = intipop; %产生初始种群,并把初始种群赋值给 oldpop
for i = 1:60
oldpop = cross(oldpop)
% 配对交叉,交叉是把两个父代个体的部分加以替换重组而生成新个体的操作。
% 遗传算法中起核心作用的就是交叉算子
mepop = measure(oldpop)
[incode, fitness] = objfunc(mepop);
% 对测量结果二进制数列进行解码,并计算适应度 incode 种群的解码数列
[max, c] = maxfit(fitness); %求种群中适应度最大的个体
if (i == 1 | max > f)
f = max;
L = mepop(c, :);
% mepop = measure(pop); measure 对种群进行塌缩测量,产生二进制串
x(i) = incode(c);
else
x(i) = x(i-1); % 进行变体
end
maxnum(i) = f;
newpop = generation(oldpop, f, L); % f为目标值,L为目标值对应的个体
old = newpop;
end
plot(maxnum, 'linewidth', 1.5),
title('量子遗传算法1:求最优解'),
xlabel('进化代数'),
ylabel('最优值');
for i = 1:5:25
maxnum(i)'
x(i),
end
intipop.m
function [ b ] = intipop( )
% QGA算法产生初始化种群
global popsize;
global lchrom;
b = zeros(popsize, lchrom, 2);
for i = 1:popsize
for j = 1:lchrom
for k = 1:2
b(i, j, k) = 1/sqrt(2);
end
end
end
end
cross.m
function [ newpop ] = cross( oldpop )
% cross
global popsize;
global lchrom;
newpop = zeros(popsize, lchrom, 2);
for j = 1:popsize
for i = 1:popsize
if i - j + 1 > 0
c = i - j + 1;
else
c = i - j + 1 + popsize;
end
for k = 1:2
newpop(i, j, k) = oldpop(c, j, k);
end
end
end
for j = (popsize + 1):lchrom
for i = 1:popsize
if i - j + 1 + popsize > 0
c = i - j + 1 + popsize;
else
c = i - j + 1 + 2*popsize;
end
for k = 1:2
newpop(i, j, k) = oldpop(c, j, k);
end
end
end
end
measure.m
function [ measurepop ] = measure( pop )
% measure(pop) 对种群进行塌缩测量,产生二进制串
global popsize;
global lchrom;
measurepop = zeros(popsize, lchrom);
for i = 1:popsize
for j = 1:lchrom
x = rand(); %随机产生一个0与1之间的一个数
if x > pop(i, j, 1)^2
measurepop(i, j) = 1;
else
measurepop(i, j) = 0;
end
end
end
end
objfunc.m
function [ incode, fitness ] = objfunc( mepop )
% 对测量结果二进制数列进行解码,并计算适应度
% incode:种群的解码数列
% fitness:种群的适应度
global popsize
global lchrom;
fitness = zeros(1, popsize);
incode = zeros(1, popsize);
% 解码
for i = 1:popsize
sum = 0;
for j = 1:lchrom
sum = sum + mepop(i,j)*2^(4-j);
end
incode(i) = sum;
end
%计算适应度
for i = 1:popsize
fitness(i) = exp(-0.001*incode(i))*(cos(0.8*incode(i)))^2;
end
end
maxfit.m
function [ max, c] = maxfit( fit )
% 求种群中适应度最大的个体
global popsize;
global lchrom;
max = 0;
for i = 1:popsize
if fit(i) > max
max = fit(i);
c = i;
end
end
end
generation.m
function [ newpop ] = generation( oldpop, f, L )
% f为目标值, L为目标值对应的个体
global popsize;
global lchrom;
%ang = angle(oldpop, f, L); % 这句在matlab r2016b上提示错误
ang = angle(oldpop);
for i = 1:popsize
for j = 1:lchrom
H(:,:) = oldpop(i,j,:);
a = ang(i,j);
newpop(i,j,:) = [cos(a), -sin(a); sin(a), cos(a)] * H;
end
end
end
运行QGA.m结果:
ans = 0.9876
ans = 11.8134
ans = 0.9921
ans = 0.1107
ans = 0.9997
ans = 0.0213
ans = 0.9997
ans = 0.0213
ans = 0.9997
ans = 0.0213
这本书大部分代码:
https://github.com/5455945/quantum_lerning/blob/master/量子信息处理技术及算法设计/README.md
如有错误之处,欢迎批评指正。QQ群:579809480。