Nested for loops without repetition
5 views (last 30 days)
Show older comments
Juan Ruiz Osorio
on 1 Aug 2020
Edited: Juan Ruiz Osorio
on 1 Aug 2020
Hi, I have the following problem. Supose I have shirts of 10 diferent colors , and I need to combine the shirts with a maximum number of 8 and only two colors without repetition. For example , I can have 2 blue shirts+3 black shirts but i don't need the 3 black shirts+2 blue combination because is repeated. I was trying to do this by using 4 for loops as follows
Colors(:,1)={'B';'BK';'R';'G';'M';'C';'Y';'O';'V';'GR'};
Info=struct;
Info.Combination{1,1}='Number of shirts Color1';
Info.Combination{1,2}='Number of shirts Color2';
Info.Combination{1,3}='Color1';
Info.Combination{1,4}='Color2';
CA=2; %Counter of combinations
MaxShirt=8; %Maximum number of shirts in the combination
for k=1:size(Colors,1)
CB=1; %Counter for the first color of shirts
CB2=1; %Counter for the second color of shirts
for ii=1:size(Colors,1)
for l=1:MaxShirt
for iii=1:MaxShirt-1
if CB+CB2>MaxShirt
break
end
if k==ii %Only one color of shirts
Info.Combination{CA,1}=CB+CB2; %Amount of first shirts
Info.Combination{CA,2}='NA'; %Does not apply
Info.Combination{CA,3}=Colors(k); %Amount of first shirts
Info.Combination{CA,4}='NA'; %Does not apply
else %Two colors of shirts
Info.Combination{CA,1}=CB; %Amount of first shirts
Info.Combination{CA,2}=CB2; %Amount of second shirts
Info.Combination{CA,3}=Colors(k); %Amount of first shirts
Info.Combination{CA,4}=Colors(ii); %Amount of second shirts
end
CB2=CB2+1;
CA=CA+1;
end
CB2=1;
CB=CB+1;
end
CB=1;
end
end
By doing that I have two problems of repetition. The first one is the repetition, as i mentioned at before. The second one appears because some combinations are the same, for example 2 blue shirts + 3 black shirts and some rows ahead the same combination 2 blue shitrs + 3 black shirts appears again.
0 Comments
Accepted Answer
Bruno Luong
on 1 Aug 2020
Edited: Bruno Luong
on 1 Aug 2020
I won't fix your code with 4/5 nested for-loops and if conditions and ....
Colors(:,1)={'B';'BK';'R';'G';'M';'C';'Y';'O';'V';'GR'};
MaxShirt=8;
maxk = 2;
Combination = [];
for k=1:maxk
% FEX file: all-permutations-of-integers-with-sum-criteria
% https://www.mathworks.com/matlabcentral/fileexchange/17818
n = allVL1(k,MaxShirt-k,'<=')+1;
c = nchoosek(Colors(:)',k);
p = size(n,1);
q = size(c,1);
[P,Q] = ndgrid(1:p,1:q);
N = n(P(:),:);
C = c(Q(:),:);
N = num2cell(N);
N(:,end+1:maxk) = {'NA'};
C(:,end+1:maxk) = {'NA'};
Combination = [Combination; [N, C]];
end
3 Comments
Bruno Luong
on 1 Aug 2020
Edited: Bruno Luong
on 1 Aug 2020
Here is the modification with your new requirements. Usually I don't do this kind of adaptation.
People asking questions rarely think that the solution might be completely different when the specification changes.
I really dislike questions that have been not correctly specified at the start. ;-(
Colors(:,1)={'B';'BK';'R';'G';'M';'C';'Y';'O';'V';'GR'};
MinShirt=2;
MaxShirt=8;
MaxDist = 2;
maxk = 2;
Combination = [];
for k=1:maxk
% FEX file: all-permutations-of-integers-with-sum-criteria
% https://www.mathworks.com/matlabcentral/fileexchange/17818
n = allVL1(k,MaxShirt-k*MinShirt,'<=')+MinShirt;
c = nchoosek(1:length(Colors),k);
c(c(:,end)-c(:,1) > MaxDist,:) = [];
c = Colors(c);
p = size(n,1);
q = size(c,1);
[P,Q] = ndgrid(1:p,1:q);
N = n(P(:),:);
C = c(Q(:),:);
N = num2cell(N);
N(:,end+1:maxk) = {'NA'};
C(:,end+1:maxk) = {'NA'};
Combination = [Combination; [N, C]];
end
More Answers (0)
See Also
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!