%%%%%%%%%%%%标准遗传算法解单决策变量问题%%%%%%%
%%%%%%%%%%%求取f(x) = 想+ 10sin(5x) + 7cos(4x)在[0,10]上的最大值%%%
%% 初始化参数
clear all;close all;clc;
Np = 14; %种群数量
L = 20; % 二进制编码长度
Pc = 0.8; % 交叉概率
Pm = 0.1; %变异概率
x_min = 0;
x_max = 10; %上下限
G = 100; % 最大迭代次数
pop = randi([0, 1], Np, L);% 随机获得初始种群
next_pop = pop; % 新一代
fit = zeros(1, Np); % 种群中每个个体对应的适应度
trace = zeros(1, G); % 跟踪每一次迭代的最好值
%% 遗传算法循环
for k = 1 : G
%%%%%%%%%解码二进制串为十进制%%%%%%%%%%%%
for i = 1:Np
unit = pop(i,:);%第i个个体的二进制码
m = 0;
for j = 1:L
m = m + unit(j) * 2^(j-1); % m为二进制编码pop(i,:)对应的十进制编码
end
x(i) = x_min + (m/(2^L-1)) * (x_max - x_min); % 该十进制编码对应的区间中的值
fit(i) = func1(x(i));
end
%找出最好适应度和最差适应度, 并确定最好/差适应度对应的个体
max_fit = max(fit);
min_fit = min(fit);
best_idxs = find(fit == max_fit);
pop_best = pop(best_idxs(1,1), :);
x_best = x(best_idxs(1,1));
normed_fit = (fit - min_fit)/(max_fit - min_fit); % 归一化适应度
%%%%%%%%%%%%基于轮盘赌的选择操作%%%%%%%
fit_sum = sum(normed_fit);
prob_sel = normed_fit./fit_sum; %第i个元素代表第i个个体被选择的概率
cum_prob = cumsum(prob_sel); % 选择概率的累积和,等下会看到
old_i = 1;
new_i = 1;
sel_rate = sort(rand(1, Np)); % 通过累积和进行比较去保证选择率高的个体被选中的多些,
% 概率低的个体幅复制地少些甚至不复制
% 这个算法在这部分的做法是很巧妙的,就是我要怎么保证选择操作能够
% 让下一代的数量和这一代的数量相同?
% 它用了一种方法,可能有其他的方法
while(old_i <= Np && new_i <= Np)
% 如果满足, 则选取
if(sel_rate(new_i) < cum_prob(old_i))
next_pop(new_i, :) = pop(old_i, :);
new_i = new_i +1;
% 否则
else
old_i = old_i+1;
end
end
%%%%%%%%%%%%基于概率的交叉操作%%%%%%%
for i = 1:2:Np %i表示第i对
p = rand(1);
if (p<Pc)
q = randi([0,1],1,L);% 随机生成一个个体——一个长为L的二进制码
for j = 1:L
if(q(j) == 1)
%交叉操作
temp = next_pop(i+1, j);
next_pop(i+1, j) = next_pop(i,j);
next_pop(i,j) = temp;
end
end
end
end
%%%%%%%%%%%%基于概率的变异操作%%%%%%%
i = 1;
while i <= round(Np * Pm)
h = randi([1, Np]);
for j = 1:round(L * Pm)
g = randi([1,L]);
next_pop(h, g) =~ next_pop(h, g);%变异
end
i = i+1;
end
pop = next_pop;
pop(1,:) = pop_best; % 保留最优个体
trace(k) = max_fit;
end
figure(1);
plot(trace);
进化算法简单实现
最新推荐文章于 2026-06-21 17:05:31 发布

3255

被折叠的 条评论
为什么被折叠?



