遗传算法参数寻优

遗传算法原理:(自编算法)

仿照达尔文的那句话“物竞天择,适者生存”

学习代码:寻优算法(1)-------遗传算法(GA)附Matlab代码(copy可用)-CSDN博客

  • 种群初始化:不能对问题空间参数直接处理,需通过特定的编码如实数编码、位串编码、结构式编码等,把问题的可行解转换成遗传空间的染色体或个体

  • 适应度评估:判断种群个体好坏,通常用目标函数变换得到

  • 选择:选择更适合生存者,淘汰劣势者。适应度越高越容易被选中,选择操作方式常见的有轮盘赌法、锦标赛法等

  • 交叉:下一代获得父母的基因片段,以得到更加优良的基因。

  • 变异:光靠父母的基因不一定能够生存下来,环境等影响会造成基因的变异,使得其能跳出父母基因的限制,得到更适合生存的基因。

  • 经过这样一轮轮的选择,优良的基因(自变量)就被选择出来了。

GEN是当前代数;M是种群规模,i代表种群数量

初始化种群:initpop.m

%初始化种群大小
%输入变量:
%popsize:种群大小
%chromlength:染色体长度-->>转化的二进制长度
%输出变量:
%pop:种群
function pop=initpop(popsize,chromlength)
pop = round(rand(popsize,chromlength));
%rand(3,4)生成3行4列的0-1之间的随机数,randperm生成整数的随机数
% rand(3,4)
% 
% ans =
% 
%     0.8147    0.9134    0.2785    0.9649
%     0.9058    0.6324    0.5469    0.1576
%     0.1270    0.0975    0.9575    0.9706
%round就是四舍五入
% round(rand(3,4))=
% 1 1 0 1
% 1 1 1 0
% 0 0 1 1
%所以返回的种群就是每行是一个个体,列数是染色体长度

 main.m

function main()
clear;
clc;
%种群大小
popsize=100;
%二进制编码长度
chromlength=10;
%交叉概率
pc = 0.6;
%变异概率
pm = 0.001;
%初始种群,得到每个个体的染色体
pop = initpop(popsize,chromlength);

for i = 1:100
    %计算适应度值(函数值)
    objvalue = cal_objvalue(pop);
    fitvalue = objvalue;
    %选择操作
    newpop = selection(pop,fitvalue);
    %交叉操作
    newpop = crossover(newpop,pc);
    %变异操作
    newpop = mutation(newpop,pm);
    %更新种群
    pop = newpop;
    objvalue = cal_objvalue(pop);
    fitvalue = objvalue;
    %寻找最优解
    [bestindividual,bestfit] = best(pop,fitvalue);
    x2 = binary2decimal(bestindividual);
    x1 = binary2decimal(newpop);
    y1 = cal_objvalue(newpop);
    if mod(i,10) == 0
        pause(1);
        figure(1);
        cla;
        fplot(@(x)4.*cos(2.*x).*sin(6.*x)+10.*sin(5.*x).*sin(3.*x)-3.*abs(x-5)+10,[0 10]);
        hold on;
        plot(x1,y1,'*');
        title(['迭代次数为n=' num2str(i)]);
    end
end
fprintf('The best X is --->>%5.2f\n',x2);
fprintf('The best Y is --->>%5.2f\n',bestfit);

计算适应度: cal_objvalue.m 【计算评估值】

%计算函数目标值
%输入变量:二进制数值
%输出变量:目标函数值
function [objvalue] = cal_objvalue(pop)
x = binary2decimal(pop);
%转化二进制数为x变量的变化域范围的数值
objvalue=4.*cos(2.*x).*sin(6.*x)+10.*sin(5.*x).*sin(3.*x)-3.*abs(x-5)+10;

%二进制转化成十进制函数
%输入变量:
%二进制种群
%输出变量
%十进制数值
function pop2 = binary2decimal(pop)
[px,py]=size(pop);
for i = 1:py
    pop1(:,i) = 2.^(py-i).*pop(:,i);
end
%sum(.,2)对行求和,得到列向量
temp = sum(pop1,2);
pop2 = temp*10/1023;

选择:selection.m

%如何选择新的个体
%输入变量:pop二进制种群,fitvalue:适应度值
%输出变量:newpop选择以后的二进制种群
function [newpop] = selection(pop,fitvalue)
%构造轮盘
[px,py] = size(pop);
totalfit = sum(fitvalue);
p_fitvalue = fitvalue/totalfit;
p_fitvalue = cumsum(p_fitvalue);%概率求和排序
ms = sort(rand(px,1));%从小到大排列
fitin = 1;
newin = 1;
while newin<=px
    if(ms(newin))<p_fitvalue(fitin)
        newpop(newin,:)=pop(fitin,:);
        newin = newin+1;
    else
        fitin=fitin+1;
    end
