optomization using Genetic Algorithm

4 ビュー (過去 30 日間)
Hassan Abdelazeem
Hassan Abdelazeem 2022 年 3 月 3 日
コメント済み: Walter Roberson 2022 年 3 月 3 日
% Hi everyone
% I download this function to maximize an objective function using Genetic Algorithm, but I am trying to use it , but I dont know how enter my objectve function to this code. Please could anyone help me
if anyone can choose any function and try to maximize it using this function
function [beta,stopcode]=ga_maximize(funstr,parspace,options)
%[beta,stopcode]=ga(funstr,parspace,options,p1,p2,p3,p4,p5,p6,p7,p8,p9)
% Genetic Algorithm for function maximization.
% Especially useful for functions with kinks and discontinuities,
% and where a good "starting point" is unavailable.
% See Dorsey and Mayer,
% Journal of Business and Economic Statistics, January 1995, 13(1)
% Program by Michael Gordy <m1mbg00@frb.gov>
% Version 1.12, 7 February 1996
%
% OUTPUTS:
% beta = (1 x K) parameter vector maximizing funstr
% stopcode = code for terminating condition
% == 1 if terminated normally
% == 2 if maximum number of iterations exceeded
%
% INPUTS:
% funstr = name of function to be maximized (string).
% parspace = (2 x K) matrix is [min; max] of parameter space dimensions
% or, if (3 x K), then bottom row is a good starting value
% options = vector of option settings
% p1,p2,...,p9 are optional parameters to be passed to funstr
%
% where:
% options(1) = m (size of generation, must be even integer)
% options(2) = eta (crossover rate in (0,1); use Booker's VCO if < 0)
% options(3) = gamma (mutation rate in (0,1))
% options(4) = printcnt (print status once every printcnt iterations)
% Set printcnt to zero to suppress printout.
% options(5) = maxiter (maximum number of iterations)
% options(6) = stopiter (minimum number of gains < epsln before stop)
% options(7) = epsln (smallest gain worth recognizing)
% options(8) = rplcbest (every rplcbest iterations, insert best-so-far)
% options(9) = 1 if function is vectorized (i.e., if the function
% can simultaneously evaluate many parameter vectors).
% Default option settings: [20,-1,0.12,10,20000,2000,1e-4,50,0]
%
% Note:
% The function is maximized with respect to its first parameter,
% which is expressed as a row vector.
% Example:
% Say we want to maximize function f with respect to vector p,
% and need also to pass to f data matrices x,y,z. Then,
% write the function f so it is called as f(p,x,y,z). GA will
% assume that p is a row vector.
gaver='1.12';
defopt=[24,-1,0.12,10,20000,2000,1e-4,50,0];
months = ['Jan';'Feb';'Mar';'Apr';'May';'Jun';...
'Jul';'Aug';'Sep';'Oct';'Nov';'Dec'];
if nargin>2
if isempty(options)
options=defopt;
end
else
options=defopt;
end
m=options(1); eta=options(2); gam=options(3);
printcnt=options(4);
maxiter=options(5);
stopiter=options(6); epsln=options(7);
rplcbest=options(8);
vecfun=options(9);
% Use Booker's VCO if eta==-1
vco=(eta<0); eta=abs(eta);
% Cancel rplcbest if <=0
if rplcbest<=0, rplcbest=maxiter+1; end
K=size(parspace,2);
% Draw initial Generation
G=rand(m,K).*(parspace(2*ones(m,1),:)-parspace(ones(m,1),:))...
+parspace(ones(m,1),:);
b0rows=size(parspace,1)-2;
if b0rows>0
G(1:b0rows,:)=parspace(3:b0rows+2,:);
parspace=parspace([1 2],:);
end
% Initial 'best' holders
inarow=0;
bestfun=-Inf; beta=zeros(1,K);
% Score for each of m vectors
f=zeros(m,1);
% Setup function string for evaluations
paramstr=',p1,p2,p3,p4,p5,p6,p7,p8,p9';
evalstr = [funstr,'(G'];
if ~vecfun
evalstr=[evalstr, '(i,:)'];
end
if nargin>3, evalstr=[evalstr,paramstr(1:3*(nargin-3))]; end
evalstr = [evalstr, ')'];
% Print header
if printcnt>0
disp(['GA (Genetic Algorithm), Version ',gaver,' by Michael Gordy'])
disp(['Maximization of function ',funstr])
disp('i = Current generation')
disp('best_i = Best function value in generation i')
disp('best = Best function value so far')
disp('miss = Number of generations since last hit')
disp('psi = Proportion of unique genomes in generation')
disp(sprintf(['\n',blanks(20),'i best_i best miss psi']))
end
iter=0; stopcode=0;
oldpsi=1; % for VCO option
while stopcode==0
iter=iter+1;
% Call function for each vector in G
if vecfun
f=eval(evalstr);
else
for i=1:m
f(i)=eval(evalstr);
end
end
f0=f;
[bf0,bx]=max(f);
bf=max([bf0 bestfun]);
fgain=(bf-bestfun);
if fgain>epsln
inarow=0;
else
inarow=inarow+1;
end
if fgain>0
bestfun=bf;
beta=G(bx(1),:);
end
if printcnt>0 & rem(iter,printcnt)==1
psi=length(unique(G))/m;
ck=clock;
ckhr=int2str(ck(4)+100); ckday=int2str(ck(3)+100);
ckmin=int2str(ck(5)+100); cksec=int2str(ck(6)+100);
timestamp=[ckday(2:3),months(ck(2),:),' ',...
ckhr(2:3),':',ckmin(2:3),':',cksec(2:3),' '];
disp([timestamp,sprintf('%6.0f %8.5e %8.5e %5.0f %5.3f',...
[iter bf0 bestfun inarow psi])])
save gabest beta timestamp iter funstr
end
% Reproduction
f=(f-min(f)).^(1+log(iter)/100);
pcum=cumsum(f)/sum(f);
r=rand(1,m); r=sum(r(ones(m,1),:)>pcum(:,ones(1,m)))+1;
G=G(r,:);
% Crossover
if vco
psi=length(unique(G))/m;
eta=max([0.2 min([1,eta-psi+oldpsi])]);
oldpsi=psi;
end
y=sum(rand(m/2,1)<eta);
if y>0
% choose crossover point
x=floor(rand(y,1)*(K-1))+1;
for i=1:y
tmp=G(i,x(i)+1:K);
G(i,x(i)+1:K)=G(i+m/2,x(i)+1:K);
G(i+m/2,x(i)+1:K)=tmp;
end
end
% Mutation
M=rand(m,K).*(parspace(2*ones(m,1),:)-parspace(ones(m,1),:))...
+parspace(ones(m,1),:);
domuta=find(rand(m,K)<gam);
G(domuta)=M(domuta);
% Once every rplcbest iterations, re-insert best beta
if rem(iter,rplcbest)==0
G(m,:)=beta;
end
stopcode=(inarow>stopiter)+2*(iter>maxiter);
end
if printcnt>0
if stopcode==1
disp(sprintf('GA: No improvement in %5.0f generations.\n',stopiter))
else
disp(sprintf('GA: Maximum number of iterations exceeded.\n'))
end
end

採用された回答

Walter Roberson
Walter Roberson 2022 年 3 月 3 日
The function needs to be specified as a character vector that is the name of the function to use. The function named must have its own .m file or be built in: it cannot be a local function or nested function in the same file I think (I would have to test that to be sure.)
The way that the code uses the function is inefficient. The code could be improved.
  2 件のコメント
Hassan Abdelazeem
Hassan Abdelazeem 2022 年 3 月 3 日
Thank you indeed Mr. Walter, all the time you helps us
The program now works, but If I need to minimize my objective function with the above function , should I multiplu my objective function with -1?
Regards
Walter Roberson
Walter Roberson 2022 年 3 月 3 日
I think so, Yes.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeGenetic Algorithm についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by