📄 gaoptimset.m
字号:
% If we pass in a function name then return the defaults.
if (numberargs==1) && (ischar(varargin{1}) || isa(varargin{1},'function_handle') )
if ischar(varargin{1})
funcname = lower(varargin{1});
if ~exist(funcname)
msg = sprintf( ...
'No default options available: the function ''%s'' does not exist on the path.',funcname);
error('gads:GAOPTIMSET:functionNotFound',msg)
end
elseif isa(varargin{1},'function_handle')
funcname = func2str(varargin{1});
end
try
optionsfcn = feval(varargin{1},'defaults');
catch
msg = sprintf( ...
'No default options available for the function ''%s''.',funcname);
error('gads:GAOPTIMSET:noDefaultOptions',msg)
end
% To get output, run the rest of psoptimset as if called with gaoptimset(options, optionsfcn)
varargin{1} = options;
varargin{2} = optionsfcn;
numberargs = 2;
end
Names = fieldnames(options);
m = size(Names,1);
names = lower(Names);
i = 1;
while i <= numberargs
arg = varargin{i};
if ischar(arg) % arg is an option name
break;
end
if ~isempty(arg) % [] is a valid options argument
if ~isa(arg,'struct')
error('gads:GAOPTIMSET:invalidArgument',['Expected argument %d to be a string parameter name ' ...
'or an options structure\ncreated with GAOPTIMSET.'], i);
end
for j = 1:m
if any(strcmp(fieldnames(arg),Names{j,:}))
val = arg.(Names{j,:});
else
val = [];
end
if ~isempty(val)
if ischar(val)
val = deblank(val);
end
[valid, errmsg] = checkfield(Names{j,:},val);
if valid
options.(Names{j,:}) = val;
else
error('gads:GAOPTIMSET:invalidOptionField',errmsg);
end
end
end
end
i = i + 1;
end
% A finite state machine to parse name-value pairs.
if rem(numberargs-i+1,2) ~= 0
error('gads:GAOPTIMSET:invalidArgPair','Arguments must occur in name-value pairs.');
end
expectval = 0; % start expecting a name, not a value
while i <= numberargs
arg = varargin{i};
if ~expectval
if ~ischar(arg)
error('gads:GAOPTIMSET:invalidArgFormat','Expected argument %d to be a string parameter name.', i);
end
lowArg = lower(arg);
j = strmatch(lowArg,names);
if isempty(j) % if no matches
error('gads:GAOPTIMSET:invalidParamName','Unrecognized parameter name ''%s''.', arg);
elseif length(j) > 1 % if more than one match
% Check for any exact matches (in case any names are subsets of others)
k = strmatch(lowArg,names,'exact');
if length(k) == 1
j = k;
else
msg = sprintf('Ambiguous parameter name ''%s'' ', arg);
msg = [msg '(' Names{j(1),:}];
for k = j(2:length(j))'
msg = [msg ', ' Names{k,:}];
end
msg = sprintf('%s).', msg);
error('gads:GAOPTIMSET:ambiguousParamName',msg);
end
end
expectval = 1; % we expect a value next
else
if ischar(arg)
arg = (deblank(arg));
end
[valid, errmsg] = checkfield(Names{j,:},arg);
if valid
options.(Names{j,:}) = arg;
else
error('gads:GAOPTIMSET:invalidParamVal',errmsg);
end
expectval = 0;
end
i = i + 1;
end
if expectval
error('gads:GAOPTIMSET:invalidParamVal','Expected value for parameter ''%s''.', arg);
end
%-------------------------------------------------
function [valid, errmsg] = checkfield(field,value)
%CHECKFIELD Check validity of structure field contents.
% [VALID, MSG] = CHECKFIELD('field',V) checks the contents of the specified
% value V to be valid for the field 'field'.
%
valid = 1;
errmsg = '';
% empty matrix is always valid
if isempty(value)
return
end
switch field
case {'PopulationType','MigrationDirection'}
if ~isa(value,'char')
valid=0;
errmsg = sprintf('Invalid value for OPTIONS parameter %s.',field);
end
case {'FitnessScalingFcn','SelectionFcn','CrossoverFcn','MutationFcn',...
'CreationFcn','HybridFcn','PlotFcns','OutputFcns'}
if iscell(value) || isa(value,'function_handle')
valid = 1;
else
valid = 0;
errmsg = sprintf('Invalid value for OPTIONS parameter %s.',field);
end
case {'PopulationSize','EliteCount','CrossoverFraction','MigrationInterval','PlotInterval', ...
'MigrationFraction','Generations','TimeLimit','StallTimeLimit','FitnessLimit','StallGenLimit'}
if ~isa(value,'double')
valid = 0;
if ischar(value)
errmsg = sprintf('Invalid value for OPTIONS parameter %s: must be a real positive number (not a string).',field);
else
errmsg = sprintf('Invalid value for OPTIONS parameter %s: must be a real positive number.',field);
end
end
case {'PopInitRange','InitialPopulation','InitialScores'}
valid = 1;
case {'Display'}
if ~isa(value,'char') || ~any(strcmpi(value,{'off','iter','diagnose','final'}))
valid=0;
errmsg = sprintf('Invalid value for OPTIONS parameter %s: must be ''off'',''iter'', ''diagnose'', or ,''final''.',field);
end
case {'Vectorized'}
if ~isa(value,'char') || ~any(strcmp(value,{'on','off'}))
valid = 0;
errmsg = sprintf('Invalid value for OPTIONS parameter %s: must be ''off'' or ''on''.',field);
end
otherwise
error('gads:GAOPTIMSET:unknownOptionsField','Unknown field name for Options structure.')
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -