📄 differentialevolution.m
字号:
% evaluate initial population members
for memberNr = 1:NP
if initialization && memberNr == 1
startLoopTime = mbtime;
end
% evaluate member
[val(memberNr), pop(memberNr,:), nfeval, allval, allmem] = ...
computeevaluationvalue__(pop(memberNr,:), nfeval, timeOver, ...
objFctParams, paramDefCell, parameterDimVector, objFctSettings, ...
objFctHandle, saveHistory, allval, allmem, iterationNr, ...
memberNr, NP, slaveFileDir, maxMasterEvals, validChkHandle, XVmin, XVmax);
if initialization && memberNr == 1
% set initial value
bestval = val(1); % best cost value so far
bestmem = pop(1,:); % best member so far
initval = bestval;
initmem = bestmem;
% check
if ~isfinite(bestval)
error('Initial parameter vector may not be invalid.');
end
% display initial member
state = 'Initial parameter set.';
displaybestmember__(paramDefCell, parameterDimVector, bestval, bestmem, ...
allval, initval, initmem, 1, state, optimInfo, sendEmail, playSound);
% save initial state
if saveHistory
saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
bestval, bestmem, bestval, bestmem, 0, 0, pop, val, startTime, ...
state, DEParams, allval, allmem, objFctName, ...
objFctSettings, objFctParams, 0, 0);
end
% display time needed for first function evaluation
if mbtime - startLoopTime > 1
disp(sprintf('First function evaluation time: %s\n', ...
formattime(mbtime - startLoopTime)));
end
else
% check if current member is overall best
if isfinite(val(memberNr)) && (val(memberNr) * minMaxSign < bestval * minMaxSign)
bestval = val(memberNr);
bestmem = pop(memberNr,:);
end
% set current state
if initialization
state = sprintf('In initialization, %d of %d members checked.', ...
memberNr, NP);
else
state = sprintf('In iteration %d, %d of %d members re-initialized.', ...
iterationNr, memberNr, NP);
end
end
% display best member
displaybestmember__(paramDefCell, parameterDimVector, bestval, bestmem, ...
allval, initval, initmem, 0, state, optimInfo, sendEmail, playSound);
% save and display current state
if mbtime - nextRefreshTime >= 0
nextRefreshTime = nextRefreshTime + refreshtime * ...
(1 + floor((mbtime - nextRefreshTime) / refreshtime));
disp(state);
if saveHistory
saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
bestval, bestmem, bestval, bestmem, 0, 0, pop, val, startTime, ...
state, DEParams, allval, allmem, objFctName, ...
objFctSettings, objFctParams, 0, 0);
end
end
% display progress information
if mbtime - nextRefreshTime2 >= 0
nextRefreshTime2 = nextRefreshTime2 + refreshtime2 * ...
(1 + floor((mbtime - nextRefreshTime2) / refreshtime2));
displayprogressinfo__(startLoopTime, state, refreshtime3, ...
maxtime, maxclock, timeOver, nfeval, nOfPossibleMembers, pop, ...
bestval, allval, optimInfo, sendEmail);
end
% display mean function evaluation time
if displayMeanEvalTime && nfeval.local == 5 && mbtime - startLoopTime > 1
disp(sprintf('Mean function evaluation time after %d runs: %s\n', ...
nfeval.local, formattime((mbtime - startLoopTime) / nfeval.local)));
displayMeanEvalTime = false;
end
% check time
timeOver = timeovercheck__(startTime, maxtime, maxclock, timeOverFileName, timeOver);
end % for memberNr = 1:NP
iterationNr = iterationNr + 1;
end % if initialization || reinitialization
if timeOver
break
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% compute competing population %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% In function computenewpopulation, you can place your own favorite algorithm!
popold = pop;
popnew = computenewpopulation(pop, bestmem, DEParams);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% check which vectors are allowed to enter the new population %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% feed slave process
if feedSlaveProc
generatefilesforslaveprocess__(objFctHandle, objFctParams, ...
objFctSettings, paramDefCell, parameterDimVector, popnew, allmem, ...
iterationNr, saveHistory, slaveFileDir, validChkHandle);
end
for memberNr = 1:NP
% check cost of competitor
[tempval, popnew(memberNr,:), nfeval, allval, allmem] = ...
computeevaluationvalue__(popnew(memberNr,:), nfeval, timeOver, ...
objFctParams, paramDefCell, parameterDimVector, objFctSettings, ...
objFctHandle, saveHistory, allval, allmem, iterationNr, ...
memberNr, NP, slaveFileDir, maxMasterEvals, validChkHandle);
if isfinite(tempval)
% if competitor is better than value in cost array or old vector was
% not evaluated (tempval = NaN), replace old vector with new one (for
% new iteration) and save value in cost array
if (tempval * minMaxSign < val(memberNr) * minMaxSign) || ~isfinite(val(memberNr))
pop(memberNr,:) = popnew(memberNr,:);
val(memberNr) = tempval;
% if competitor is better than the best one ever, set new best value
% and set new best parameter vector ever
if (tempval * minMaxSign < bestval * minMaxSign)
bestval = tempval;
bestmem = popnew(memberNr,:);
end
end
end
% display best member
state = sprintf('In iteration %d, %d of %d competitors checked.', iterationNr, memberNr, NP);
displaybestmember__(paramDefCell, parameterDimVector, bestval, bestmem, ...
allval, initval, initmem, 0, state, optimInfo, sendEmail, playSound);
% save and display current state
if mbtime - nextRefreshTime >= 0
nextRefreshTime = nextRefreshTime + refreshtime * ...
(1 + floor((mbtime - nextRefreshTime) / refreshtime));
disp(state);
if saveHistory
saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
bestval, bestmem, bestvalhist, bestmemhist, valstddevhist, ...
paramstddevhist, pop, val, startTime, state, DEParams, allval, allmem, ...
objFctName, objFctSettings, objFctParams, 0, 0);
end
end
% display progress information
if mbtime - nextRefreshTime2 >= 0
nextRefreshTime2 = nextRefreshTime2 + refreshtime2 * ...
(1 + floor((mbtime - nextRefreshTime2) / refreshtime2));
displayprogressinfo__(startLoopTime, state, refreshtime3, maxtime, ...
maxclock, timeOver, nfeval, nOfPossibleMembers, pop, bestval, ...
allval, optimInfo, sendEmail);
end
% check time
timeOver = timeovercheck__(startTime, maxtime, maxclock, timeOverFileName, timeOver);
end % for memberNr = 1:NP
%%%%%%%%%%%%%%%%%%%%
% finish iteration %
%%%%%%%%%%%%%%%%%%%%
% compute cost value and population standard deviation
index = ~isnan(val);
valstddev = std(val(index));
paramstddev = max(std(pop(index,:),0,1)' ./ diff(cell2mat(paramDefCell(:,2)),1,2));
% check if population has changed
if isequal(pop, popold)
noChangeCounter = noChangeCounter + 1;
else
noChangeCounter = 0;
end
% check if any function evaluation was done
if nfeval.last == nfeval.local
nofevalCounter = nofevalCounter + 1;
else
nofevalCounter = 0;
end
% save history
if saveHistory
bestvalhist (end+1) = bestval; %#ok
bestmemhist (:,end+1) = bestmem'; %#ok
valstddevhist (end+1) = valstddev; %#ok
paramstddevhist(end+1) = paramstddev; %#ok
% check if all possible members have been computed
if length(allval) >= nOfPossibleMembers
timeOver = true;
end
end
% check time
if timeOver
break
end
% display current state
if ((DEParams.refreshiter > 0) && (rem(iterationNr, DEParams.refreshiter) == 0)) && ...
mbtime - lastRefreshIterTime > 10
lastRefreshIterTime = mbtime; % avoid many lines of output if no evaluations were done
disp(sprintf('Iteration %d finished.', iterationNr));
end
iterationNr = iterationNr + 1;
end % while (iterationNr < DEParams.maxiter) ...
%%%%%%%%%%%%%%%%%%%%%%%%
% display final result %
%%%%%%%%%%%%%%%%%%%%%%%%
disp(' ');
disp(repmat('*', 1, textWidth)); % ***************
% display why optimization was finished
if iterationNr >= DEParams.maxiter
state = sprintf('''%s'' finished after given maximum number of %d iterations.', ...
optimInfo.title, DEParams.maxiter);
elseif ~isempty(VTR) && (bestval * minMaxSign <= VTR * minMaxSign)
state = sprintf('''%s'' finished after specified cost value of %2.6g was reached.', ...
optimInfo.title, VTR);
elseif length(allval) >= nOfPossibleMembers
state = sprintf('''%s'' finished after all possible %d members have been tested.', ...
optimInfo.title, nOfPossibleMembers);
elseif timeOver
if ~isempty(maxtime) && mbtime - startTime > maxtime
state = sprintf('''%s'' finished after given amount of time.', optimInfo.title);
elseif ~isempty(maxclock) && etime(clock, maxclock) > 0
state = sprintf('''%s'' finished at given end time.', optimInfo.title);
elseif ~isempty(timeOverFileName) && ~existfile(timeOverFileName);
state = sprintf('''%s'' finished after ''time over''-file was deleted.', optimInfo.title);
end
end
disp(textwrap2(state, textWidth));
displayprogressinfo__(startLoopTime, state, [], maxtime, maxclock, 1, ...
nfeval, nOfPossibleMembers, pop, bestval, allval, optimInfo, sendEmail);
state = sprintf('Final result after %d iteration(s).', iterationNr);
displaybestmember__(paramDefCell, parameterDimVector, bestval, bestmem, allval, ...
initval, initmem, 1, state, optimInfo, sendEmail, playSound);
% save final result
if saveHistory
saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
bestval, bestmem, bestvalhist, bestmemhist, valstddevhist, paramstddevhist, ...
pop, val, startTime, state, DEParams, allval, allmem, objFctName, ...
objFctSettings, objFctParams, 1, 1);
end
disp(repmat('*', 1, textWidth)); % ***************
% display optimization parameter history
if displayResults && saveHistory
displayoptimizationhistory(paramDefCell, allmem, allval);
end
% remove all remaining slave files
if exist(slaveFileDir, 'dir')
remainingSlaveFiles = findfiles(slaveFileDir, 'iteration_*_member_*_*.mat', 'nonrecursive');
deletewithsemaphores(remainingSlaveFiles);
end
% remove time-over file
if existfile(timeOverFileName)
delete(timeOverFileName);
end
if nargout > 0
% compute parameter set with best member
[bestFctParams, bestmem] = considerparametercontraints__(...
objFctParams, paramDefCell, parameterDimVector, bestmem);
varargout = {bestmem', bestval, bestFctParams, iterationNr};
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function timeOver = timeovercheck__(startTime, maxtime, maxclock, timeOverFile, timeOver)
persistent lastCheckTime
if isempty(lastCheckTime)
lastCheckTime = mbtime;
end
if timeOver
return
end
curTime = mbtime;
if curTime - lastCheckTime > 1
% only check once a second to save computation time
timeOver = ...
(~isempty(maxtime) && ((curTime - startTime) > maxtime || maxtime == 0)) || ...
(~isempty(maxclock) && etime(clock, maxclock) > 0) || ...
(~isempty(timeOverFile) && ~existfile(timeOverFile));
lastCheckTime = curTime;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function valid = alwaysvalid__(varargin) %#ok
valid = true;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function checkinputs__(paramDefCell, objFctParams)
textWidth = 75;
% check dimensions of paramDefCell
if ~iscell(paramDefCell)
error('Input argument paramDefCell has to be a cell array.');
end
if isempty(paramDefCell)
error('Input argument paramDefCell must not be empty.');
end
if size(paramDefCell, 2) < 3 || size(paramDefCell, 2) > 4
error('Input argument paramDefCell has to consist of three or four columns.');
end
% check parameter names
for m = 1:size(paramDefCell, 1)
for n = m+1:size(paramDefCell, 1)
if strcmp(paramDefCell{m,1}, paramDefCell{n,1})
error(['Parameter names in paramDefCell have to be unique. Parameter ', ...
'name %s was found twice.'], paramDefCell{m,1});
end
end
end
% check dimensions of cell contents
for k = 1:size(paramDefCell, 1)
if (k > 1 && (isempty((paramDefCell{k,1})) || ~ischar(paramDefCell{k,1}))) || ...
k == 1 && ~ischar(paramDefCell{k,1})
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -