0

遺伝的アルゴリズム (Matlab の関数 ga) を使用して、いくつかのアルゴリズムのパラメーターの最適値を見つけています。1 セットのパラメータについてこのアルゴリズムの品質を計算するには時間がかかりますが、十分に正確であるため、繰り返す必要はありません。しかし、1 つのパラメータ セットを何度もテストすることは、私にとって大きな問題です。どうにかして変更することは可能ですか?

4

1 に答える 1

1

1つの解決策(あなたの質問が求めていると思われるもの-「実行に時間がかかる同じ関数が同じパラメーターで何度も呼び出された場合、計算を高速化するにはどうすればよいですか?」)はMemoization、これは繰り返し計算の結果を非常に迅速に返すことができます。このようなもの:

function output = myAlgorithm(inputs)
    % inputs is a cell array

    persistent memos;

    bFoundMemo = false;
    for ii = 1:length(memos)
        if all(cellfun(@eq, memos(ii).inputs, inputs))
            % Found a memo!
            output = memos(ii).output;
            bFoundMemo = true;
            break;
        end
    end

    if bFoundMemo
        disp('Memo found for given inputs. Returning...');
        % Nothing to do!
        return;
    else
        disp('No memo found for given inputs. Computing...');

        % No memo; do computation
        output = myAlgorithmInner(inputs);

        % Store a memo so we don't have to do it again
        sMemo = struct();
        sMemo.inputs = inputs;
        sMemo.output = output;
        if isempty(memos)
            memos = sMemo;
        else
            memos = [memos; sMemo];
        end
    end
end

function output = myAlgorithmInner(inputs)
    % The real work goes here
    output = inputs{1} + inputs{2}; % a simple example
end

呼び出しの例:

>> myAlgorithm({1 2})
No memo found for given inputs. Computing...

ans =

     3

>> myAlgorithm({1 2})
Memo found for given inputs. Returning...

ans =

     3

明らかに、アルゴリズムと一致するように既存のメモをチェックする入力/出力署名とコードを変更する必要があります。

メモのリストの最大長を追加することもできます。長すぎると、既存のメモを見つける時間がアルゴリズムの計算時間に匹敵するようになる可能性があります。この問題を解決する別の方法は、メモを a などに保存することcontainers.Mapです。これにより、長いリスト内の既存のメモの検索が高速化されます。

于 2013-05-07T10:52:38.797 に答える