MATLAB 遗产算法代码(GA)

%%主程序
%%清空环境变量
function GA() 
clc
clear
close all
%%参数设置
popsize=20; % 群体大小
chromlength=20; %串的长度(个体长度)
pc=0.6; %交叉概率
pm=0.1; %变异概率
xlim = [0,50];%%定义搜索空间中xlim的范围
G = 100 ; %迭代次数
% x = zeros(1,G); % 记录每代个体最优位置 
% y = zeros(1,G); % 记录每代最优个体对应的函数值

pop= round( rand(popsize,chromlength) )  ; %随机产生初始群体
decpop =  bintodec( pop ,popsize, chromlength,xlim ) ; % 计算初代解对应十进制
fx = calobjvalue(decpop  ) ; % 计算初代解的函数值
plotfig(decpop , fx , xlim , 1  ) ; % 绘制图像
[y(1) , l ]  = max(fx); x(1) = decpop(l);

for i = 2  : G 
    decpop =  bintodec( pop , popsize, chromlength,xlim ) ; % 计算上一代解对应十进制
    fx = calobjvalue(decpop  ) ; % 计算上一代解的函数值
    fitvalue = calfitvalue(fx) ;  % 适应度映射
    newpop = copyx(pop,fitvalue,popsize); %复制
    newpop = crossover(newpop, pc, popsize,chromlength ); %交叉
    newpop = mutation(newpop,pm, popsize,chromlength); %变异
    % 这时的newpop是经过复制交叉变异产生的新一代群体
    %     下边进行选择择优保留(即实现保底机制)
    newdecpop =  bintodec( newpop ,popsize, chromlength,xlim ) ;
    new_fx = calobjvalue(newdecpop) ; %计算新解目标函数
    new_fitvalue = calfitvalue(new_fx); %计算新群体中每个个体的适应度
    index = find(new_fitvalue > fitvalue) ; 
    pop(index, : ) = newpop(index,:) ; % 更新得到最新解
    decpop = bintodec( pop ,popsize, chromlength,xlim ) ; %计算新解的十进制
    fx = calobjvalue( decpop )  ; %计算结果
    plotfig(decpop , fx ,xlim , i ) % 绘制新解的图
    % 找出更新后的个体最优函数值
    [bestindividual,bestindex] = max(  fx ) ;
    y(i)=bestindividual; % 记录每一代的最优函数值
    x(i)= decpop(bestindex) ; %十进制解
    subplot(1,2,2);
    plot(1:i,y); 
    title('适应度进化曲线');
   
end
[ymax, max_index] = max(y);
disp(['找的最优解位置为:', num2str(x(max_index)) ])
disp(['对应最优解为:', num2str(ymax) ])

end

%******************************************************************************************%
%% 计算适应度
function fitvalue = calfitvalue(fx)
%这里求最大值,并且函数值又都大于0,所以直接使用函数值本身作为适应度值。
% 事实上,不同的问题适应度函数构造方法多种多样。
    fitvalue = fx ; 
end

%% 复制操作
function newx = copyx(pop, fitvalue,popsize ) %传进来二进制串和对应适应度
% 按照PPT的轮盘赌策略对个体复制
    newx = pop; %只是起到申请一个size为pop大小空间的作用,newx之后要更新的
    i = 1;  j = 1;
    p = fitvalue / sum(fitvalue) ; 
    Cs = cumsum(p) ; 
    R = sort(rand(popsize,1)) ; %每个个体的复制概率
    while j <= popsize 
        if R(j) < Cs(i)
            newx(j,:) = pop(i,:) ;
            j = j + 1;
        else
            i = i + 1;
        end
    end
end

%% 交叉操作
function newx = crossover(pop, pc, popsize,chromlength )
% 12 34 56交叉方式,随机选择交叉位点
% 注意个体数为奇数偶数的区别
i = 2 ;
newx = pop ; %申请空间
while i + 2 <= popsize
    %将第i 与 第 i -1 进行随机位点交叉
    if rand < pc
        x1 = pop(i-1,:);
        x2 = pop(i,:) ; 
        r = randperm( chromlength , 2 ) ; %返回范围内两个整数
        r1 = min(r); r2 =max(r) ; % 交叉复制的位点
        newx(i-1,:) = [x1( 1 : r1-1),x2(r1:r2) , x1(r2+1: end)];
        newx(i , : ) = [x2( 1 : r1-1),x1(r1:r2) , x2(r2+1: end)];
    end
    i = i + 2 ; %更新i
end

end

%% 变异
function newx = mutation(pop,pm, popsize,chromlength)
i = 1 ;
while i <= popsize
    if rand < pm
        r = randperm( chromlength , 1 ) ; 
        pop(i , r) = ~pop(i, r);
    end
    i = i + 1;
end

newx = pop; %将变异后的结果返回。

end

%%  二进制转十进制函数
function dec = bintodec( pop ,popsize, chromlength,xlim )
    dec = zeros(1,popsize);
    index = chromlength-1:-1:0;%%个体位的权重
    for i = 1 : popsize
        dec(i) = sum(pop(i,:).* (2.^index));%%每个各体所有位的求和
    end
    dec = xlim(1) + dec*(  xlim(2) -  xlim(1) ) /( 2 ^ chromlength - 1) ;%%对转换后的十进制值进行了线性变换
end


%%  绘制图像
function plotfig(decpop , fx ,xlim,k) 
    f = @(x) abs(x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x) +3 * x .* sin(4 * x)); % 研究对象函数  
    x = xlim(1):0.05:xlim(2);
    y = f(x) ; 
    subplot(1,2,1);
    plot(x,y,decpop,fx,'o')
    title(['第',num2str(k),'次迭代进化'])
    pause(0.2)
end


%% 目标函数
function fx = calobjvalue(decpop ) %参数为十进制解

f = @(x) abs(x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x) +3 * x .* sin(4 * x)) ; % 研究对象函数        
fx = f(decpop);
end








  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab中的GA算法代码可以使用遗传算法函数ga来实现。该函数可以通过遗传算法进行函数的最大化或最小化优化。以下是一段使用遗传算法进行函数最大化的示例代码: ``` [x, fval, exitflag, output, population, scores = ga(@ga43, 2); ``` 其中,@ga43是遗传算法的适应度函数。适应度函数ga43定义了待优化的目标函数,以及如何计算染色体的适应度值。例如,适应度函数ga43可以按照下面的方式进行定义: ``` function y = ga43(x) y = (cos(x(1)^2 + x(2)^2) - 0.1) / (1 + 0.3*(x(1)^2 + x(2)^2)^2) + 3; end ``` 在这个示例中,适应度函数ga43计算了二维变量x的目标函数值,将其作为适应度值返回。遗传算法会根据该适应度值进行个体的选择、交叉和变异等操作,最终找到目标函数的最大值。 需要注意的是,上述代码只是一个示例,具体的遗传算法实现可能会根据具体的问题和要求进行调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【控制】遗传算法GA,Genetic Algorithm)及 Matlab 实现 代码详细版](https://blog.csdn.net/weixin_36815313/article/details/122001494)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值