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
混合遗传粒子群优化算法(MATLAB代码分享)
最新推荐文章于 2024-09-14 17:38:36 发布