1

次のような数値のベクトルがあります。

myVec= [ 1 2 3 4 5 6 7 8 ...]

ある数値の入力を取り、アルゴリズムを実行して別の数値を返すカスタム関数があります。

cust(1)= 55, cust(2)= 497, cust(3)= 14, etc. 

最高の結果をもたらした最初のベクトルの数値を返すことができるようにしたいと考えています。

私の現在の考えはoutcomeVec、カスタム関数からの出力を含む 2 番目のベクトルを生成し、そのベクトルのインデックスを見つけ、そのmax(outcomeVec)インデックスを に一致させることmyVecです。これを行うより効率的な方法はありますか?

4

2 に答える 2

0

あなたが説明したことは、それを行うための良い方法です。

outcomeVec = myfunc(myVec);
[~,ndx] = max(outcomeVec);
myVec(ndx) % input that produces max output

別のオプションは、ループで行うことです。これによりメモリが少し節約されますが、遅くなる可能性があります。

maxOutputValue = -Inf;
maxOutputNdx = NaN;
for ndx = 1:length(myVec)
    output = myfunc(myVec(ndx));
    if output > maxOutputValue
        maxOutputValue = output;
        maxOutputNdx = ndx;
    end
end
myVec(maxOutputNdx) % input that produces max output

これらはほとんど唯一のオプションです。

関数ハンドルと入力配列を受け取る汎用関数を作成することで、凝ったものにすることができます。そのメソッドは、上記の手法の 1 つを実装し、最大の出力を生成する入力値を返します。

于 2013-09-04T13:28:09.200 に答える
0

検索する離散数の範囲のサイズによっては、ゴールデン セクション アルゴリズムを使用したソリューションがより効率的に機能する場合があります。たとえば、次のことを最小限に抑えようとしました。

bf = -21;
f =@(x) round(x-bf).^2;

[-100 100] の範囲内で、Mathworks ファイル交換のスクリプトに基づくルーチンを使用します。この特定のファイル交換スクリプトは、反復ごとに 2 つの関数呼び出しを行うため、ゴールデン セクションを正しく実装していないようです。これを修正した後、必要な呼び出しの数は 12 に減りました。これは、 min. 利益はすぐに劇的になる可能性があります。たとえば、検索領域が [-100000 100000] の場合、ゴールデンは 200000 ではなく 25 回の関数呼び出しで最小値を見つけます。範囲に対するゴールデン セクションの呼び出し数の依存性は対数的であり、線形ではありません。

したがって、範囲が十分に大きい場合は、min必要な関数呼び出しが少なくて済むため、他の方法を確実に打ち負かすことができます。最小化検索ルーチンは、初期段階でこのような検索を組み込むことがあります。ただし、収束 (終了) 基準に問題があり、ルーチンが停止するタイミングを認識できるように変更する必要があります。min最適なオプションは、ゴールデン セクションを数回繰り返すことから始めて、適用する検索範囲を狭めることです。

重要な注意点は、ゴールデン セクションは単峰性領域、つまり単一の最小値を表示する場合にのみ機能することが保証されていることです。複数の最小値を含む領域では、1 つにとどまり、グローバル最小値を見逃す可能性があります。その意味でminは、確実な賭けです。

ここの例の関数は inputxを丸めますが、関数は整数入力を受け取ることにも注意してください。これは、呼び出し元のゴールデン ルーチンによって渡された入力を丸める関数の周りにラッパーを配置する必要があることを意味します。

私はこれを調査しませんでしたが、他の人は遺伝的アルゴリズムを使用してそのような検索を実行したようです.

于 2013-09-04T18:00:48.807 に答える