原文转载自:https://blog.csdn.net/robert_chen1988/article/details/52431594

论文来源:

https://www.sciencedirect.com/science/article/pii/S0045782599003898

function [xm,fv]=GAEOQ1
%%初始目标函数与约束条件
%求解变量t, k, 目标函数 f,约束条件 g1
syms t k z;
f=100/t+25*(25*t+k*10*sqrt(1+1.25*t))+100*10*sqrt(1+1.25*t)*int((z-k)*normpdf(z,0,1),z,k,inf)/t;
tmin=1e-2;
tmax=4;
kmin=0;
kmax=2;
g1=1-200*sqrt(2+0.75*t)*int((z-k)*normpdf(z,0,1),z,k,inf)/(50*t);%%将约束标准化,将右端变为1
NP=50; %进化多少代

%%初始化种群,种群长度40
size=20;
E=zeros(20,5); %前两列为初始解,第三列为适应函数值,第四列记录是否为可行解,第五列记录违背约束条件的差值
E(:,1)=tmin+(tmax-tmin)*rand(size,1);
E(:,2)=kmin+(kmax-kmin)*rand(size,1);
fv=inf;%初始最优值为无穷大的值
D=zeros(NP,4);%用来记录每代的最优解,平均值,最差解,最优解是否为可行解

%%计算适应函数罚函数值,判断是否为可行解
for i=1:size
     B=zeros(1,1);
     B(1)=subs(g1,[t,k],E(i,(1:2)));
     if B(1)>=0
        E(i,4)=1;
        E(i,3)=subs(f,[t,k],E(i,(1:2)));
     else
        E(i,4)=0;
        E(i,3)=0;
     end
     if B(1)>=0
        B(1)=0;
     else
        B(1)=abs(B(1));
     end
     E(i,5)=B(1);
end
fmax=max(E(:,3));
for i=1:size
if E(i,4)<1e-6
    E(i,3)=fmax+E(i,5);
    end
end

%%遗传进化   %%到这步适应值还没出错
for g=1:NP    %%原来错误在这里,这个k跟前面的k重复了
     %%竞标赛选择  %%小生态技术
     M=zeros(size,2);%用来存储优胜者的中间矩阵
         for i=1:size
             %A=randperm(size,6);
             %dij1=sqrt(0.5*(E(A(1),1)-E(A(2),1))^2);  %%小生态技术,只有单界时小生态技术没法用
             %dij2=sqrt(0.5*(E(A(1),1)-E(A(3),1))^2);
             %dij3=sqrt(0.5*(E(A(1),1)-E(A(4),1))^2);
             %dij4=sqrt(0.5*(E(A(1),1)-E(A(5),1))^2);
             %dij5=sqrt(0.5*(E(A(1),1)-E(A(6),1))^2);
             %if dij1<0.1
                 %if E(A(1),3)<=E(A(2),3)
                     %M(i,:)=E(A(1),(1:2));
                 %else
                     %M(i,:)=E(A(2),(1:2));  
                 %end
                 %continue;
             %elseif dij2<0.1
                 %if E(A(1),3)<=E(A(3),3)
                     %M(i,:)=E(A(1),(1:2));
                 %else
                     %M(i,:)=E(A(3),(1:2));  
                 %end
                 %continue;
             %elseif dij3<0.1
                 %if E(A(1),3)<=E(A(4),3)
                     %M(i,:)=E(A(1),(1:2));
                 %else
                     %M(i,:)=E(A(4),(1:2));  
                 %end
                 %continue;
             %elseif dij4<0.1
                 %if E(A(1),3)<=E(A(5),3)
                     %M(i,:)=E(A(1),(1:2));
                 %else
                     %M(i,:)=E(A(5),(1:2));  
                 %end
                 %continue;
             %elseif dij5<0.1
                 %if E(A(1),3)<=E(A(6),3)
                     %M(i,:)=E(A(1),(1:2));
                 %else
                     %M(i,:)=E(A(6),(1:2));  
                 %end
             %else
                 %M(i,:)=E(A(1),(1:2));
             %end 
         %end
             A=randperm(size,2);
             if E(A(1),3)<=E(A(2),3)
                 M(i,:)=E(A(1),(1:2));
             else
                 M(i,:)=E(A(2),(1:2));
             end
         end

