9

Trabajando en una tarea que involucra Algoritmos Genéticos (cargas de dolores de cabeza, mucha diversión). Necesito poder probar diferentes métodos de cruce y diferentes métodos de mutación, para comparar sus resultados (parte del trabajo que tengo que escribir para el curso). Como tal, quiero simplemente pasar los nombres de las funciones al método Repopulate, como maneja la función.MATLAB- pasando un parámetro de manejador de función a otra función como manejador

function newpop = Repopulate(population, crossOverMethod, mutationMethod) 
    ... 
    child = crossOverMethod(parent1, parent2, @mutationMethod); 
    ... 

function child = crossOverMethod(parent1, parent2, mutationMethod) 
    ... 
    if (mutateThisChild == true) 
    child = mutationMethod(child); 
    end 
    ... 

El punto clave aquí es como 3, parámetro 3: ¿cómo paso a mutationMethod otro nivel? Si utilizo el símbolo @, me dicen:

"mutationMethod" was previously used as a variable, 
conflicting with its use here as the name of a function or command. 

si yo no uso el símbolo @, a continuación, se llama a mutationMethod, sin parámetros, y es muy infeliz.

Si bien soy consciente de que sí, podría reescribir mi código para que funcione de manera diferente, ahora tengo curiosidad sobre cómo hacerlo realmente trabajo.

Cualquier ayuda es muy apreciada.

Respuesta

13

En realidad, simplemente no utilice el símbolo @, utilícelo cuando llame a la función Repopulate en su lugar. Ejemplo:

function x = fun1(a,m) 
    x = fun2(a,m); 
end 

function y = fun2(b,n) 
    y = n(b); 
end 

que denominamos como:

> fun1([1 2 3], @sum) 
6 

consulte la documentación para Passing Function Handle Arguments


Nota Puede comprobar si el argumento es un identificador de función por: isa(m,'function_handle'). Por lo tanto usted puede hacer su función Repoblar más flexible al aceptar tanto un mango y una función de nombre de la función como una cadena:

function x = fun(a,m) 
    if ischar(m) 
     f = str2func(m); 
    elseif isa(m,'function_handle') 
     f = m; 
    else 
     error('expecting a function') 
    end 
    x = fun2(a,f); 
end 

que ahora puede ser llamado en ambos sentidos:

fun1([1 2 3], @sum) 
fun1([1 2 3], 'sum') 
Cuestiones relacionadas