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

📄 ga.m

📁 A modified version of genetic algorithm (GA) which can keep a trace of each generation.
💻 M
字号:
function [x,fval,exitFlag,output,population,scores] = ga(fun,nvars,Aineq,bineq,Aeq,beq,lb,ub,nonlcon,options)%GA    Constrained optimization using genetic algorithm.%   GA attempts to solve problems of the form:%       min F(X)  subject to:  A*X  <= B, Aeq*X  = Beq (linear constraints)%        X                     C(X) <= 0, Ceq(X) = 0 (nonlinear constraints)%                              LB <= X <= ub%%   X = GA(FITNESSFCN,NVARS) finds a local unconstrained minimum X to the%   FITNESSFCN using GA. NVARS is the dimension (number of design%   variables) of the FITNESSFCN. FITNESSFCN accepts a vector X of size%   1-by-NVARS, and returns a scalar evaluated at X.%%   X = GA(FITNESSFCN,NVARS,A,b) finds a local minimum X to the function%   FITNESSFCN, subject to the linear inequalities A*X <= B. Linear%   constraints are not satisfied when the PopulationType option is set to%   'bitString' or 'custom'. See the documentation for details.%%   X = GA(FITNESSFCN,NVARS,A,b,Aeq,beq) finds a local minimum X to the%   function FITNESSFCN, subject to the linear equalities Aeq*X = beq as%   well as A*X <= B. (Set A=[] and B=[] if no inequalities exist.) Linear%   constraints are not satisfied when the PopulationType option is set to%   'bitString' or 'custom'. See the documentation for details.%%   X = GA(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub) defines a set of lower and%   upper bounds on the design variables, X, so that a solution is found in%   the range lb <= X <= ub. Use empty matrices for lb and ub if no bounds%   exist. Set lb(i) = -Inf if X(i) is unbounded below;  set ub(i) = Inf if%   X(i) is unbounded above. Linear constraints are not satisfied when the%   PopulationType option is set to 'bitString' or 'custom'. See the %   documentation for details.%%   X = GA(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub,NONLCON) subjects the%   minimization to the constraints defined in NONLCON. The function%   NONLCON accepts X and returns the vectors C and Ceq, representing the%   nonlinear inequalities and equalities respectively. GA minimizes%   FITNESSFCN such that C(X)<=0 and Ceq(X)=0. (Set lb=[] and/or ub=[] if%   no bounds exist.) Nonlinear constraints are not satisfied when the%   PopulationType option is set to 'bitString' or 'custom'. See the %   documentation for details.%%   X = GA(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub,NONLCON,options) minimizes%   with the default optimization parameters replaced by values in the%   structure OPTIONS. OPTIONS can be created with the GAOPTIMSET function.%   See GAOPTIMSET for details.%%   X = GA(PROBLEM) finds the minimum for PROBLEM. PROBLEM is a structure%   that has the following fields:%       fitnessfcn: <Fitness function>%            nvars: <Number of design variables>%            Aineq: <A matrix for inequality constraints>%            bineq: <b vector for inequality constraints>%              Aeq: <Aeq matrix for equality constraints>%              beq: <beq vector for equality constraints>%               lb: <Lower bound on X>%               ub: <Upper bound on X>%          nonlcon: <nonlinear constraint function>%          options: <Options structure created with GAOPTIMSET>%        randstate: <State of the uniform random number generator>%       randnstate: <State of the normal random number generator>%%   [X,FVAL] = GA(FITNESSFCN, ...) returns FVAL, the value of the fitness%   function FITNESSFCN at the solution X.%%   [X,FVAL,EXITFLAG] = GA(FITNESSFCN, ...) returns EXITFLAG which%   describes the exit condition of GA. Possible values of EXITFLAG and the%   corresponding exit conditions are%%     1 Average change in value of the fitness function over%        options.StallGenLimit generations less than options.TolFun and%        constraint violation less than options.TolCon.%     3 The value of the fitness function did not change in%        options.StallGenLimit generations and constraint violation less%        than options.TolCon.%     4 Magnitude of step smaller than machine precision and constraint%        violation less than options.TolCon. This exit condition applies%        only to nonlinear constraints.%     5 Fitness limit reached and constraint violation less than%        options.TolCon. %     0 Maximum number of generations exceeded.%    -1 Optimization terminated by the output or plot function.%    -2 No feasible point found.%    -4 Stall time limit exceeded.%    -5 Time limit exceeded.%%   [X,FVAL,EXITFLAG,OUTPUT] = GA(FITNESSFCN, ...) returns a%   structure OUTPUT with the following information:%            randstate: <State of the function RAND used before GA started>%           randnstate: <State of the function RANDN used before GA started>%          generations: <Total generations, excluding HybridFcn iterations>%            funccount: <Total function evaluations>%        maxconstraint: <Maximum constraint violation>, if any%              message: <GA termination message>%%   [X,FVAL,EXITFLAG,OUTPUT,POPULATION] = GA(FITNESSFCN, ...) returns the%   final POPULATION at termination.%%   [X,FVAL,EXITFLAG,OUTPUT,POPULATION,SCORES] = GA(FITNESSFCN, ...) returns%   the SCORES of the final POPULATION.%%%   Example:%     Unconstrained minimization of 'rastriginsfcn' fitness function of%     numberOfVariables = 2%      x = ga(@rastriginsfcn,2)%%     Display plotting functions while GA minimizes%      options = gaoptimset('PlotFcns',...%        {@gaplotbestf,@gaplotbestindiv,@gaplotexpectation,@gaplotstopping});%      [x,fval,exitflag,output] = ga(@rastriginsfcn,2,[],[],[],[],[],[],[],options)%%   An example with inequality constraints and lower bounds%    A = [1 1; -1 2; 2 1];  b = [2; 2; 3];  lb = zeros(2,1);%    % Use mutation function which can handle constraints%    options = gaoptimset('MutationFcn',@mutationadaptfeasible);%    [x,fval,exitflag] = ga(@lincontest6,2,A,b,[],[],lb,[],[],options);%%     FITNESSFCN can also be an anonymous function:%        x = ga(@(x) 3*sin(x(1))+exp(x(2)),2)%%   If FITNESSFCN or NONLCON are parameterized, you can use anonymous%   functions to capture the problem-dependent parameters. Suppose you want%   to minimize the fitness given in the function myfit, subject to the%   nonlinear constraint myconstr, where these two functions are%   parameterized by their second argument a1 and a2, respectively. Here%   myfit and myconstr are M-file functions such as%%        function f = myfit(x,a1)%        f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + a1);%%   and%%        function [c,ceq] = myconstr(x,a2)%        c = [1.5 + x(1)*x(2) - x(1) - x(2);%              -x(1)*x(2) - a2];%        % No nonlinear equality constraints:%         ceq = [];%%   To optimize for specific values of a1 and a2, first assign the values%   to these two parameters. Then create two one-argument anonymous%   functions that capture the values of a1 and a2, and call myfit and%   myconstr with two arguments. Finally, pass these anonymous functions to%   GA:%%     a1 = 1; a2 = 10; % define parameters first%     % Mutation function for constrained minimization%     options = gaoptimset('MutationFcn',@mutationadaptfeasible);%     x = ga(@(x)myfit(x,a1),2,[],[],[],[],[],[],@(x)myconstr(x,a2),options)%%   See also GAOPTIMSET, FITNESSFUNCTION, GAOUTPUTFCNTEMPLATE, PATTERNSEARCH, @.%   Copyright 2003-2008 The MathWorks, Inc.%   $Revision: 1.28.4.14.2.1 $  $Date: 2008/01/21 15:53:28 $% If the first arg is not a gaoptimset, then it's a fitness function followed by a genome% length. Here we make a gaoptimset from the args.defaultopt = struct('PopulationType', 'doubleVector', ...    'PopInitRange', [0;1], ...    'PopulationSize', 20, ...    'EliteCount', 2, ...    'CrossoverFraction', 0.8, ...    'MigrationDirection','forward', ...    'MigrationInterval',20, ...    'MigrationFraction',0.2, ...    'Generations', 100, ...    'TimeLimit', inf, ...    'FitnessLimit', -inf, ...    'StallGenLimit', 50, ...    'StallTimeLimit', inf, ...    'TolFun', 1e-6, ...    'TolCon', 1e-6, ...    'InitialPopulation',[], ...    'InitialScores', [], ...    'InitialPenalty', 10, ...    'PenaltyFactor', 100, ...    'PlotInterval',1, ...    'CreationFcn',@gacreationuniform, ...    'FitnessScalingFcn', @fitscalingrank, ...    'SelectionFcn', @selectionstochunif, ...    'CrossoverFcn',@crossoverscattered, ...    'MutationFcn',{{@mutationgaussian 1  1}}, ...    'HybridFcn',[], ...    'Display', 'final', ...    'PlotFcns', [], ...    'OutputFcns', [], ...    'Vectorized','off', ...    'UseParallel', 'never');% Check number of input argumentserrmsg = nargchk(1,10,nargin);if ~isempty(errmsg)    error('gads:ga:numberOfInputs',[errmsg,' GA requires at least 1 input argument.']);end% If just 'defaults' passed in, return the default options in Xif nargin == 1 && nargout <= 1 && isequal(fun,'defaults')    x = defaultopt;    returnendif nargin < 10,  options = [];    if nargin < 9,  nonlcon = [];        if nargin < 8, ub = [];            if nargin < 7, lb = [];                if nargin <6, beq = [];                    if nargin <5, Aeq = [];                        if nargin < 4, bineq = [];                            if nargin < 3, Aineq = [];                            end                        end                    end                end            end        end    endend% Is third argument a structureif nargin == 3 && isstruct(Aineq) % Old syntax    options = Aineq; Aineq = [];end% One input argument is for problem structureif nargin == 1    if isa(fun,'struct')        [fun,nvars,Aineq,bineq,Aeq,beq,lb,ub,nonlcon,randstate,randnstate,options] = separateOptimStruct(fun);        % Reset the random number generators        if ~isempty(randstate) && ~isempty(randnstate) && ...                isa(randstate, 'uint32') && isequal(size(randstate),[625, 1]) && ...                isa(randnstate, 'double') && isequal(size(randnstate),[2, 1])            rand('twister',randstate);            randn('state',randnstate);        end    else % Single input and non-structure.        error('gads:ga:invalidStructInput','The input should be a structure with valid fields or provide at least two arguments to GA.' );    endend% If fun is a cell array with additional arguments get the function handleif iscell(fun)    FitnessFcn = fun{1};else    FitnessFcn = fun;end% Only function handles or inlines are allowed for FitnessFcnif isempty(FitnessFcn) ||  ~(isa(FitnessFcn,'inline') || isa(FitnessFcn,'function_handle'))    error('gads:ga:needFunctionHandle','Fitness function must be a function handle.');end% We need to check the nvars here before we call any solvervalid =  isnumeric(nvars) && isscalar(nvars)&& (nvars > 0) ...    && (nvars == floor(nvars));if ~valid    error('gads:ga:notValidNvars','Number of variables (NVARS) must be a positive integer.');enduser_options = options;% Use default options if emptyif ~isempty(options) && ~isa(options,'struct')        error('gads:ga:optionsNotAStruct','Tenth input argument must be a valid structure created with GAOPTIMSET.');elseif isempty(options)    options = defaultopt;end% Take defaults for parameters that are not in options structureoptions = gaoptimset(defaultopt,options);% All inputs should be doubletry    dataType = superiorfloat(nvars,Aineq,bineq,Aeq,beq,lb,ub);    if ~isequal('double', dataType)        error('gads:ga:dataType', ...            'GA only accepts inputs of data type double.')    endcatch    error('gads:ga:dataType', ...        'GA only accepts inputs of data type double.')end[x,fval,exitFlag,output,population,scores,FitnessFcn,nvars,Aineq,bineq,Aeq,beq,lb,ub, ...    NonconFcn,options,Iterate,type] = gacommon(nvars,fun,Aineq,bineq,Aeq,beq,lb,ub,nonlcon,options,user_options);if exitFlag < 0    return;end% Call appropriate single objective optimization solverswitch (output.problemtype)    case 'unconstrained'        [x,fval,exitFlag,output,population,scores] = gaunc(FitnessFcn,nvars, ...            options,output,Iterate);    case {'boundconstraints', 'linearconstraints'}        [x,fval,exitFlag,output,population,scores] = galincon(FitnessFcn,nvars, ...            Aineq,bineq,Aeq,beq,lb,ub,options,output,Iterate);    case 'nonlinearconstr'        [x,fval,exitFlag,output,population,scores] = gacon(FitnessFcn,nvars, ...            Aineq,bineq,Aeq,beq,lb,ub,NonconFcn,options,output,Iterate,type);end

⌨️ 快捷键说明

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