2013-03-27 75 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