0

我正在使用遗传算法(Matlab 中的函数 ga)来查找某些算法的参数的最佳值。为一组参数计算该算法的质量是耗时的,但足够精确,无需重复。但是 ga 多次测试一组参数,这对我来说是个大麻烦。有可能以某种方式改变它吗?

4

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

显然,您应该修改输入/输出签名和检查现有备忘录的代码以匹配您的算法。

您可能还想为备忘录列表添加最大长度 - 如果它变得太长,找到现有备忘录的时间可能会与算法的计算时间相当!解决此问题的另一种方法是将备忘录存储在例如 acontainers.Map中,这将加快在长列表中搜索现有备忘录的速度。

于 2013-05-07T10:52:38.797 回答