1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > matlab_多目标遗传算法

matlab_多目标遗传算法

时间:2021-01-29 14:59:31

相关推荐

matlab_多目标遗传算法

前言

之前写过在python中的多目标遗传算法了,但是很可惜的是python调用商用有限元软件比较费事,需要在ironpython的编译环境下调用,然后这个ironpython它又是个老古董,不支持pandas和numpy这些python必备的第三方库(内心是崩溃的)。没办法,被迫向matlab低头。从头学起来吧,好在有了python的基础学matlab也是比较容易的。

代码实现

这个代码水平写得比较low,毕竟我刚学matlab,多多包含。相关的理论说明在我之前的博客中给出了,在此就不赘述了,理论说明贴个链接:

Python_多目标遗传算法_入门学习+代码实现

直接上代码了哈。首先是两个待优化的函数。

function y=fun1(x)%optimal function oney=(x-1)^2;end

function y=fun2(x)%optimal function twoy=cos(x);end

接着就是算法进化过程了:

%%get initial parameterNP=70; L=10; Pc=0.8; Pm=0.2; G=30; %迭代次数 Xs=pi/2; Xx=0;%% generate Primary populationf=randi([0,1],NP,L);x=zeros(1,NP*2);tempx=zeros(1,NP*2);f1trace=[];f2trace=[];%% begin to Iterationfor i=1:1:Gdisp([i]);%pause(10);f1=zeros(1,NP*2);f2=zeros(1,NP*2);nf=f;for M=1:2:NPp=rand();if p<Pcq=randi([0,1],1,L);for j=1:1:Lif q(j)==1tempsize=nf(M+1,j);nf(M+1,j)=nf(M,j);nf(M,j)=tempsize;endendendendj=1;while j<=NP*Pmh=randi(NP);for k=1:1:round(NP*Pm)g=randi(L);nf(h,g)=~nf(h,g);endj=j+1;endnewf=[f;nf]; %垂直方向合并两个矩阵tempsize=size(newf);for j = 1:1:tempsize(1)U=newf(j,:);m=0;for k =1:1:Lm=U(k)*2^(k-2)+m;endx(j)=Xx+m*(Xs-Xx)/(2^(L-1));f1(j)=func(x(j));f2(j)=func1(x(j)); %f1,f2都是预先分配好内存了的,避免了append的使用endlenfs=length(f1)*2;fs=zeros(1,lenfs);for j=1:2:lenfsfs(j)=f1((j+1)/2);fs(j+1)=f2((j+1)/2);endfs=reshape(fs,2,lenfs/2);ps=zeros(length(f1),length(f1));for k =1:1:length(f1)for j = 1:1:length(f1)if fs(1,k)<fs(1,j) && fs(2,k)<fs(2,j)ps(k,j)=1;elseif fs(1,k)<fs(1,j) && fs(2,k)==fs(2,j)ps(k,j)=1;elseif fs(1,k)==fs(1,j) && fs(2,k)<fs(2,j)ps(k,j)=1;endendendjishu=zeros(1,length(f1)); %问题记录,把数值大的点筛出来了的,判断语句没问题,但是结果中for k = 1:1:length(f1) %又出现数值大的点了,这些点从何处来?tempa=0;for j = 1:1:length(f1)if ps(j,k)==1tempa=tempa+1;endendjishu(k)=tempa;end[num,index]=sort(jishu);uninum=unique(num);%向量去重front=cell(1,length(uninum));for k =1:1:length(uninum)temmat=[];for j =1:1:length(index)if num(j)==uninum(k)temmat=[temmat,index(j)]; %记录对应索引endendfront{k}=temmat;endf=[];for j = 1:1:length(front)if length(f)==NPbreakendtempf=[];for k=1:1:length(front{j})tempf=[tempf;newf(front{j}(k),:)];endtempf1=[];tempf2=[];[widtemf,wif_]=size(tempf);for M = 1:1:widtemfU=tempf(M,:);m=0;for k =1:1:Lm=m+U(k)*(2^(k-2));endxtemp=Xx+m*(Xs-Xx)/(2^(L-1));tempf1=[tempf1,func(xtemp)];tempf2=[tempf2,func1(xtemp)];end[temp1sort,temp1index]=sort(tempf1);distance=zeros(1,length(tempf1));distance(temp1index(1))=inf;distance(temp1index(end))=-inf;for k=1:1:length(temp1index)-1if abs(distance(temp1index(k)))<10distace(temp1index(k))=(tempf1(temp1index(k+1))-tempf1(temp1index(k-1)))/(max(tempf1)-min(tempf1));elsecontinueendend[temp2sort,temp2index]=sort(tempf2);distance1=zeros(1,length(tempf2));distance1(temp2index(1))=inf;distance1(temp2index(end))=-inf;for k=1:1:length(temp2index)-1if abs(distance1(temp2index(k)))<10distace1(temp2index(k))=(tempf2(temp2index(k+1))-tempf2(temp2index(k-1)))/(max(tempf2)-min(tempf2));elsecontinueendendsumdis=[];for k =1:1:length(distance)sumdistance=distance(k)+distance1(k);sumdis=[sumdis,sumdistance];end[dis_,disindex]=sort(sumdis,'descend');for k=1:1:length(sumdis)f=[f;tempf(disindex(k),:)];if length(f)==NPbreakendend% f=reshape(f,length(f)/L,L);f1=[];f2=[];[lenf,wid_]=size(f);for j=1:1:lenfU=f(j,:);m=0;for k =1:1:Lm=m+U(k)*(2^(k-2));endx(j)=Xx+m*(Xs-Xx)/(2^(L-1));f1=[f1,func(x(j))];f2=[f2,func1(x(j))];endendname=['F:/单轨吊驱动电机/maxwell调用/测试/pic/','pareto',num2str(i),'.png']; %保存图片到指定文件夹并命名plot(f1,f2,'o','MarkerSize',7);set(gca,'FontName','Times New Roman');grid ontitle('优化前沿曲线','FontName','宋体');xlabel('f1value')ylabel('f2value')saveas(gcf, name);end

最后的话

代码的确写得比较不堪入目,但是结果是好的,功能可以保证实现。

第一代优化结果:

第30代结果:

再多说两句,之前一直用python,就不想去学matlab,限制在自己的舒服区了,之后还是要多尝试尝试,不能一直止步不前。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。