%%模拟二进制交叉生成后代
         for j=1:size/2
             if rand()>=0.5
                 A=randperm(size,2);
                 c=rand();
                 x2=max(M(A(1),1),M(A(2),1));
                 x1=min(M(A(1),1),M(A(2),1));
                 beita1_t=1+2*(x1-tmin)/(x2-x1);
                 rfa_t=2-beita1_t^(-2);
                 if c<=1/rfa_t
                     beita2_t=sqrt(rfa_t*c);
                 else
                     beita2_t=sqrt(1/(2-rfa_t*c));
                 end
                 E(2*j-1,1)=0.5*(x1+x2-beita2_t*(x2-x1));
                 E(2*j,1)=0.5*(x1+x2+beita2_t*(x2-x1));
             end
     %%只在可行解时出错是怎么回事?是不是变异的原因,已纠正
             if rand()>0.5
                 c=rand();
                 x2=max(M(A(1),2),M(A(2),2));
                 x1=min(M(A(1),2),M(A(2),2));
                 beita1_t=1+2*(x1-kmin)/(x2-x1);
                 rfa_t=2-beita1_t^(-2);
                 if c<=1/rfa_t
                     beita2_t=sqrt(rfa_t*c);
                 else
                     beita2_t=sqrt(1/(2-rfa_t*c));
                 end
                 E(2*j-1,2)=0.5*(x1+x2-beita2_t*(x2-x1));
                 E(2*j,2)=0.5*(x1+x2+beita2_t*(x2-x1));
             end
         end

%%变异,变异会不会导致可行解不可行?单下界时不用变异,设置判断条件防止过界
         for i=1:size
             nita=100+g;
             pm=1/size+g*(1-1/size)/NP;
             if rand()<pm
                 u=rand();
                 %x=E(i,1);
                 x=E(i,1);%%
                 deltamax=1;
                 if u<=0.5
                     delta_2=(2*u)^(1/(nita+1))-1;
                 else
                     delta_2=1-(2*(1-u))^(1/(nita+1));
                 end
                 if x+delta_2*deltamax>=tmin
                     E(i,1)=x+delta_2*deltamax;
                 end
             end
    
             if rand()<pm
                 u=rand();
                 x=E(i,2);
                 deltamax=1;
                 if u<=0.5
                     delta_1=(2*u)^(1/(nita+1))-1;
                 else
                     delta_1=1-(2*(1-u))^(1/(nita+1));
                 end
                 if x+delta_1*deltamax>=kmin
                     E(i,2)=x+delta_1*deltamax;
                 end
             end
         end
     %%计算子代罚函数值,判断是否满足可行解
     for i=1:size
         B(1)=subs(g1,[t,k],E(i,(1:2)));
         if B(1)>=0
             E(i,4)=1;
             E(i,3)=subs(f,[t,k],E(i,(1:2)));%%跟直接算的结果不一样,也跟EOQ得到的结果不一样 eval出错的原因
         else
             E(i,4)=0;
             E(i,3)=0;
         end
         if B(1)>=0
             B(1)=0;
         else
             B(1)=abs(B(1));
         end
         E(i,5)=B(1);
     end
     for i=1:size
         if E(i,4)<1e-6
             E(i,3)=fmax+E(i,5);
         end
     end      
     [Q,IX]=sort(E,1);
     %Q=vpa(Q,4);%%
     D(g,1)=Q(1,3);
     D(g,2)=mean(Q(:,3));
     D(g,3)=Q(size,3);
     D(g,4)=E(IX(1,3),4);
     if Q(1,3)<fv && D(g,4)==1
         fv=Q(1,3);
         xm=E(IX(1,3),(1:2));
         xm=[xm,E(IX(1,3),4)];
     end
end

%画图
k=1;
for i=1:NP
     if D(i,4)==1
         N(k,:)=D(i,:);
         k=k+1;
     end
end
        
plot(N(:,1),'r*');
hold on
plot(N(:,2),'b+');
hold on

plot(N(:,3),'ms');

legend('最优值','平均值','最差值');
hold off

end

侵删

