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

📄 differentialevolution.m

📁 非常好的差分进化matlab程序
💻 M
📖 第 1 页 / 共 5 页
字号:

				% save initial state
				saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
					bestval, bestmem, bestval, bestmem, 0, 0, pop, val, startTime, ...
					state, DEParams, allval, allmem, objFctName, ...
					objFctSettings, objFctParams, 0, 0);

				% 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 (val(memberNr) < bestval)
					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);
				saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
					bestval, bestmem, bestval, bestmem, 0, 0, pop, val, startTime, ...
					state, DEParams, allval, allmem, objFctName, ...
					objFctSettings, objFctParams, 0, 0);
			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);
	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);

		if ~isnan(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 < val(memberNr) || ...       
					isnan(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 < bestval)                
					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);
			saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
				bestval, bestmem, bestvalhist, bestmemhist, valstddevhist, ...
				paramstddevhist, pop, val, startTime, state, DEParams, allval, allmem, ...
				objFctName, objFctSettings, objFctParams, 0, 0);
		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(DEParams.VTR) && (bestval <= DEParams.VTR)
	state = sprintf('''%s'' finished after specified cost value of %2.6g was reached.', ...
		optimInfo.title, DEParams.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
saveoptimizationresult__(paramDefCell, parameterDimVector, optimInfo, ...
	bestval, bestmem, bestvalhist, bestmemhist, valstddevhist, paramstddevhist, ...
	pop, val, startTime, state, DEParams, allval, allmem, objFctName, ...
	objFctSettings, objFctParams, 1, 1);
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,nfeval.local};
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 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 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})
		error(['All cells in the first column of paramDefCell have to contain ', ...
			'non-empty strings (except when there is only one row).']);
	end
	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
	if isempty(paramDefCell{k,2}) || size(paramDefCell{k,2}, 2) ~= 2
		error(textwrap2(['All cells in the second column of paramDefCell have to ', ...
			'contain matrices with two columns (the parameter limits).'], textWidth));
	end
	if any(~isfinite(paramDefCell{k,2}))
		error(textwrap2(['The parameter limit matrices may not contain Inf or NaN. ', ...
			'You have to provide hard parameter bounds in any case, sorry.'], textWidth));
	end
	if isempty(paramDefCell{k,3}) || size(paramDefCell{k,3}, 2) ~= 1
		error(textwrap2(['All cells in the third column of paramDefCell have to ', ...
			'contain scalars or column vectors (the parameter quantizations).'], textWidth));
	end
	if size(paramDefCell{k,2}, 1) ~= size(paramDefCell{k,3}, 1)
		error(['All vectors or matrices in the second, third and fourth row ', ...
			'of paramDefCell have to have the same number of rows.']);
	end
	if size(paramDefCell, 2) == 4
		if ~isempty(paramDefCell{k,4}) && size(paramDefCell{k,4}, 2) ~= 1
			error(['All cells in the fourth column of paramDefCell have to be ', ...
				'empty or contain scalars or column vectors (the initial values).']);
		end
		if size(paramDefCell{k,2}, 1) ~= size(paramDefCell{k,4}, 1)
			error(['All vectors or matrices in the second, third and fourth row ', ...
				'of paramDefCell have to have the same number of rows.']);
		end
	end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -