Restrictions on genetic algorithm?

6 views (last 30 days)
Milena Popovic
Milena Popovic on 26 Sep 2014
Commented: Geoff Hayes on 26 Sep 2014
Dear friends from Matlab community,
I'm trying to perform a finite element model update using a genetic algorithm code (with the ga function from Matlab). I need to obtain a group of 10 densities and 10 Young moduli, and the densities must range from 2060 to 2160. I have no idea of how to insert these restrictions.
My problem is to minimize the error between calculated and measured values of frequencies. So, I have a function that corresponds to the error, and I should obtain, as a result, a list of densities and Young moduli.
The function corresponding to the error goes below:
function J=funcional(popinicial)
%==========================================================================
% Rotina que calcula a diferença entre resultados medidos e calculados pelo
% problema direto
% O algoritmo deve reduzir o funcional.
%==========================================================================
% load teste
load resultados
load popinicial
nvar=length(pop(1,:)); % Número de variáveis
npop=length(pop(:,1)); % Número de indivíduos da população inicial
%
% É necessário aplicar o método das penalidades:
% minimizar J=sum((medido-popinicial).^2)
% sendo J sujeito às seguintes restrições:
% for w=1:npop
% popinicial(w,1:10)>=0;
% popinicial(w,11:20)>=0;
% end
%
for w=1:npop
s(w)=min([0 pop(w,1:10)]);
t(w)=min([0 pop(w,11:20)]);
P(w)=sum(s(w)^2)+sum(t(w)^2);
end
%
for w=1:npop
J(w)=sum((medido-popinicial(w,21:nvar)).^2)+0.5*P(w);
end
And the code for the optimization is here:
%==========================================================================
% Rotina para cálculo do funcional mínimo
%==========================================================================
% Preparação do ambiente
%--------------------------------------------------------------------------
clear all
close all
clc
%--------------------------------------------------------------------------
% Carregar dados
%--------------------------------------------------------------------------
load popinicial
% load teste
load resultados
% --------------------------------------------------------------------------
% Estrutura de opções do Algoritmo Genético
%--------------------------------------------------------------------------
nvar=length(pop(1,:)); % Número de variáveis
npop=length(pop(:,1)); % Número de indivíduos da população inicial
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.85,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',70,'CrossoverFraction',0.85,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.80,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.70,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.90,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.85,'CrossoverFcn',@crossoverheuristic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.85,'CrossoverFcn',{@crossoverintermediate,0.5},'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'SelectionFcn',@selectionroulette,'CrossoverFraction',0.85,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.95,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.60,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'CrossoverFraction',0.95,'SelectionFcn',@selectionroulette,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
% options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'Generations',60,'PenaltyFactor',{100},'CrossoverFraction',0.95,'CrossoverFcn',@crossoverheuristic,'PlotFcns',@gaplotbestf);
options=gaoptimset('InitialPopulation',pop,'Vectorize','on','PopulationSize',npop,'FitnessLimit',0,'Generations',60,'CrossoverFraction',0.90,'CrossoverFcn',@crossoverarithmetic,'PlotFcns',@gaplotbestf);
%--------------------------------------------------------------------------
% Cálculo do funcional mínimo por Algoritmo Genético
%--------------------------------------------------------------------------
tic
[popfinal,fval,exitflag,output]=ga(@funcional,nvar,options);
fim=toc;
%--------------------------------------------------------------------------
% Separando massa e rigidez (E*I/dx) dos elementos do restante da população
% final
%--------------------------------------------------------------------------
Massaelemento=popfinal(1:10);
Rigidezelemento=popfinal(11:20);
n=size(Massaelemento);
%--------------------------------------------------------------------------
% Dados do problema direto
%--------------------------------------------------------------------------
xi=0; % coordenada do engaste da viga em m
xf=5; % coordenada da ponta livre da viga em m
n=10; % número de elementos
b=0.5; % Largura da seção transversal em m
h=0.1; % Altura da seção transversal em m
%
I=b*(h^3)/12; % Momento de inércia da seção transversal, em m^4
%
dx=(xf-xi)/n; % Tamanho dos elementos
%--------------------------------------------------------------------------
% Módulo de elasticidade de cada elemento
%--------------------------------------------------------------------------
for i=1:n
E(i)=Rigidezelemento(i)*dx/I;
dens(i)=420*Massaelemento(i)/(b*h*dx);
end
%--------------------------------------------------------------------------
% Salvando uma população de 100 vigas
% %--------------------------------------------------------------------------
% m=0;
% statdens(m+1,:)=dens;
% statE(m+1,:)=E;
load stat
[m,p]=size(statdens);
statdens(m+1,:)=dens;
statE(m+1,:)=E;
save stat statdens statE
As I said, I need to insert the restrictions, so that my densities range from 2060 and 2160. How can I do this, using the ga matlab function?
Thanks in advance,
Milena
  1 Comment
Geoff Hayes
Geoff Hayes on 26 Sep 2014
Milena - it isn't clear to me where you want to apply the restrictions. You state that I need to obtain a group of 10 densities and 10 Young moduli, and the densities must range from 2060 to 2160. Are the 10 densities and 10 Young moduli the 20 (10+10) variables that you are optimizing when minimizing your fitness function funcional? I loaded your attached mat file, and it created a 160x21 matrix for your population with minimum and maximum values for each of the 21 variables as
0.118277241485108 0.135649990892041
0.121818837922119 0.129193555029168
0.116237249517872 0.129078269464569
0.121386556417811 0.129595868736619
0.120560743123102 0.129224137353103
0.121583473872326 0.127485381443669
0.118635847412381 0.130094904116017
0.123605310770534 0.133654785805742
0.119791034617718 0.126042200626796
0.119039774595586 0.128031801434906
5778846.32098728 5959788.47776383
5783021.37822146 5901259.8037152
5762020.14921443 5893265.84553396
5786937.46910472 5897192.92951187
5774905.45961089 5931269.05100009
5752790.71175621 5941062.13552568
5758555.04827271 5864140.13015019
5747840.9875037 5867717.45392619
5792533.07061803 5880312.17826423
5798003.07318175 5889641.07368445
3.70837300156758 3.76189498483313
How do these correspond to the densities and Young moduli?

Sign in to comment.

Answers (0)

Community Treasure Hunt

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

Start Hunting!