9

Genetik Algoritmalar (baş ağrısı, aşırı yükler) içeren bir ödev üzerinde çalışma. Farklı çaprazlama yöntemlerini ve farklı mutasyon yöntemlerini test edebilmek için sonuçları karşılaştırmalıyım (ders için yazmam gereken kağıt parçası). Bu nedenle, işlev isimlerini yalnızca işlev kolları olarak Repopulate yöntemine aktarmak istiyorum. BuradaMATLAB- bir işlev tanıtıcı parametresini bir tanıtıcı olarak başka bir işleve geçirme

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

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

önemli nokta 3 gibidir, parametre 3: nasıl bir seviye aşağı mutationMethod iletirim? Ben @ sembolünü kullanırsanız, bana söylenen olsun: Ben @ sembolünü kullanmak istemiyorsanız, o zaman mutationMethod hiçbir parametrelerle, deniyor ve mutsuz olur

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

.

Evet, farkındayım ki, farklı bir şekilde çalışmasını sağlamak için kodumu yeniden yazabilirim, şimdi çalışmasının çalışmasını nasıl yapacağımı merak ediyorum.

Her türlü yardım büyük beğeni topluyor.

cevap

13

Aslında, yalnızca @ sembolünü kullanmayın, bunun yerine işlevini yeniden ayarla işlevini kullanın. Örnek: isa(m,'function_handle'): biz diyoruz

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

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

: argüman bir işlev tanıtıcı ise

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

Passing Function Handle Arguments


Not belgelere başvurun kontrol edebilirsiniz. Bu nedenle bir dize olarak bir işlev sapı ve bir işlev adı hem kabul ederek daha esnek işlevinizi yeniden doldurmak yapabilirsiniz:

fun1([1 2 3], @sum) 
fun1([1 2 3], 'sum') 
: Şimdi her iki yönde çağrılabilir

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 

İlgili konular