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