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