在Matlab中使用遗传算法测试一组参数一次

时间:2013-05-07 10:42:51

标签: matlab genetic-algorithm

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

1 个答案:

答案 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中,这将加快在长列表中搜索现有备忘录。