% %遗传算法 参数5表示生成的种群包含5个个体,10表示每个个体长度为10,chrom 矩阵,随机生成
% %lind每个个体长度10,baseV指定基数值,编码的默认值2
1.crtbp创建种群函数
>> [chrom,lind,baseV]=crtbp(5,10)
chrom =
1 0 0 0 1 1 1 1 0 0
1 0 1 0 0 1 0 1 0 0
0 1 1 1 1 0 0 0 1 1
1 1 0 1 1 1 0 1 1 1
1 1 1 1 1 0 0 0 0 1
lind =
10
baseV =
2 2 2 2 2 2 2 2 2 2
>> [chrom,lind,baseV]=crtbp(5,[2,3,4,5,6,7,8.9])
chrom =
0 0 0 0 3 3 7
1 0 2 3 1 0 4
1 1 1 1 3 1 8
0 2 0 2 4 6 0
1 2 1 0 4 1 3
lind =
7
baseV =
2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.9000
2.适应度计算函数ranking 功能:基于排序的适应度分配
>> objv=[1;2;3;4;5;10;7;8;9;6];
Fitnv=ranking(objv)
Fitnv =
2.0000
1.7778
1.5556
1.3333
1.1111
0
0.6667
0.4444
0.2222
0.8889
3.%使用RFun中的值估算适应度,Fitnv列向量,包含chrom个体中的适应度
>> RFun=[3;5;7;10;14;18;25;30;40;50];
Fitnv = ranking(objv,RFun)
Fitnv =
50
40
30
25
18
3
10
7
5
14
%使用非线性排序,选择压差为2,在objv中有两个子种群估算适应度
>> Fitnv = ranking(objv,[2,1],2)
Fitnv =
2.0000
1.2889
0.8307
0.5354
0.3450
0.3450
1.2889
0.8307
0.5354
2.0000
使用随机遍历抽样sus选择8个个体:
>> Chrom = [1 11 21;2 12 22;3 13 23;4 14 24;5 15 25;6 16 26;7 17 27;8 18 28];
FitnV=[1.50;1.35;1.21;1.07;0.92;0.78;0.64;0.5];SelCh = select('sus',Chrom,FitnV)
SelCh =
5 15 25
4 14 24
2 12 22
3 13 23
1 11 21
8 18 28
6 16 26
2 12 22
%假设Chrom由两个子种群组成,通过轮盘赌选择函数sus对每个子种群选择150%的个体。
>> FitnV=[1.50;1.16; 0.83; 0.50; 1.50; 1.16; 0.83;0.5];
SelCh= select('sus', Chrom, FitnV,1.5,2)
SelCh =
2 12 22
4 14 24
2 12 22
1 11 21
3 13 23
1 11 21
7 17 27
7 17 27
5 15 25
5 15 25
6 16 26
5 15 25
一元函数简单优化:
%简单一元函数优化
clc, clear
close all
%% 画出函数图
figure(1);
hold on;
lb = 1; ub = 2; %函数自变量范围[1,2]
ezplot('sin(10 * pi * X) / X', [lb, ub]');
xlabel('自变量/X')
ylabel('函数值/Y')
%% 定义遗传算法参数
nind = 40; %种群大小
maxgen = 20; %最大遗传迭代次数
preci = 20; %个体长度
ggap = 0.95; %代沟
px = 0.7; %交叉概率
pm = 0.01; %变异概率
trace = zeros(2, maxgen); %寻优结果初始化
fieldd = [preci; lb; ub; 1; 0; 1; 1]; %区域描述器
chrom = crtbp(nind, preci); %种群初始化(任意离散随机种群)
%% 优化
gen = 0; %代计数器
X = bs2rv(chrom, fieldd); %初始种群二进制转十进制
objv = sin(10 * pi * X) ./ X; %计算目标函数值
while gen < maxgen
fitnv = ranking(objv); %分配适应度值
selch = select('sus', chrom, fitnv, ggap); %选择
selch = recombin('xovsp', selch, px); %交叉
selch = mut(selch, pm); %变异
X = bs2rv(selch, fieldd); %子代个体十进制转换
objvsel = sin(10 * pi * X) ./ X;
[chrom, objv] = reins(chrom, selch, 1, 1, objv, objvsel); %重插入子代到父代,得到新种群
X = bs2rv(chrom, fieldd);
gen = gen + 1;
%获取每代的最优解及其序号,Y为最优解,i为个体的序号
[Y, i] = min(objv);
trace(1, gen) = X(i);
trace(2, gen) = Y;
end
plot(trace(1, :), trace(2, :), 'bo'); %绘制每一代的最优点
grid on;
plot(X, objv, 'b*');
%% 画进化图
figure(2);
plot(1 : maxgen, trace(2, :));
grid on;
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
best_y = trace(2, end);
best_x = trace(1, end);
fprintf(['最优解:\nX=', num2str(best_x), '\nY=', num2str(best_y), '\n'])
最优解:
X=1.1491
Y=-0.8699