遗传算法求解高维函数(含MATLAB代码)

本文代码出自网络上一位大神,忘记了出处,来源暂时不详,若代码原作者申明版权,请联系我进行删除!

高维函数属于NP问题,目前无标准方程可解,用于求解非劣解逼近最优解的办法有很多,现在介绍群智能算法求解高维函数(本文以遗传算法为例)。

(暂时先放MATLAB主代码,具体的算法分析会慢慢补充。需要MATLAB完整代码的去链接里面拿)

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

for i = 1:100
    %计算适应度值(函数值)
    %函数“cal_objvalue里面就存着需要解的高维函数”
    objvalue = cal_objvalue(pop);%得到目标函数值objvalue
    fitvalue = objvalue;
    
    newpop = selection(pop,fitvalue);%选择操作
    newpop = crossover(newpop,pc);%交叉操作
    newpop = mutation(newpop,pm);%变异操作
    pop = newpop;%更新种群
    
    %寻找最优解,找到适应度最大的个体->
    [bestindividual,bestfit] = best(pop,fitvalue);
    x2 = binary2decimal(bestindividual);%最佳个体
    y2 = cal_objvalue(bestindividual);%最佳个体目标函数值
    x1 = binary2decimal(newpop);%种群
    y1 = cal_objvalue(newpop);%种群的目标函数值
    if mod(i,10) == 0 %mod函数求i除以10的余数
    
    	%if i/10==1 %测试用,测试迭代次数为10时的值
        figure;%创建一个图形窗口
        %在指定范围内绘制函数图像->
        %fplot('10.*sin(5*x)+7.*abs(x-5)+10',[0 10]);
        fplot((@(x)10.*sin(5.*x)+7.*abs(x-5)+10),[0 10]);
        %数字后加点表示与之相乘的是值而不是向量<-
        hold on;%新图不会覆盖旧图,hold off作用相反
        plot(x1,y1,'*');%红色显示所有种群及其函数值
        plot(x2,y2,'*g');%绿色单独显示最佳个体及其函数值
        title(['迭代次数为n=' num2str(i)]);
        %plot(x1,y1,'*');
    end
end
fprintf('The best X is --->>%5.2f\n',x2);
fprintf('The best Y is --->>%5.2f\n',bestfit);

关注我的博客,后续还会有详细的算法讲解,有条件的同学多多支持,也可以帮我推广一下哦~

发布了3 篇原创文章 · 获赞 20 · 访问量 7855

猜你喜欢

转载自blog.csdn.net/qq_42037420/article/details/104341187