📄 matlab的差分算法实现.m
字号:
function dedemov(action);
% DE function minimization demonstration.
% dedemov is called with no parameters.
%
% Differential Evolution for MATLAB
% Copyright (C) 1996 R. Storn
% International Computer Science Institute (ICSI)
% 1947 Center Street, Suite 600
% Berkeley, CA 94704
% E-mail: storn@icsi.berkeley.edu
% WWW: http://http.icsi.berkeley.edu/~storn
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 1, or (at your option)
% any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details. A copy of the GNU
% General Public License can be obtained from the
% Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
if nargin<1, %---number of arguments less than one ?
action='initialize';
end;
if strcmp(action,'initialize'),
%---Header of Window--------------------------------
figNumber=figure( ...
'Name','Differential Evolution Demo', ...
'NumberTitle','off', ...
'Visible','off');
%---define area for graphics------------------------
axes( ...
'Units','normalized', ...
'Visible','off', ...
'Position',[0.1 0.35 0.60 0.75]);
%---Set up the Comment Window-----------------------
top1=0.25;
left1=0.05;
right1=0.75;
bottom1=0.05;
labelHt1=0.05;
spacing1=0.005;
promptStr=str2mat(' ',...
' This demo shows the track of the best', ...
' population member for each generation.');
%---First, the MiniCommand Window frame------------------------
frmBorder=0.02;
frmPos1=[left1-frmBorder bottom1-frmBorder ...
(right1-left1)+2*frmBorder (top1-bottom1)+2*frmBorder];
uicontrol( ...
'Style','frame', ...
'Units','normalized', ...
'Position',frmPos1, ...
'BackgroundColor',[0.5 0.5 0.5]);
%---Then the text label----------------------------------------
labelPos1=[left1 top1-labelHt1 (right1-left1) labelHt1];
uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',labelPos1, ...
'BackgroundColor',[0.5 0.5 0.5], ...
'ForegroundColor',[1 1 1], ...
'String','Comment Window');
%---Then the editable text field-------------------------------
txtPos1=[left1 bottom1 (right1-left1) top1-bottom1-labelHt1-spacing1];
txtHndl=uicontrol( ...
'Style','edit', ...
'Units','normalized', ...
'Max',10, ...
'BackgroundColor',[1 1 1], ...
'Position',txtPos1, ...
'Callback','dedemov(''eval'')', ...
'String',promptStr);
%---Save the text handle for future use------------------------
set(gcf,'UserData',txtHndl)
%==============================================================
%---Information for all buttons (and menus)--------------------
labelColor=[0.8 0.8 0.8];
yInitPos=0.90;
menutop=0.95;
btnTop = 0.6;
top=0.75;
left=0.785;
btnWid=0.175;
btnHt=0.06;
textHeight = 0.05;
textWidth = 0.06;
%---Spacing between the button and the next command's label
spacing=0.019;
%---The CONSOLE frame------------------------------------------
frmBorder=0.019; frmBottom=0.04;
frmHeight = 0.92; frmWidth = btnWid;
yPos=frmBottom-frmBorder;
frmPos=[left-frmBorder yPos frmWidth+2*frmBorder frmHeight+2*frmBorder];
h=uicontrol( ...
'Style','frame', ...
'Units','normalized', ...
'Position',frmPos, ...
'BackgroundColor',[0.5 0.5 0.5]);
%===Define the individual selection items======================
%---The DE strategy Selection Menu-----------------------------
btnNumber=1;
yPos=menutop-(btnNumber-1)*(btnHt+spacing);
btnPos=[left yPos-btnHt btnWid btnHt];
labelStr='rand/1|best/1|best/2|rtb/1|rand/2';
callbackStr='dedemov(''changemethod'');';
MethodHndl=uicontrol( ...
'Style','popupmenu', ...
'Units','normalized', ...
'Position',btnPos, ...
'String',labelStr, ...
'Interruptible','yes', ...
'Callback',callbackStr);
%---Size of Population NP--------------------------------------
btnNumber=1;
yPos=menutop-(btnNumber-1)*(btnHt+spacing);
top = yPos - btnHt - spacing;
labelWidth = frmWidth-textWidth-.01;
labelBottom=top-textHeight;
labelLeft = left;
labelPos = [labelLeft labelBottom labelWidth textHeight];
h = uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',labelPos, ...
'Horiz','left', ...
'String','NP', ...
'Interruptible','no', ...
'BackgroundColor',[0.5 0.5 0.5], ...
'ForegroundColor','white');
%---Weighting factor F-----------------------------------------
btnNumber=2;
yPos=menutop-(btnNumber-1)*(btnHt+spacing);
top = yPos - btnHt - spacing;
labelWidth = frmWidth-textWidth-.01;
labelBottom=top-textHeight;
labelLeft = left;
labelPos = [labelLeft labelBottom labelWidth textHeight];
h = uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',labelPos, ...
'Horiz','left', ...
'String','F', ...
'Interruptible','no', ...
'BackgroundColor',[0.5 0.5 0.5], ...
'ForegroundColor','white');
%---Crossover probability CR-----------------------------------
btnNumber=3;
yPos=menutop-(btnNumber-1)*(btnHt+spacing);
top = yPos - btnHt - spacing;
labelWidth = frmWidth-textWidth-.01;
labelBottom=top-textHeight;
labelLeft = left;
labelPos = [labelLeft labelBottom labelWidth textHeight];
h = uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',labelPos, ...
'Horiz','left', ...
'String','CR', ...
'Interruptible','no', ...
'BackgroundColor',[0.5 0.5 0.5], ...
'ForegroundColor','white');
%---Maximum number of iterations itermax------------------------
btnNumber=4;
yPos=menutop-(btnNumber-1)*(btnHt+spacing);
top = yPos - btnHt - spacing;
labelWidth = frmWidth-textWidth-.01;
labelBottom=top-textHeight;
labelLeft = left;
labelPos = [labelLeft labelBottom labelWidth textHeight];
h = uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',labelPos, ...
'Horiz','left', ...
'String','itermax', ...
'Interruptible','no', ...
'BackgroundColor',[0.5 0.5 0.5], ...
'ForegroundColor','white');
%---Text field---------------------------------------------------
textPos = [labelLeft+labelWidth-.015 labelBottom textWidth+.025 7*.85*textHeight];
callbackStr = 'dedemov(''setContr'')';
%---Enter the default values-------------------------------------
str = sprintf('15\n\n0.9\n\n0.9\n\n200');
mat = [15; 0.9; 0.9; 200]; % default values
CvarsHndl = uicontrol( ...
'Style','edit', ...
'Units','normalized', ...
'Position',textPos, ...
'Max',2, ... % makes this a multiline edit object
'Horiz','right', ...
'Background','white', ...
'Foreground','black', ...
'String',str,'Userdata',mat, ...
'callback',callbackStr);
%---The INFO button-----------------------------------------------
uicontrol( ...
'Style','push', ...
'Units','normalized', ...
'Position',[left bottom1+btnHt+spacing btnWid btnHt], ...
'String','Info', ...
'Callback','dedemov(''info'')');
%---The CLOSE button--------------------------------------------
uicontrol( ...
'Style','push', ...
'Units','normalized', ...
'Position',[left bottom1 btnWid btnHt], ...
'String','Close', ...
'Callback','close(gcf)');
%---Get Handles--------------------------------------------------
chndlList=[MethodHndl CvarsHndl txtHndl];
%---Now uncover the figure-----------------------------------
set(figNumber, ...
'Visible','on', ...
'UserData',chndlList);
dedemov('demobutton') %---> Go and optimize
return
%===Different actions============================================
%---Modified control variables-----------------------------------
elseif strcmp(action,'setContr'),
v = get(gco,'Userdata');
str = get(gco,'String');
ind = find(abs(str)<32);
str(ind) = 32*ones(size(ind));
str = str';
vv = eval(['[' str(:)' ']'],'-1')';
if vv == -1
vv = v;
elseif length(vv)~=4 %must be 4 items as specified above
vv = v;
end
str = sprintf('%g\n\n%g\n\n%g\n\n%g\n\n%g\n\n%g',vv(1),vv(2),vv(3),vv(4));%,...
%vv(5), vv(6));
set(gco,'Userdata',vv,'String',str) %take new data
dedemov('demobutton') %---> Go and optimize
return
%---Modified method----------------------------------------------
elseif strcmp(action,'changemethod'),
v = get(gco,'value'); % 1 = DE/rand/1, 2 = DE/best/1, 3 = DE/best/2,
% 4 = DE/rand-to-best/1, 5 = DE/rand/2
chndlList = get(gcf,'UserData');
dedemov('demobutton') %---> Go and optimize
return
%-----Start optimization-----------------------------------
elseif strcmp(action,'demobutton'),
%---Plotting the banana function---------------------------
cla reset;
%axis off;
x=-2:.2:2;
y=-1:.2:3;
[xx,yy]=meshgrid(x,y);
zz=100*(yy-xx.^2).^2+(1-xx).^2;
%---Set up the appropriate colormap--------------------------------------
%---In this case, the colormap has been chosen to give the surface plot--
%---a nice healthy banana color.-----------------------------------------
hsv2=hsv;
hsv3=[hsv2(11:64,:); hsv2(1:10,:)];
%---draw the surface plot-----------------------
surfHndl=surface(x,y,zz,'EdgeColor',[.8 .8 .8]);
axis([-2 2 -2 2]);
text(-1,-3,'x(1)'); %---substitute for xlabel
ylabel('x(2)');
%axis off;
view(10,55);
colormap(hsv3);
hold on;
[c,contHndl]=contour3(x,y,zz+50,[100 500],'k');
set(contHndl,'Color',[.8 .8 .8]);
drawnow
plot3(1,1,0,'ko', ...
'MarkerSize',15, ...
'LineWidth',2, ...
'EraseMode','none');
text(0.8,1.4,0,' goal', ...
'Color',[0 0 0], ...
'EraseMode','none');
%---Get handles----------------------------------------
chndlList=get(gcf,'Userdata');
MethodHndl = chndlList(1);
CvarsHndl = chndlList(2);
txtHndl = chndlList(3);
%---initialize variables-------------------------------
cvars = get(CvarsHndl,'UserData');
NP = cvars(1); % population size
F = cvars(2); % weighting factor
CR = cvars(3); % crossover probability
itermax = cvars(4); % maximum number of iterations
strategy = get(MethodHndl,'value');
D = 2;
%---as a reminder labelStr='rand/1|best/1|best/2|rtb/1';
%---Now run the DE demo eventually---------------------
[bestmem,nfeval]=devec(NP,D,F,CR,itermax,strategy);
str1=sprintf(' x(1) = %d x(2) = %d',bestmem(1),bestmem(2));
str2=sprintf(' Number of function evaluations: %d', nfeval);
%str1=get(txtHndl,'String');
strout=str2mat(str1,' ',str2);
set(txtHndl,'String',strout);
%---Info button----------------------------------------
elseif strcmp(action,'info'),
ttlStr=get(gcf,'Name');
hlpStr= ...
[' '
' This demonstration shows the minimization '
' of Rosenbrock''s "banana function": '
' '
' f(x)= 100*(x(2)-x(1)^2)^2+(1-x(1))^2 '
' '
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -