遗传算法是一种优化算法,实质是通过群体搜索,根据适者生存的原则进行逐代进化,最终得到最优解。
实现方法:
1.根据具体问题找到可行解的取值范围,类似于x∈(a,b),确定一种编码方式,通过数值串或字符串的方式表示每个可行解
2.确定适应度函数fitness(非负函数),用于判断每个解的好坏
3.确定进化的相关参数,种群规模、交叉概率、变异概率、进化终止条件(最大代数等)。
模型求解及算法
step1.设定参数:
种群大小:M=50
最大代数:G=1000
交叉率:Pc=1(交叉概率为1,保证种群充分进化)
变异率:Pm=0.1(变异发生可能性尽可能小)
step2.确定可行解的编码方式
step3.确定初始种群(可采用改良圈法求得一个较好的初始种群)
step4.确定目标函数(适应度函数)
step5.交叉操作
step6.变异操作
step7.选择(选择目标函数值最小的M个个体进化到下一代,保证父代的优良特性被遗传下来)
遗传算法求解一维无约束优化问题
matlab程序(网上找的,感觉很好用)
function [xv,fv] = myGA(fitness, a, b, M, G, Pc, Pm, eps)
% 用遗传算法求解一维无约束优化问题
% 待优化的目标函数 fitness
% 自变量下界 a
% 自变量上界 b
% 种群个体数 M
% 最大进化代数 G
% 杂交概率 Pc
% 变异概率 Pm
% 自变量离散精度 eps
% 目标变量取最大值时自变量的值: xm
% 目标函数的最大值 fv
%
% Example:
% function F = fitness(x)
% F = x^3-60*x^2+900*x+100;
% -------------------------------
% [xv,fv] = myGA(@fitness,0, 30, 50, 100, 0.9, 0.04, 0.01);
% --------------------------------------------------
% xv = 10
% fv = 4100
%
% 本程序在《精通MATLAB最优化计算》页315程序的基础上修改
L = ceil(log2((b-a) / eps + 1)); %编码长度
x = zeros(M, L); %种群
nx = zeros(size(x)); %滚动数组
fx = zeros(M, 1); %适应度
for i = 1:M
x(i,:) = Initial(L);
end
fv = -inf;
for k = 1 : G
for i = 1 : M
fx(i) = fitness(Dec(a, b, x(i, :), L));
if (fx(i) > fv)
xv = Dec(a, b, x(i, :), L);
fv = fx(i);
end
end
sumfx = sum(fx);
Px = fx / sumfx;
PPx = zeros(M, 1);
PPx(1) = Px(1); %概率叠加
for i = 2 : M
PPx(i) = PPx(i - 1) + Px(i);
end
selFather = 0;
for i = 1 : M
sita = rand();
for j = 1 : M
if (sita <= PPx(j))
selFather = j; %使用轮盘赌法进行选择父亲
break;
end
end
selMother = floor(rand() * M) + 1; %母亲随机选择
posCut = floor(rand() * (L - 1)) + 1; %交叉点
r1 = rand();
if (r1 <= Pc)
nx(i, 1 : posCut) = x(selFather, 1:posCut);
nx(i, (posCut + 1) : L) = x(selMother, (posCut + 1) : L);
r2 = rand();
if (r2 <= Pm)
posMut = floor(rand() * L) + 1;
nx(i, posMut) = ~nx(i, posMut);
end
else
nx(i, :) = x(selFather, :);
end
end
x = nx;
end
%--------------------------------------------------------
% 初始化种群
function result = Initial(length)
result = zeros(size(length()));
for i = 1 : length
r = rand();
result(i) = round(r);
end
%----------------------------------------------------------
% 编码转换
function y = Dec(a, b, x, L)
base = 2 .^ ((L - 1) : -1: 0);
y = dot(base, x);
y = a + y * (b - a) / (2 ^ L - 1);
当然如果matlab里有遗传工具箱gatool可以交互式操作就更方便些