一种仿真量子遗传算法(matlab)

版权声明:技术分享,csdn longji https://blog.csdn.net/longji/article/details/85269036

一种仿真量子遗传算法(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。

猜你喜欢

转载自blog.csdn.net/longji/article/details/85269036
今日推荐