我正在尝试使用邻域算法实现子集和问题。下面是伪代码:给定一个包含10个元素的集合X (+ve和-ve),我必须找到X的一个子集,使得和尽可能接近于0。
在伪代码之后,我生成了一个随机的解决方案S,但我在构建邻居S时遇到了一些困难。
如何计算S的邻域?S的邻域是什么?
例如。
X= x0、x1、x2、x3、x4、x5、x6、x7、x8、x9
S= x1、x7、x2、x3
S的邻域是什么?
发布于 2016-06-20 21:13:53
邻里关系没有一个独特的定义,它取决于问题。在您的例子中,一个好的定义可能是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,,... ]
发布于 2016-06-20 21:33:48
让我们使用下面的例子:
S是一个解决方案,让我们看看如何从它生成另一个解决方案:
使用上述操作之一从S获得的每一个这样的解都是S的邻域。所有这些解都来自邻域。
请记住,x1、x3、x2和x1、x2、x3是相同的解决方案,因为元素的顺序并不重要。
形式上,如果相应的解包含x_i,则每个解都是长度为10的二进制向量v,它由0和1组成,例如vi == 1。
与示例中的S对应的向量将如下所示:S= 0,1,1,1,0,0,0,0,1,0,0
每一个这样的向量都是解图中的一个顶点。如果可以使用某种简单的操作将一个顶点转换为另一个顶点,则存在两个这样的顶点之间的边。
我希望这能帮到你。
https://stackoverflow.com/questions/37923241
复制相似问题