具有多个属性的子集和算法

时间:2015-01-22 20:18:26

标签: javascript math

我认为我认为是一个子集和问题,我可以使用它。

我有N套,其中有X个对象。每个对象有5个整数属性a,b,c,d和e。现在我想找到1个或更多(可能不是全部因为X可能变得相当大)对象组合,其中所有a的总和近似于变量A(所以例如近似100我会说110> sum( a)> 90),所有b的总和近似变量B等。

我可以使用一些关于从哪里开始或如何做到这一点的指针!

(我想用JavaScript做,但任何伪代码都会有用!)

2 个答案:

答案 0 :(得分:1)

这不是我通常会解决此类问题的方法,但也许您可以尝试这样的方法来获得一个组合(在伪代码中)。

假设您可以将对象称为对象[i] [j],其中i是集合索引,j是对象索引。总的来说,有X ^ N个组合。

var result;
var sumPrevious;
for (var k = 0; k < Math.pow(x, N); k++) {
  result = [];    //array where we'll store one combination
  sumPrevious = 0;
  for (var i = 0; i < N; i++) {
    objectIndex = Math.floor((k - sumPrevious) / Math.pow(x, N-i-1));
    sumPrevious = sumPrevious + objectIndex * Math.pow(x, N-i-1);
    result[i] = object[i][objectIndex];
  }
  if (result meets your criterion) {
    return result;  //return the first result that meets the criterion, which limits the number of iterations
  }
}

我还没有测试过,所以我不确定这段代码是否有效。但一般原则是正确的。每个组合由从0到x ^ N-1(伪码中的k)的数字表示。然后我将这个数字作为基数X&#39;数。数字&#39;在每个N个位置是每个集合中对象的索引。我检查组合是否符合标准并返回第一个组合。

更新。下面的函数,其中matrix参数表示N组X对象,返回所有可能的对象组合。如果您只是返回符合条件的第一个结果而不是将其推送到allCombinations数组,那么您可能会获得所需的第一个组合。

var combinations = function(x, N, matrix) {
  var allCombinations = [];
  var result;
  var sumPrevious;
  for (var k = 0; k < Math.pow(x, N); k++) {
    result = [];    //array where we'll store one combination
    sumPrevious = 0;
    for (var i = 0; i < N; i++) {
      objectIndex = Math.floor((k - sumPrevious) / Math.pow(x, N-i-1));
      sumPrevious = sumPrevious + objectIndex * Math.pow(x, N-i-1);
      result[i] = matrix[i][objectIndex];
    }
    allCombinations.push(result);
  }
 return allCombinations;
}

答案 1 :(得分:0)

如果我理解你是正确的,那么你正在寻找一套功率集算法。如果是这样,您可以在此处找到可以修改的JavaScript实现:http://rosettacode.org/wiki/Power_set