⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 differentialevolution.m

📁 This contribution provides functions for finding an optimum parameter set using the evolutionary alg
💻 M
📖 第 1 页 / 共 5 页
字号:
		% 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 + -