2015-04-27 3 views
0

J'essaie de résoudre un problème en utilisant GA dans Matlab et l'optimisation se déroule sur le nombre de générations défini et en diminuant la valeur de la fonction comme prévu (voir la figure ci-dessous). Mais ce qui n'est pas attendu, c'est que ce n'est pas en traçant les critères du pourcentage de la génération, par exemple dans la figure ci-dessous. Cela devrait être juste en dessous de 40%, mais ce n'est pas le cas. enter image description hereAlgorithme génétique dans Matlab - Ne se termine pas comme prévu

Voici mon code:

IntCon=[]; % Set integer variables 
[email protected](x)objective(x, univ_names, univ_data, weight_names, weight_data, net_names, net_data, normalized_name, normalized_data); 
[email protected](x)constraint(x,net_names, net_data); 

pop = 40; 
gen =50; 
ini=rand(pop,nvars); 
time = inf; % time in (s) 
options = gaoptimset('TimeLimit', time, 'InitialPopulation',ini,'PopulationSize',pop,'Generations',gen,'PlotFcns',{@gaplotbestfun, @gaplotstopping}); 

[x,fval,exitflag,output] = ga(vfun,nvars,[],[],[],[],x_L,x_U,nonlcon,IntCon,options) 

Alors, si je le laisse continuer, il recommence au début (à une valeur de fonction pire) et à ce stade, il commence à penser que ce qu'il a rencontré un certain pourcentage des critères de terminaison pour le nombre de générations

enter image description here

Puis après l'avoir laissé complète, je reçois: enter image description here et

Optimization terminated: average change in the fitness value less than options.TolFun 
and constraint violation is less than options.TolCon. 

x =3.3242 1.8450 0.5918 0.6000 


fval = 3.5208e+03 


exitflag = 1 


output = 

     problemtype: 'nonlinearconstr' 
     rngstate: [1x1 struct] 
     generations: 3 
     funccount: 6160 
      message: [1x140 char] 
    maxconstraint: 0 

Donc, en quelque sorte, il a choisi une valeur de la fonction pire que ce qu'elle trouve dans la première manche! Pourquoi fait-il ce "deuxième" et "troisième passage"?

Dans un autre exemple, j'inclus les informations d'itération et il est évident qu'il n'inclut pas la meilleure valeur de fonction d'une génération à la suivante. Par exemple sur le graphique, il apparaît que juste après 50 générations, il réduit la valeur de fonction à presque 425 comme on le voit dans le jeu bas de triangles sur le graphique ci-dessous: enter image description here

Mais il pense que le minimum est 435,011? Et ces 50 générations ne sont qu'une. Voir ci-dessous: contrainte génération F-count f (x) Génération 1 1060 435,011 0 0 2 2100 434,396 0 0 3 3140 434,267 0 0

enter image description here

Mais, la sortie dans le terminal de Matlab pense que cela après seulement environ 50 générations sur le graphique est une génération et il imprime à l'écran enter image description here

Puis, après la optiization prend fin il ressemble: enter image description here

Des idées? Merci!

Répondre

0

Le problème est que l'implémentation de Matlab de l'algorithme génétique avec une contrainte non-linéaire ne peut pas gérer le problème de conception s'il n'y a pas de variables entières! J'ai changé l'une des variables peuvent à une variable entière comme

IntCon=[1]; % Set integer variables 

Puis j'ai couru les mêmes scripts et fonctions pour obtenir enter image description here

Optimisation terminée: nombre maximal de générations dépassé.

x =

3.0000 1.6261 0.5881 0.6002 

fval =

3.5410e + 03

exitflag =

0 

output =

problemtype: 'integerconstraints' 
    rngstate: [1x1 struct] 
    generations: 50 
    funccount: 2041 
     message: 'Optimization terminated: maximum number of generations exceeded.' 
maxconstraint: 0