混合遗传粒子群优化算法(MATLAB代码分享)

function HGPSO()
    clc;
    clear;
    close all;

    % 参数设置
    popsize = 20;    % 群体大小
    chromlength = 20; % 个体长度(染色体长度)
    pc = 0.6;       % 交叉概率
    pm = 0.1;       % 变异概率
    xlim = [0, 50]; % 定义搜索空间中xlim的范围
    G = 100;        % 最大迭代次数
    w = 0.8;        % 惯性权重
    c1 = 0.5;       % 自我学习因子
    c2 = 0.5;       % 群体学习因子
    vlimit = [-10, 10]; % 速度限制

    % 初始化种群和速度
    pop = round(rand(popsize, chromlength)); % 随机产生初始群体
    decpop = bintodec(pop, popsize, chromlength, xlim); % 初始群体的十进制值
    fx = calobjvalue(decpop); % 初始群体的目标函数值
    v = rand(popsize, chromlength) * (vlimit(2) - vlimit(1)) + vlimit(1); % 初始速度,限制在速度范围内
    xm = pop; % 每个个体的历史最佳位置
    ym = pop(1, :); % 种群的历史最佳位置
    fxm = fx; % 每个个体的历史最佳适应度
    fym = fx(1); % 种群的历史最佳适应度

    % 适应度记录
    ga_fitness_history = zeros(1, G); % 遗传算法适应度历史
    pso_fitness_history = zeros(1, G); % 粒子群算法适应度历史

    % 迭代过程
    for iter = 1:G
        % PSO部分:更新速度和位置
        for i = 1:popsize
            if fx(i) < fxm(i)
                fxm(i) = fx(i);
                xm(i, :) = pop(i, :);
            end
        end
        [fym, nmin] = min(fxm);
        ym = xm(nmin, :);

        for i = 1:popsize
            v(i, :) = w * v(i, :) + c1 * rand * (xm(i, :) - pop(i, :)) + c2 * rand * (ym - pop(i, :));
            v(i, v(i, :) > vlimit(2)) = vlimit(2);
            v(i, v(i, :) < vlimit(1)) = vlimit(1);
            pop(i, :) = round(pop(i, :) + v(i, :));
            pop(i, pop(i, :) > 1) = 1;
            pop(i, pop(i, :) < 0) = 0;
        end

        % GA部分:交叉和变异
        pop = crossover(pop, pc, popsize, chromlength);
        pop = mutation(pop, pm, popsize, chromlength);

        % 计算适应度
        decpop = bintodec(pop, popsize, chromlength, xlim);
        fx = calobjvalue(decpop);

        % 记录适应度
        ga_fitness_history(iter) = mean(fx); % 记录遗传算法适应度;计算当前种群中所有个体适应度值的平均值。
        pso_fitness_history(iter) = fym; % 记录粒子群算法适应度

        % 绘制图像
        plotfig(decpop, fx, xlim, iter, ga_fitness_history, pso_fitness_history);
    end

    disp(['找到的最优解位置为:', num2str(decpop(nmin))]);
    disp(['对应最优解为:', num2str(fym)]);
end

% 交叉操作
function newpop = crossover(pop, pc, popsize, chromlength)
    newpop = pop;
    for i = 1:2:popsize-1
        if rand < pc
            point = randi([1, chromlength-1]);
            newpop(i, point:end) = pop(i+1, point:end);
            newpop(i+1, point:end) = pop(i, point:end);
        end
    end
end

% 变异操作
function newpop = mutation(pop, pm, popsize, chromlength)
    newpop = pop;
    for i = 1:popsize
        if rand < pm
            point = randi([1, chromlength]);
            newpop(i, point) = 1 - newpop(i, point);
        end
    end
end

% 二进制转十进制
function dec = bintodec(pop, popsize, chromlength, xlim)
    dec = zeros(1, popsize);
    for i = 1:popsize
        bin_str = num2str(pop(i, :));
        dec(i) = bin2dec(bin_str);
    end
    dec = xlim(1) + dec * (xlim(2) - xlim(1)) / (2^chromlength - 1);
end

% 计算目标函数值
function fx = calobjvalue(decpop)
    f = @(x) x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x) + 3 * x .* sin(4 * x);
    fx = f(decpop);
end

% 绘制图像
function plotfig(decpop, fx, xlim, iter, ga_fitness_history, pso_fitness_history)
    f = @(x) x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x) + 3 * x .* sin(4 * x);
    x = xlim(1):0.05:xlim(2);
    y = f(x);

    subplot(1, 2, 1);
    plot(x, y, decpop, fx, 'ro');
    title(['第', num2str(iter), '次迭代进化']);

    subplot(1, 2, 2);
    plot(1:iter, ga_fitness_history(1:iter), 'b', 1:iter, pso_fitness_history(1:iter), 'r');
    legend('GA适应度', 'PSO适应度');
    title('适应度进化曲线');
    drawnow;
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值