我正在使用遗传算法(Matlab 中的函数 ga)来查找某些算法的参数的最佳值。为一组参数计算该算法的质量是耗时的,但足够精确,无需重复。但是 ga 多次测试一组参数,这对我来说是个大麻烦。有可能以某种方式改变它吗?
问问题
317 次
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
显然,您应该修改输入/输出签名和检查现有备忘录的代码以匹配您的算法。
您可能还想为备忘录列表添加最大长度 - 如果它变得太长,找到现有备忘录的时间可能会与算法的计算时间相当!解决此问题的另一种方法是将备忘录存储在例如 acontainers.Map
中,这将加快在长列表中搜索现有备忘录的速度。
于 2013-05-07T10:52:38.797 回答