请您分享您对以下问题的看法
假设你有像
这样的一维矢量数据Data=[ a1 a2 a3 a4..... an]; 0<ai<100
我们如何找到数据的子集,例如
Data_subset=[ a3 a7 a8] or Data_subset=[ a1 a17 a81 a92 a93 a100 a101 ]
最符合此条件:abs(sum(Data_subset)-700)<10
任何想法?
答案 0 :(得分:0)
您可以按
计算唯一子集的数量(忽略顺序)唯一=和(((N-1)^ 2 + N-1)/ 2)+ N. 从N = 1到N = 99
因此,如果您只需要对长度为100的向量执行此操作,那么您将只有166750个唯一数据子集。在这种情况下,您应该通过测试每个子集来强制解决问题,即如果您可以创建生成它们的方法。
你可以使用像matlab函数perms()这样的东西,它会给你向量的每个排列,除了你应该有类似1e156的不同排列。
我能想到的唯一部分解决方案是使用randperm()然后创建一个测试随机排列子集的循环
nPerms = 100
subSetsSaved = cell()
cellIndex=1;
for iRand=1:1:nPerms
randOrder = randperm(length(data));
dataPerm = permute(data,randOrder);
for jSub=1:1:length(data)
subSet = dataPerm(1:jSub);
if (abs(sum(subSet)-700)<10)
subSetsSaved{cellIndex} = subSet;
cellIndex = cellIndex+1;
end
end
end
您甚至可以使用此随机置换循环来尝试随机生成所有166750个唯一子集。您所要做的就是随机生成,排序和测试唯一性。这些解决方案当然在效率方面并不理想,因此如果这是一个问题,您需要快速解决,或者如果您的设置远大于N = 100,则需要采用不同的方法。