智能计算作业——差分进化算法求解函数最值

下面是智能计算作业,哎呀,你们快来抄我作业呀╭(╯^╰)╮

问题描述:

智能计算作业——差分进化算法求解函数最值_第1张图片

算法理论我省略了,你们自己去百科上抄吧╭(╯^╰)╮

求解步骤:

(这个好像也是百科上的╭(╯^╰)╮我根据自己的需要改了一下)

(1)确定差分进化算法控制参数,确定适应度函数。差分进化算法控制参数包括:种群大小NP、变异算子F与交叉概率CR。

(2)随机产生初始种群。

(3)对初始种群进行评价,即计算初始种群中每个个体的适应度值。

(4)判断是否达到终止条件或进化代数达到最大。若是,则终止进化,将得到最佳个体作为最优解输

出;若否,继续。

(5)使用现行差分策略:

进行变异和交叉操作,得到中间种群。

(6)在原种群和中间种群中选择个体,得到新一代种群。

(7)进化代数g=g+1,转步骤(4)。

运行结果:

运用detest.m文件,得到的结果如下图所示:

会出现一个用户交互界面,亲自设计的,支持迭代数显示,支持调参╭(╯^╰)╮就问你骚不骚

智能计算作业——差分进化算法求解函数最值_第2张图片

在这里调整变异算子F和交叉概率CR的参数:

  1. 变异算子F=0.5,交叉系数CR=0.1:

智能计算作业——差分进化算法求解函数最值_第3张图片

当x(1)=-4.0000,x(2)=-3.9366时,函数最小值为-24.9329。

(2)变异算子F=0.6,交叉系数CR=0.5:

智能计算作业——差分进化算法求解函数最值_第4张图片

当x(1)=-3.9773,x(2)=-4.0000时,函数最小值为-24.8083。

(3)变异算子F=0.6,交叉系数CR=1.0:

智能计算作业——差分进化算法求解函数最值_第5张图片

当x(1)=-4.0000,x(2)=-3.9396时,函数最小值为-24.9322。

(4)变异算子F=0.1,交叉系数CR=0.5:

智能计算作业——差分进化算法求解函数最值_第6张图片

实验总结:

从图中看出,随着迭代次数的增加,目标函数逐渐向最小值靠拢。

交叉算子CR越大,收敛速度越快。变异算子F对结果的影响效果更小一些。

得到的最优结果在当x(1)=-4.0000,x(2)=-3.939时,函数最小值为-24.9332。

 

代码在这里:

这个是readme.txt文件内容(哦你在代码里面到处都要留下自己的名字才显得是你寄几写的呀╭(╯^╰)╮):

%  差分进化算法求解函数最值
%  姓名:
%  学号:
%  邮箱:
%  环境: MATLABR2017A
%  日期: 2018.10.3
%  运行说明: 运行detest.m即可弹出图形交互界面detest.gui
              输入参数:F和CR
              点击“运行”按钮即可运行程序;
              点击“重置”按钮恢复;
              支持当前迭代次数的实时显示。

这个是func2.m文件,里面只有一个我们要求解的函数啦╭(╯^╰)╮

function value=func2(x)  
  value=5*cos(x(1)*x(2))+4*x(1)+x(2);  
end  

这个是detest.m文件╭(╯^╰)╮运行的时候点这个

function varargout = detest(varargin)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  差分进化算法求解函数最值
%  姓名:
%  学号: 
%  邮箱:
%  环境: MATLABR2017a 
%  日期: 2018.10.3
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @detest_OpeningFcn, ...
                   'gui_OutputFcn',  @detest_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end


function detest_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
%打开按钮的背景图片
A = imread('A.jpg');
A = imresize(A,[100,100]);
set(handles.kaishi,'CData',A);
set(handles.rek,'CData',A);
% CR = handles.edit7;
% F = handles.edit8;
guidata(hObject, handles);



function varargout = detest_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;

%% 开始按钮
function kaishi_Callback(hObject, eventdata, handles)
%初始化参数设置
NP=20;     %种群数量
D=2;       %变量的维数
G=100;     %最大进化代数
CR = str2double(get(handles.edit7,'String'));
F = str2double(get(handles.edit8,'String'));
F
CR
Xs=4;      %上限
Xx=-4;     %下限

x=zeros(D,NP);       %初始种群
v=zeros(D,NP);       %变异种群
u=zeros(D,NP);       %选择种群
x=rand(D,NP)*(Xs-Xx)+Xx;  %赋初值

%计算适应度函数值
for m=1:NP
   Ob(m)=func2(x(:,m));
end
trace(1)=min(Ob);
%差分操作
for gen=1:G
    %% 提示迭代数
    set(handles.edit2,'String',num2str(gen));
    pause(0.01);
     %变异操作
     %r1,r2,r3和m互不相同
     for m=1:NP
        r1=randi([1,NP],1,1);%生成1—NP中间的随机数
        while(r1==m)
          r1=randi([1,NP],1,1);
        end
         r2=randi([1,NP],1,1);
         while(r2==m)|(r2==r1)
          r2=randi([1,NP],1,1);
         end
        r3=randi([1,NP],1,1);
         while((r3==m)|(r3==r1)|(r3==r2))
          r3=randi([1,NP],1,1);
         end
         v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
     end
     
     %交叉操作
     r=randi([1,NP],1,1);
     for n=1:D
         cr=rand(1);
         if(crXs
               u(n,m)=Xs;
           end
       end
     end
     %选择操作
     for m=1:NP
         Ob1(m)=func2(u(:,m));
     end
     
    for m=1:NP
        if Ob1(m)

还有一张图,这个是GUI界面的按钮的图╭(╯^╰)╮一定要保存在代码路径下,命名为‘A.png’,不然会报错:

好啦╭(╯^╰)╮就是这些啦,ctrl+c,ctrl+v交作业去吧

你可能感兴趣的:(作业)