【问题标题】:Subset Sum with neighbourhood search - java带有邻域搜索的子集和 - java
【发布时间】:2016-06-20 12:58:40
【问题描述】:

我正在尝试使用邻域算法来实现子集和问题。 这是伪代码: 1. Generate a random solution for the problem and call it S 2. Compute the neighborhood of S and choose S' as the best solution in the neighborhood 3. If S' is better than S then go to step 4, else go to step 6 4. S = S' 5. Go to step 2 6. Return S as the best solution encountered 给定一个包含 10 个元素(+ve 和 -ve)的集合 X,我必须找到 X 的一个子集,使得总和尽可能接近 0。

按照伪代码,我生成了一个随机解 S,但在构建邻域 S 时遇到了一些困难。

如何计算 S 的邻域? S附近是什么地方?

例如

X = [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9]

S = [x1, x7, x2, x3]

S 附近是什么地方?

【问题讨论】:

  • 这方面有什么更新吗?

标签: java algorithm subset-sum neighbours


【解决方案1】:

社区没有唯一的定义,这取决于问题。在您的情况下,一个好的定义可能是 all the tuples that have (at most) n different elements from the current solution,其中 n 可能是 1, 2 , size - 1(如果您采用 n = size,则您正在考虑整个解决方案空间并且谈论邻域没有更多意义)。

在您的示例中,采用与当前步骤不同的所有解决方案在以下一组解决方案中结束:

D = [ [x0, x7, x2, x3], [x4, x7, x2, x3], [x5, x7, x2, x3], [x6, x7, x2, x3], [x8, x7 , x2, x3], [x9, x7, x2, x3], [x1, x0, x2, x3], [x1, x4, x2, x3], ... ]

【讨论】:

    【解决方案2】:

    让我们用这个例子:

    S 是一种解决方案,让我们看看如何从中生成另一种解决方案:

    • 我们可以向其中添加另一个 x_i,例如 [x1, x2, x3, x7, x8]
    • 或者我们可以从中删除 x_i,例如 [x2, x3, x7]

    使用上述操作之一从 S 获得的每个此类解决方案都是 S 的邻居。所有此类解决方案都形成邻居。

    请记住 [x1, x3, x2] 和 [x1, x2, x3] 是相同的解决方案,因为元素的顺序无关紧要。


    形式上每个解都是一个长度为 10 的二进制向量 v,由 0 和 1 组成,例如 如果对应的解包含 x_i,则 v[i] == 1。

    与示例中的 S 对应的向量如下所示: S = [0, 1, 1, 1, 0, 0, 0, 1, 0, 0]

    每个这样的向量都是解图中的一个顶点。两个这样的顶点之间的边存在,如果一个可以使用某种简单的操作(例如上面描述的那些)转换成另一个。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多