匿名用户
1级
2014-03-29 回答
这不就是6取3的组合问题吗?可以用nchoosek函数:
>> nchoosek(1:6,3)
ans =
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6
追问:
不是啊,我是要分成三组,而不是6取3,我建立的目标函数与这种分组有关
追答:
抱歉,看错了。
这个问题我没想出好办法来,现在编的程序勉强可用,但应该会有更好的做法。
分组的方式应该只有1+1+4、1+2+3和2+2+2三种,主要难点在于怎样避免重复,尤其对于2+2+2的情况。我写了一个函数如下:
function B = remove_duplicate(B)
for i=1:prod(size(B))
B{i}= sort(B{i});
end
for i=size(B,1) : -1 : 1
C = B(i,:);
p = perms(1:length(C));
try
for j=1:size(p,1)
for k=1:i-1
if isequal(C(p(j,:)),B(k,:))
error('catch');
end
end
end
catch
B(i,:) = [];
end
end
基本思想是,先对全排列进行分组生成所有的可能组合,然后删除重复项:
A = perms(1:6);
B1 = remove_duplicate(mat2cell(A,ones(size(A,1),1),[1 1 4]));
B2 = remove_duplicate(mat2cell(A,ones(size(A,1),1),[1 2 3]));
B3 = remove_duplicate(mat2cell(A,ones(size(A,1),1),[2 2 2]));
B=[B1;B2;B3];B的每一行是一种分组方案,共90种。这个结果应该是正确的,只是效率不算高。