国赛学习——遗传算法

遗传算法

遗传算法

智能优化算法
几个概念:
种群:有很多个个体组成的群体
个体(染色体):相当于待求解优化问题的一个解
基因:每个解的组成分量
几个算子:
选择:从当前的种群中选择比较好的个体,使之有机会将其基因遗传到下一代。
交叉:从选择好的个体中两两配对并按照某种方式呼唤基因以产生下一代。
变异:对种群中一些个体以一定概率变异
编码:
二进制编码
实值编码
符号编码

请添加图片描述
解码:
将二进制数据转换为十进制数据
x = s + ( b − a ) ∗ X / ( 2 L − 1 ) x=s+(b-a)*X/(2^L - 1) x=s+(ba)X/(2L1)

选择:轮盘赌选择法
请添加图片描述

适应度函数尺度变换:
适应度函数fitness function 的选取直接影响到遗传算法的收敛速度以及能否找到最优解,因为遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群中每个个体的适应度来进行搜索
最优化问题可分为两大类,一类为求目标函数的全局最大值,另一类为求目标函数的全局最小值,对于这两类优化问题,目标函数值f(x)到搜索空间中对应个体的适应度函数值F(x)的转换方法
请添加图片描述请添加图片描述

交叉:
二进制编码,
单点
两点
请添加图片描述

变异:
规定变异概率Pm
长度为10,馋哼一个[1 10]的随机整数,若r<Pm,则0变1、1变0
请添加图片描述

编码->初始化种群->计算适应度->选择->交叉->变异->新种群->是否满足条件->解码
#Matlab

示例

目标函数变为适应度函数
objfun.m文件(目标函数)

function fvl = objfun(x)

fval = 11*sin(6*x) + 7*cos(5*x); //求最大值

fitnessfun.m文件(适应度函数)

function fitvalue = fitnessfun(x)

Cmin = 0.01;
[row, ~] = size(x);
for i = 1:row
	fval = objfun(x(i,:));
	if fval + Cmin > 0
		fitvalue(i) = fval + Cmin;
	else
		fitvalue(i) = 0;
	end
		fitvalue(i) = 0;
	end
end

decode.m函数文件(二进制转换为十进制)

function real = decode(pop,lb,ub)
//pop种群
//varnum变量个数
[~,col] = size(pop);

for j = col:-1:1
	temp(j) = 2^(j-1)*pop(j);
end
temp = sum(temp);
real = lb + temp * (ub-lb)/(2^col-1);
end

selection.m选择函数

function [dad,mom] = selection(pop,fitvalue)

//计算累加概率
PP = cumsum(fitvalue ./ sum(fitvalue));

[row,~] = size(pop);

//选择出row个个体 用轮盘赌方法
for i = 1:row
	for j = 1:row
		r = rand;
		if r <= PP(j)
			dad(i,:) = pop(j,:);
			break;
		end
	end
	mom(i,:) = pop(randi([1,row]),:);
end

crossover.m交叉函数

function newpop = crossover(dad,mom,pc)

[row,col] = size(dad);
for i = 1:row
	if rand < pc
		cpoint = randi([1,col-1]);
		newpop(i,:) = [dad(i,1:cpoint) mom(i,cpoint+1:end)];
	else
		newpop(i,:) = dad(i,:);
	end
end

mutation.m变异函数

function newpop = mutation(pop,pm)

[row,col] = size(pop);
newpop = zeros(row,col);
for i = 1:row
	mpoint = randi([1,col]);
	if rand < pm
		newpop(i,:) = ~pop(i,mpoint);
	else
		newpop(i,:) = pop(i,:);
	end
end

GeneticAlgorithm.m文件
varnum 变量个数
eps 精度
lb ub 变量范围
n 种群大小
交叉概率 pc
变异概率 pm
动态先行变换 M

f = @(x) 11*sin(6*x) + 7*cos(5*x);
ezplot(f)
hold on
h = plot(0,0,'*')
//给函数画图

varnum = 1;
n = 200;
lb = -pi;
ub = pi;
eps = 1e-2;
pc = 0.9;
pm = 0.01;
maxgen = 200;
//变量初始化

//初始化种群
for i = 1:varnum
	L(i) = cell(log2((ub(i)-lb(i)) / esp + 1));
end

LS = sum(L);  //总长度

pop = randi([0,1],n,LS);  //生成随机种群要么是0要么是1
spoint = cumsum([0,L]);   //将二进制代码分割使用

for iter = 1:maxgen
	//将二进制转换为十进制
	for i = 1:n
		for j = 1:varnum
			startpoint = spoint(j)+1;
			endpoint = spoint(j+1);
			real(i,j) = decode(pop(i,startpoint:endpoint),lb(j),ub(j));
		end
	end
	
	//计算适应度值
	fitvalue = fitnessfun(real);
	fval = objfun(real);
	h.XData = real;
	h.VData = fval;
	pause(0.05)

	//选择
	[dad,mom] = selection(pop,fitvalue);

	//交叉
	newpop = crossover(dad,mom,pc);

	//变异
	newpop = mutation(newpop,pm);

	pop = newpop;

end

for i = 1:n
	for j = 1:varnum
		startpoint = spoint(j)+1;
		endpoint = spoint(j+1);
		real(i,j) = decode(pop(i,startpoint:endpoint),lb(j),ub(j));
	end
end

fitvalue = fitnessfun(real);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值