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

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

问题描述:

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

求解步骤:

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

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

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

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

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

出;若否,继续。

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

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

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

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

运行结果:

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

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

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

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

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

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

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

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

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

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

实验总结:

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

交叉算子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(cr<CR)|(n==r)
           u(n,:)=v(n,:);
         else
            u(n,:)=x(n,:);
         end
     end
     
     %边界条件处理
     %边界吸收
     for n=1:D
       for m=1:NP
           if u(n,m)<Xx
               u(n,m)=Xx;
           end
           if u(n,m)>Xs
               u(n,m)=Xs;
           end
       end
     end
     %选择操作
     for m=1:NP
         Ob1(m)=func2(u(:,m));
     end
     
    for m=1:NP
        if Ob1(m)<Ob(m)      %小于先前的目标值
            x(:,m)=u(:,m);
        end
    end
    for m=1:NP
       Ob(m)=func2(x(:,m));
    end
    trace(gen+1)=min(Ob);
end
    [SortOb,Index]=sort(Ob);
    x=x(:,Index);
    X=x(:,1);          %最优变量
    Y=min(Ob);         %最优值
   %% 画进化曲线
  axes(handles.axes1)
  plot(trace);
  %plot(X,Y,'-ro');
  xlabel('迭代次数');
  ylabel('目标函数值');
  title('DE目标函数曲线');
  box on;
  %% 提示最优变量
   set(handles.edit5,'String',num2str(X(1,:)));
   set(handles.edit6,'String',num2str(X(2,:)));
   %% 提示最优值
   set(handles.edit4,'String',num2str(Y));
   %% 画函数图像
   axes(handles.axes2)
   nPlot = 100;
   bound = [-4 4 -4 4];
   xx = linspace(bound(1),bound(2),nPlot);
   yy = linspace(bound(3),bound(4),nPlot);
   [xx,yy] = meshgrid(xx,yy);
   zz = 5*cos(xx.*yy)+4.*xx+yy;
   mesh(xx,yy,zz);
   %text('Interpreter','latex','String','$$ f(x)=5*cos(x(1)*x(2))+4*x(1)+x(2)$$','Position',[0 0]);%用latex格式打印公式
%% 重置按钮
function rek_Callback(hObject, eventdata, handles)
cla(handles.axes1);
cla(handles.axes2);
set(handles.edit2,'String','');
set(handles.edit4,'String','');
set(handles.edit5,'String','');
set(handles.edit6,'String','');
set(handles.edit7,'String','');
set(handles.edit8,'String','');

function edit2_Callback(hObject, eventdata, handles)

function edit2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit4_Callback(hObject, eventdata, handles)

function edit4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit5_Callback(hObject, eventdata, handles)

function edit5_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit6_Callback(hObject, eventdata, handles)

function edit6_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit7_Callback(hObject, eventdata, handles)
% hObject    handle to edit7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit7 as text
%        str2double(get(hObject,'String')) returns contents of edit7 as a double


% --- Executes during object creation, after setting all properties.
function edit7_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit8_Callback(hObject, eventdata, handles)
% hObject    handle to edit8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit8 as text
%        str2double(get(hObject,'String')) returns contents of edit8 as a double


% --- Executes during object creation, after setting all properties.
function edit8_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

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

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

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值