【问题标题】:Pre-allocate an array of structures for use in genetic algorithm in Matlab在 Matlab 中预分配用于遗传算法的结构数组
【发布时间】:2013-06-28 15:47:39
【问题描述】:

这是我目前的代码:

population = 50
individual = repmat(struct('genes',[], 'fitness', 0), population, 1);

所以我正在做的是创建一个由 50 个个体组成的群体,这些个体每个都具有组成基因和适应性。我似乎无法正确做的是将基因设置为 50 细胞阵列,而不仅仅是单个细胞。

谁能帮我解释一下?

我想做的进一步补充是用随机值(0 或 1)填充基因数组。我想我可以通过遍历每个成员的基因数组并使用 Matlab 提供的任何随机数生成功能来轻松地做到这一点。但是,在预先分配结构时这样做会更有效率。

谢谢

【问题讨论】:

    标签: arrays matlab structure


    【解决方案1】:

    为什么不使用类而不是结构?创建一个简单的类person

    classdef person
        properties
            fitness = 0;
        end
        properties(SetAccess = private)
            genes
        end
        methods
            function obj = person()
                obj.genes = randi([0 1], 10, 1);
            end
        end
    end
    

    然后运行以下脚本:

    population = 50;
    
    people = person.empty(population, 0);
    people(1).fitness = 100;
    people(2).fitness = 50;
    
    people(1)
    people(2)
    

    产生以下控制台输出:

    ans = 
    
      person with properties:
    
        fitness: 100
          genes: [10x1 double]
    
    
    ans = 
    
      person with properties:
    
        fitness: 50
          genes: [10x1 double]
    

    【讨论】:

    • +1:对象也是我的选择:漂亮、独立、可管理的东西,让复杂性远离更高层次
    【解决方案2】:

    如果您希望为每个人分配不同的随机值,那么将 repmat 作为分配将无济于事,因为这只会将同一事物复制 50 次。你最好只使用一个简单的循环:

    population=50;
    individual=struct('genes',[],'fitness',0);
    for m=1:50
        individual(m).genes=rand(1,50)>=0.5;
    end
    

    这并不比分配所有它们然后循环更有效 - 在每种情况下,基因数组只分配一次。此外,分配和重新分配 50 个单元不会很慢 - 在达到数千或数万之前,您可能不会注意到太大的差异。

    【讨论】:

    • 非常感谢。这有很大帮助。
    【解决方案3】:

    好吧,保持结构,这里有几种方法:

    % Your original method
    clear all
    tic
    population = 50;
    individual = repmat(struct('genes', false(50,1), 'fitness', 0), population, 1);
    toc
    
    % simple loop
    clear all
    tic
    population = 50;
    individual(population,1) = struct('genes', false(50,1), 'fitness', 0);
    for ii = 1:population
        individual(ii).genes = false(50,1);
    end
    toc
    
    % Third option
    clear all
    tic
    population = 50;
    individual = struct(...
        'genes'  , num2cell(false(50,population),2), ...
        'fitness', num2cell(zeros(population,1)));
    toc
    

    结果:

    Elapsed time is 0.009887 seconds.  % your method
    Elapsed time is 0.000475 seconds.  % loop
    Elapsed time is 0.013252 seconds.  % init with cells
    

    我的建议:只使用循环:)

    【讨论】:

      【解决方案4】:

      你可以做类似的事情:

      individual = repmat(struct('genes',{cell(1,50)}, 'fitness', 0), population, 1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多