目的是:运行之后输出所有的排列组合情况(即输出常规矩阵),以及对应的计算值。
问题是:现目前的程序只能输出一个组合结果及对应值,不能一次输出所有的组合情况。
请各位大佬指教,谢谢!
%% (1)初始化,随机生成cellA,B是A中每个元素的向量长度,D是A中每个位置的组合数索引
clear;
clc;
row=4;
column=4;
B=zeros(1,row*column);
D=ones(1,row*column);
A={0.5,[0.6,0.7,0.8],[0.1,0.2],0.4;
[0.4,0.3,0.2],0.5,[0.4,0.5],0.1;
[0.9,0.8],[0.6,0.5],0.5,[0.2,0.3];
0.6,0.9,[0.8,0.7],0.5}
for i=1:row
for j=i+1:column
index=(i-1)*column+j;%取出元素下角标 %转换为单索引
B(index)=length(A{i,j});
end
end
B
%% (2)对A取随机,生成randA
randA=cell(row,column);
for j=1:size(A,1)
for k=1:size(A,2)%返回A的第2维的尺寸。
r=randperm(length(A{j,k}));%randperm将一列序号随机打乱,序号必须是整数
randA{j,k}=A{j,k}(r);%rand函数产生由在(0, 1)之间均匀分布的随机数组成的数组。
end
end
randA
%%(3) 罗列所有的组合可能,每种组合对应一个从A中随机取元素生成的矩阵AI,对AI中所有元素求和即的C(i),最终输出C;
% B(find(B==0))=[];
E=[];
E=B(find(B~=0))
num=prod(prod(E)); %组合总数目 %求数组元素的乘积
C=zeros(1,num); %输出向量
for i=1:num
for j=1:length(D)
rowIndex=ceil(j/column);
columnIndex=j-(rowIndex-1)*column;
AI(rowIndex,columnIndex)=randA{rowIndex,columnIndex}(D(j));
AI(columnIndex,rowIndex)=1- AI(rowIndex,columnIndex);
end
% end
comb=length(D);
while comb~=0
if D(comb)
D(comb)=D(comb)+1;
break;
else
D(comb)=1;
comb=comb-1;
end
end
end
n=4;
sum=0;
for g=1:num %没有做到矩阵循环效果
for i=1:n-2
for j=i+1:n-1
for k=j+1:n
sum=sum+abs(AI(i,j)+AI(j,k)-AI(i,k)-0.5);
sum;
end
end
end
CI=(4/(n*(n-1)*(n-2)))*sum;
C(1,g)=1-CI;
end