1

这是我到目前为止的代码:

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

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

任何人都可以为我解释一下吗?

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

谢谢

4

4 回答 4

2

为什么不使用类而不是结构?创建一个简单的类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]
于 2013-06-28T16:04:34.437 回答
1

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

% 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

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

于 2013-06-28T16:07:08.237 回答
1

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

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

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

于 2013-06-28T15:58:19.267 回答
0

你可以做类似的事情:

individual = repmat(struct('genes',{cell(1,50)}, 'fitness', 0), population, 1);
于 2013-06-28T16:06:24.977 回答