Il n'est pas rare dans la programmation d'avoir une situation où ce qui est plus pratique pour votre fonction et ce que certains attend d'appel de la bibliothèque de celui-ci ne sont pas d'accord. La résolution normale à un tel problème est d'écrire une petite couche entre les deux qui permet aux deux de parler; une interface .
De help ga
:
X = GA (FITNESSFCN, NVARS) trouve un minimum sans contrainte locale X à l'aide de FITNESSFCN GA. [...] FITNESSFCN accepte un vecteur X de taille 1 par NVARS et renvoie un scalaire évalué à X.
Ainsi, ga
attend une entrée de vecteur, sortie scalaire, alors que vous avez une structure en cours et dehors. Vous devez écrire la fonction suivante (sous):
function Y = wrapper_Objfun(X, in)
in.a = X; %# variable being optimized
out = YOUR_REAL_FUNCTION(in); %# call to your actual function
Y = out.b(2,3); %# objective value
end
puis l'appel à ga
ressemblera
X = ga(@(x) wrapper_Objfun(x,in), N);
où N
est cependant grand in.a
devrait être.
Lisez également à ce sujet dans Matlab's own documentation on the subject.
C'est ce que j'ai fini par faire, j'espérais un tour de magie:/ – Daniel
merci pour la réponse géniale et le lien génial! –