10

遺伝的アルゴリズム(たくさんの頭痛、たくさんの楽しみ)を含む課題に取り組んでいます。それらの結果を比較するために、さまざまなクロスオーバー方法とさまざまな突然変異方法をテストできる必要があります(コースのために書かなければならない論文の一部)。そのため、関数ハンドルとして、関数名をRepopulateメソッドに渡すだけです。

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

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

ここでの重要なポイントは、3、パラメーター3のようなものです。mutationMethodを別のレベルに渡すにはどうすればよいですか?@記号を使用すると、次のように表示されます。

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

@記号を使用しない場合、mutationMethodがパラメーターなしで呼び出され、非常に不幸になります。

はい、コードを書き直して別の動作をさせることができることは承知していますが、実際に動作させる方法に興味があります。

どんな助けでも大歓迎です。

4

1 に答える 1

13

実際には @ 記号を使用しないでください。代わりにRepopulate関数を呼び出すときに使用してください。例:

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

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

これを次のように呼びます:

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

関数ハンドル引数の受け渡しについては、ドキュメントを参照してください。


引数が関数ハンドルであるかどうかは、次の方法で確認できることに注意してくださいisa(m,'function_handle')。したがって、関数ハンドルと関数名の両方を文字列として受け入れることで、関数Repopulateをより柔軟にすることができます。

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

これは、両方の方法で呼び出すことができます。

fun1([1 2 3], @sum)
fun1([1 2 3], 'sum')
于 2009-10-22T14:51:16.440 に答える