【问题标题】:Subset sum algorithm with multiple attributes具有多个属性的子集和算法
【发布时间】:2015-01-23 06:12:58
【问题描述】:

我有一个我认为是子集和问题的问题,我可以使用一些帮助。

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

我可以使用一些指针来说明从哪里开始或如何做到这一点!

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

【问题讨论】:

  • 我有几个需要澄清的问题。我是否正确理解您在 N 组中的每组中都有 X 个对象?您想为 N 个集合中的每一个或所有组合的集合找到 1 个或多个对象组合吗?组合中的对象可以属于不同的集合吗?
  • 好问题。是的,每个集合都有 X 个对象。我想制作 1 个或多个组合,每个集合中只有 1 个对象组合(所以如果我有 5 个集合,使用 5 个对象,每个集合一个)。我明白这不是很清楚。

标签: javascript math


【解决方案1】:

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

假设您可以将对象称为 object[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”数字。 N 个位置中每个位置的“数字”是每个集合中对象的索引。我检查组合是否符合条件并返回第一个符合条件的组合。

更新。下面的函数,其中矩阵参数表示 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;
}

【讨论】:

  • 感谢您的回答。从它的外观来看,我认为它应该可以工作。我会尽快尝试!
  • 我改变了一些东西来优化我从中检索数据的 API,但基本原理是有效的,谢谢!
【解决方案2】:

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

【讨论】:

  • 我确实可以使用它,然后检查每组是否达到我的目标。问题是,如果我有 5 套只有 10 件物品,那么电源组已经变得相当庞大了
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多