Matlab调用遗传工具箱复现论文模型求解部分的更多相关文章

  1. matlab调用keras深度学习模型(环境搭建)

    matlab没有直接调用tensorflow模型的接口,但是有调用keras模型的接口,而keras又是tensorflow的高级封装版本,所以就研究一下这个……可以将model-based方法和le ...

  2. 相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)

    相机标定 一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标 ...

  3. Libsvm的MATLAB调用和交叉验证

    今天听了一个师兄的讲课,才发现我一直在科研上特别差劲,主要表现在以下几个方面,(现在提出也为了督促自己在以后的学习工作道路上能够避免这些问题) 1.做事情总是有头无尾,致使知识点不能一次搞透,每次在用 ...

  4. Matlab计算机视觉/图像处理工具箱推荐

    Matlab计算机视觉/图像处理工具箱推荐 转载http://cvnote.info/matlab-cv-ip-toolbox/ 计算机视觉/图像处理研究中经常要用到Matlab,虽然其自带了图像处理 ...

  5. MATLAB调用C程序、调试和LDPC译码

    MATLAB是一个很好用的工具.利用MATLAB脚本进行科学计算也特别方便快捷.但是代码存在较多循环时,MATLAB运行速度极慢.如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行 ...

  6. ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

    原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试 第一篇.GP降雨量等值线建模.发布及测试 在水利.气象等行业中,要在WebGIS中实现空间分 ...

  7. matlab添加M_map工具箱(转 http://blog.sina.com.cn/s/blog_491b86bf0100srt9.html)

    之前转载过matlab画世界地图的博文.最近正好用到.首先试了matlab自带的worldmap,感觉画出来的图形不尽如人意,比较杂乱.如下图. 略查阅了些资料,请教了Liangjing,一致推荐m_ ...

  8. matlab 调用 python

    众所周知,Python凭借其众多的第三方模块,近年来被数据分析.机器学习.深度学习等爱好者所喜爱,最主要的是Python还是开源的.另一方面,MATLAB因其在仿真方面的独特优势也被众多人追捧.而在国 ...

  9. 向量和矩阵的范数及MATLAB调用函数

    范数就是长度的一种推广形式,数学语言叫一种度量.比如有一个平面向量,有两个分量来描述:横坐标和纵坐标.向量的二范数就是欧几里得意义下的这个向量的长度.还有一些诸如极大值范数,就是横坐标或者纵坐标的最大 ...

随机推荐

  1. word20170102日用家电 household appliances

    1. Vacuum cleaner: 吸尘器 2.Cordless vacuum cleaner: 无线吸尘器 3.Robotic vacuum cleaner: 机器人吸尘器 动词:to vacuu ...

  2. nginx做80端口转发

    server { server_name zjrzb.cn listen 80; location / { proxy_pass http://127.0.0.1:8090; proxy_set_he ...

  3. python 类的魔法函数 内置函数 类方法 静态方法 抽象类

    魔法函数 __init__函数 init函数会在实例化A这个类的时候被调用 class A(): def __init__(self): print('__init__函数') a = A() 显示结 ...

  4. 读spring源码(三)-ClassPathXmlApplicationContext-getBean

    这次主要看了下bean的生成过程,发现个画时序图很好用的软件plantuml,充分发挥程序员的能力,能用代码解决的别叨叨别的

  5. 搜索表字段包含某字符串的SQL和监控Oracle数据库的SQL。

    1.第一个SQL 背景:需要找到SQL Server数据库中,包含某个字符串的表,输出表和包含该字符串的列. )='=' --这里填要搜索的字符串 DECLARE @sql NVARCHAR(MAX) ...

  6. 论文笔记:Mask R-CNN

    之前在一次组会上,师弟诉苦说他用 UNet 处理一个病灶分割的任务,但效果极差,我看了他的数据后发现,那些病灶区域比起整张图而言非常的小,而 UNet 采用的损失函数通常是逐像素的分类损失,如此一来, ...

  7. #20175204 张湲祯 2018-2019-2《Java程序设计》第六周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第六周学习总结 教材学习内容总结 -第七章内部类与异常类要点: 一.内部类: Java支持在一个类中定义另一个类,这样的 ...

  8. Git(1):版本库+工作区+暂存区

    参考博客:https://blog.csdn.net/qq_27825451/article/details/69396866

  9. 【转】JAVA错误:The public type *** must be defined in its own file***

    出现The public type xxx must be defined in its own file这个问题,是由于定义的JAVA类同文件名不一致.public类必须定义在它自己的文件中. 解决 ...

  10. 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】

    这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整 ...