下面是智能计算作业,哎呀,你们快来抄我作业呀╭(╯^╰)╮
问题描述:
算法理论我省略了,你们自己去百科上抄吧╭(╯^╰)╮
求解步骤:
(这个好像也是百科上的╭(╯^╰)╮我根据自己的需要改了一下)
(1)确定差分进化算法控制参数,确定适应度函数。差分进化算法控制参数包括:种群大小NP、变异算子F与交叉概率CR。
(2)随机产生初始种群。
(3)对初始种群进行评价,即计算初始种群中每个个体的适应度值。
(4)判断是否达到终止条件或进化代数达到最大。若是,则终止进化,将得到最佳个体作为最优解输
出;若否,继续。
(5)使用现行差分策略:
进行变异和交叉操作,得到中间种群。
(6)在原种群和中间种群中选择个体,得到新一代种群。
(7)进化代数g=g+1,转步骤(4)。
运行结果:
运用detest.m文件,得到的结果如下图所示:
会出现一个用户交互界面,亲自设计的,支持迭代数显示,支持调参╭(╯^╰)╮就问你骚不骚
在这里调整变异算子F和交叉概率CR的参数:
当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(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交作业去吧