end

 交叉函数:crossover.m 【创新遗传算法一般更改这】

%交叉变换
%输入变量:pop:二进制的父代种群数,pc:交叉的概率
%输出变量:newpop:交叉后的种群数
function [newpop] = crossover(pop,pc)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1:2:px-1
    if(rand<pc)
        cpoint = round(rand*py);
        newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];
        newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
    else
        newpop(i,:) = pop(i,:);
        newpop(i+1,:) = pop(i+1,:);
    end
end

 变异函数:mutation.m

%函数说明
%输入变量:pop:二进制种群,pm:变异概率
%输出变量:newpop变异以后的种群
function [newpop] = mutation(pop,pm)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1:px
    if(rand<pm)
        mpoint = round(rand*py);
        if mpoint <= 0
            mpoint = 1;
        end
        newpop(i,:) = pop(i,:);
        if newpop(i,mpoint) == 0
            newpop(i,mpoint) = 1;
        elseif newpop(i,mpoint) == 1
            newpop(i,mpoint) = 0;
        end
    else
            newpop(i,:) = pop(i,:);
    end
end

 选择最优个体:best.m

%求最优适应度函数
%输入变量:pop:种群,fitvalue:种群适应度
%输出变量:bestindividual:最佳个体,bestfit:最佳适应度值
function [bestindividual bestfit] = best(pop,fitvalue)
[px,py] = size(pop);
bestindividual = pop(1,:);
bestfit = fitvalue(1);
for i = 2:px
    if fitvalue(i)>bestfit
        bestindividual = pop(i,:);
        bestfit = fitvalue(i);
    end
end

案例:14个城市走一圈路程最短(TSP问题)的优化算法,选择使用轮盘法

5. matlab遗传算法编程(5)_哔哩哔哩_bilibili

遗传算法工具箱使用:

转化为标准形式:1.f(目标函数)  写一个.m文件

                             2.A,b(线性等式约束)需要将>=转换为<=。A=[-1 2 -1 1;-2 1 2 -1] 取系数值

                              b=[1;5];b是不等式右侧的常数值

                             3.Aeq,beq(线性等式约束)本式未出现等式

                             4.lb,ub(决策变量上下界)表示x1~x4范围,lb=[-100 -100 0 0];ub=[100 100 10

                              10]

                             5.c,ceq(非线性不等式约束与非线性等式约束)需单独写m文件 

 打开工具箱:命令行->optimtool  / APP->optimization

自作:

目标函数要弄成MIN类型

因此要求的就是min RSME,使得模拟值和实验值适应度最高

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法(Genetic Algorithm, GA)是一种基于自然进化过程的优化算法,能够寻找到最优解或近似最优解。在支持向量机(Support Vector Machine, SVM)中,选择合适的参数是决定其性能的关键因素之一。通过使用遗传算法对SVM的参数进行寻优可以找到更好的参数组合,提高SVM的分类性能。 对于SVC的参数寻优,常用的参数包括C和gamma。其中C是惩罚因子,gamma是高斯核函数的参数。这两个参数的选择对于SVM的性能有着很大的影响。通常情况下,我们希望通过调节这些参数的值来达到最佳的分类效果。 利用遗传算法寻优这些参数的过程如下:首先,我们需要定义适应度函数,也就是将SVM的分类性能作为适应度的度量。其次,我们需要定义初始种群,也就是随机生成一些参数组合。然后,通过选择、交叉和变异等操作对种群进行迭代优化。在每一代中,根据适应度函数对种群中的个体进行评估,选择适应度较高的个体进行进化操作,通过交叉和变异等操作来产生新的个体。最后,不断迭代进行进化操作,直到满足终止条件。 通过使用遗传算法对SVC的参数进行寻优,可以得到较好的参数组合,从而提高SVC的分类性能。遗传算法能够在参数空间中搜索,通过不断进化种群来找到更优的参数组合。这种方法相对于传统的穷举搜索或随机搜索,能够减少搜索时间,提高搜索效率。 总之,遗传算法可以应用于优化SVC的参数选择,通过不断迭代优化种群,找到更优的参数组合,从而提高SVC的分类性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值