matlab遗传算法之goat工具箱

遗传算法

学了一阵子遗传算法理论了,今天拿个实例来学习。

  • 我理解的遗传算法就是受到大自然的启发,物竞天择的思想。

在这里插入图片描述

  • 例如上图中,我们要求最大值,我们当然可以正常求导,利用函数的导函数的性质来判断,然而遗传算法的做法就是首先随机在这些曲线上取点,模拟大自然的物种,利用数学函数来模拟基因的复制,交叉,变异。利用适应度函数来决定哪些点可以留下,然后就一直留下最优的点继续运算,理论上一定会找到最优点。

例如:求函数f(x)=x +10sin(5x)+7cos(4x)的最大值

  • 先看看他的图像
%% II. 绘制函数曲线
x = 0:0.01:9;
y =  x + 10*sin(5*x)+7*cos(4*x);

figure
plot(x, y)
xlabel('自变量')
ylabel('因变量')
title('y = x + 10*sin(5*x) + 7*cos(4*x)')
grid on%添加网格

在这里插入图片描述

  • 超级多极小值和极大值。

下面就是利用goat工具包进行求解

  • 我首先介绍几个主要的函数
    (1) function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)–初始种群的生成函数
    【输出参数】
    pop–生成的初始种群
    【输入参数】
    num–种群中的个体数目
    bounds–代表变量的上下界的矩阵
    eevalFN–适应度函数
    eevalOps–传递给适应度函数的参数
    options–选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如
    precision–变量进行二进制编码时指定的精度
    F_or_B–为1时选择浮点编码,否则为二进制编码,由precision指定精度)
  • (2)function [x,endPop,bPop,traceInfo] =ga(bounds,evalFN,evalOps,startPop,opts,…
    termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)
    –遗传算法函数
    【输出参数】
    x–求得的最优解
    endPop–最终得到的种群
    bPop–最优种群的一个搜索轨迹
    【输入参数】
    bounds–代表变量上下界的矩阵
    evalFN–适应度函数
    evalOps–传递给适应度函数的参数
    startPop-初始种群
    opts[epsilon prob_ops display]–opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。如[1e-6 1 0]
    termFN–终止函数的名称,如[‘maxGenTerm’]
    termOps–传递个终止函数的参数,如[100]
    selectFN–选择函数的名称,如[‘normGeomSelect’]
    selectOps–传递个选择函数的参数,如[0.08]
    xOverFNs–交叉函数名称表,以空格分开,如[‘arithXoverheuristicXover simpleXover’]
    xOverOps–传递给交叉函数的参数表,如[2 0;2 3;20]
    mutFNs–变异函数表,如[‘boundaryMutationmultiNonUnifMutation nonUnifMutation unifMutation’]
    mutOps–传递给交叉函数的参数表,如[4 0 0;6 100 3;4 100 3;4 0 0]

1.首先要创建一个适应度函数文件fitness.m

function [sol, fitnessVal] = fitness(sol,option)

x = sol(1);

fitnessVal = x + 10*sin(5*x)+7*cos(4*x);
%如果求最小值   可以   1/x + 10*sin(5*x)+7*cos(4*x);

end

2.然后就是运用函数进行遗传算法的计算

%% I. 清空环境变量
%optimtool    solver   中选择   GA
%添加 gaot工具箱
clear 
clc

%% II. 绘制函数曲线
x = 0:0.01:9;
y =  x + 10*sin(5*x)+7*cos(4*x);

figure
plot(x, y)
xlabel('自变量')
ylabel('因变量')
title('y = x + 10*sin(5*x) + 7*cos(4*x)')
grid on%添加网格

%% III. 初始化种群
initPop = initializega(50,[0 9],'fitness');    %种群大小;变量变化范围;适应度函数的名称
%看一下initpop     第二列代表   适应度函数值
%% IV. 遗传算法优化
[x endPop bpop trace] = ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,...
                           'normGeomSelect',0.08,'arithXover',2,'nonUnifMutation',[2 25 3]);
%变量范围上下界;适应度函数;适应度函数的参数;初始种群;精度和显示方式;终止函数的名称;
%终止函数的参数;选择函数的名称;选择函数的参数;交叉函数的名称;交叉函数的参数;变异函数的
%名称;变异函数的参数
%  X    最优个体     endpop   优化终止的最优种群    bpop 最优种群的进化轨迹   trace   进化迭代过程中
%最优的适应度函数值和适应度函数值矩阵

%% V. 输出最优解并绘制最优点
x
hold on
plot (endPop(:,1),endPop(:,2),'ro')

%% VI. 绘制迭代进化曲线
figure(2)
plot(trace(:,1),trace(:,3),'b:')
hold on
plot(trace(:,1),trace(:,2),'r-')
xlabel('Generation'); ylabel('Fittness');
legend('Mean Fitness', 'Best Fitness')

看看效果

在这里插入图片描述
在这里插入图片描述
由此就找到了此函数的最大值。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳小葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值