Defining objective function using nested functions (Genetic Algorithm Solver)

7 visualizaciones (últimos 30 días)
Hello everyone,
I am trying to do a maximization problem using optimization toolbox genetic algorithm solver. My objective function has parameters so I need to write a nested function(Since i have extra parameters besides from my variables) But i am having a trouble writing it. Here is what my objective function looks like and i wrote so far;
function z = objectivefunc(x,r,aii)
z= sum(x.*r.*aii, 'all');
end
(I reshaped my matrixes to be a row vector.)
X is my decsision variable and its dimensions are 1*1296 and r and aii are my parameters with dimensions 1*1296. I have looked through the documentation matlab provides and found this one;
I am very new to MATLAB so i really do not know how to write it correctly. So, any ideas or suggestions on how to implement nested functions to my problem?
  3 comentarios
Azime Beyza Ari
Azime Beyza Ari el 23 de Mzo. de 2022
originally, matrixes had 36x36 dimensions but for some reason i reshaped them(x and r) to be 1x1296 and originally a is 1x36 matrix. When i used 1x1296 for x and r and 1x36 for a i get an error saying index in this position exceeds array bounds etc. So i figured that the reason is a does not have same dimensions with the other two so it may be the reason. So i repeated a (lets say a is [1 2 3 4....] i repeated this matrix for 36 times ) to be 1x1296. Now it says not enough input.
So, what you are telling me might cause a error again since i am using optimization toolbox and i understand that this toolbox is not very flexible with the dimensions.
As a solution, i was recommended to use nested functions etc. But failed to write the nested function.
Torsten
Torsten el 23 de Mzo. de 2022
Editada: Torsten el 23 de Mzo. de 2022
This problem has nothing to do with nested functions. You pass r and a to objectivefunc - so the two matrices can be accessed there. Maybe in a former version of your code, you did not include r and a in the list of parameters passed to objectivefunc and so someone suggested that you should use nested functions (because r and a are then also visible in objectivefunc although you don't pass them).
If you define the array of initial values for the unknowns x0 for "ga" as a 36x36 matrix, you will find them in objectivefunc also as a 36x36 matrix and you can use Matt's answer to calculate z if r is 36x36 and a is 36x1.

Iniciar sesión para comentar.

Respuesta aceptada

Matt J
Matt J el 23 de Mzo. de 2022
Editada: Matt J el 23 de Mzo. de 2022
I suspect that the r and x are both in fact 36x36 matrices while a is a 36x1 vector. If so, then, the correct implementation is,
function z = objectivefunc(x,r,a)
z= sum(x.*r.*a, 'all');
end
  10 comentarios
Matt J
Matt J el 23 de Mzo. de 2022
Editada: Matt J el 23 de Mzo. de 2022
Not for me. I ran your script with my proposed change and it worked fine.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Genetic Algorithm en Help Center y File Exchange.

Productos


Versión

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by