2013-03-27 99 views
0

我使用矩阵作为使用NSGA-II在matlab中的多目标优化的初始总体。我的染色体载体(C)的大小为1x192,每个基因必须在0<=gene<=40的范围内,基因必须是整数。的规则是,6个基因分组的总和必须小于或等于40.that是:根据规则使用随机整数填充矩阵

sum(reshape(6,[]))<=40 

我已经使用下面的代码,但它地输出全零矩阵人口(人口矩阵= 500条染色体垂直串联)或基质不满足该规则:

 X=zeros(500,192); 
    while i<501 
     r=randi(40,6,32); 
     if nnz(((sum(r))./40)>1)==0 
     X(i,:)=reshape(r,1,[]); 
     i=i+1; 
     clear r; 
     else 
     clear r; 
     end 
    end 

它还服用永远退出while循环。 我在这里做错了什么?有没有其他的方法来做到这一点?

我也试过这样:

i=1; 
while i<17500 
r=randi([1,40],6,1); 
s=sum(r); 
    if s<=40 
    X(:,i)=r; 
    i=i+1; 
    else 
    clear r; 
    end 
end 
X=unique(X','rows')'; 
A=X(:,randperm(size(X,2))); 
A=X(randperm(size(X,1)),:); 

上述尝试创建将重塑人口随机矩阵列。但数字正在重复;即在17500(删除重复列后的16448)列中没有出现数字37和40.有什么办法可以优化生成的随机数的传播吗?

@ 0x90 我有一个载体,称为'染色体',大小为1x192,每个连续的6个成员(称为表型)组合必须总和为40或更少。为了更清楚: problem details 也就是说,每个P必须是一个整数,范围在0到40之间,每个表型的总和必须是< = 40。我需要500个这样的染色体。

我希望现在有道理。 > <

+0

我基本上是试图建立一个'6x32'矩阵的元素是整数成员范围[0,40],使得矩阵中的每一列的总和至多为40 – 2013-03-27 22:01:21

+0

你如何想要分配每一行中的元素?如果每行的总和是有限的,那么其中的值将不会统一分布... – 2013-03-27 22:56:20

+0

不是行,每个生成的列的总和必须为40.每个整数至少必须等于[0,40 ]但我主要看到整数低于30. – 2013-03-28 18:36:48

回答

1

您应该使用randi([min,max],n,m)randint将被弃用。

>> r = randi([1,4],3,2) 

r = 

    3  3 
    2  2 
    4  4 
+0

我试过'randi([1,4],3,2)'但它仍然不会退出while循环。最重要的是,我的Matlab崩溃了T_T。 – 2013-03-27 20:17:16

+0

你为什么在循环中做? – 0x90 2013-03-28 07:29:57

+0

我必须使用满足规则的向量来填充大小为500的人口矩阵。我怎样才能做到这一点没有循环? – 2013-03-28 18:39:07