使用分支和绑定的节点的最佳匹配

时间:2015-12-06 23:43:25

标签: nodes graph-algorithm matching networkx branch-and-bound

这个问题的想法是探索无向图的所有节点及其所有邻居。

每个联盟都有相关的权重。 我们的想法是使最大可能配对最小权重

考虑到一旦创建无法加入。 要实现此算法,使用分支和绑定,我必须找到上限和下限。

我的想法是有一个解决方案列表和一个部分列表,其中我介绍了所有可能的邻居对。

然后比较成本是否更低,添加到解决方案列表中。

问题是我不知道用于实现这些界限的启发式方法

伪代码有什么想法吗?

此致

修改

对不起,我离开了这么开放的问题。 让我解释一下这个问题。

在图像中,有三个工会观察到。 (1,3),(2,5),(6,4)。

Optimal matching

这些是最佳工会。

对于最优解,必须满足一对(x,y)的并集的权重最小而“x”和“y”永远不会再次匹配

我认为的一个条件是: 如果满足以下条件,则返回所有匹配的列表解决方案:

len (G.nodes ()) / 2 == len (solutions)

我使用贪婪算法

迭代所有节点并加入未访问且权重最小的邻居。

但是这样,我无法保证最优性

1 个答案:

答案 0 :(得分:1)

正如Abdallah Sobehy在给你的评论中写道,这更像是一个公开的讨论而不是一个问题,并且可能(目前的形式)不适合SE。但是,我会给它一个镜头,并在此处发布,而不是由于其长度而在评论中发布。

对于这个讨论,让我们将完整的无向图表示为G(N,E),带有一组节点和一组边E.我们还假设G中的节点数是偶数。

无论如何,在分支定界(BAB)的背景下,你的上限自然是你最好的(最便宜的)现任(迄今为止)可行的解决方案。这种解决方案可以在初始化时非常容易地启发式构建,例如,

i.   let G' = G and E'=E
ii.  Choose a node, say i, randomly from G'.
iii. With i fixed, pick the edge in (i,j) in E' that minimises cost,     
     i.e., the cheapest edge from node i to any other node j in G'.
iv.  Remove nodes i and j from G', and remove all edges associated
     with nodes i and j from E'.
v.   Is G' non-empty? Go to ii. Otherwise, terminate.

或者上面的一些更聪明的变化。获得的可行解决方案应该是我们的初始上限,比如说UB。

现在,在BAB的背景下,人们通常会看到一个原始问题的放松,一个可以轻松解决到最优的问题;与一些整数线性程序(ILP)的连续松弛相比较,以获得线性程序(LP),使用单纯形法(一种BAB的常用方法)可以很容易地求解为最优性。

出于我们的目的,我们需要指定一种方法来将问题放宽到可以轻松解决的形式,其中这种放松形式的最优解决方案的成本低于原始问题的成本;因此为后者提供下限,比如说LB。如果我们用数学术语来形容问题,那就变得容易了。我们引入二进制变量x_ij(取值0或1),

x_ij := 1, if pairing between nodes i and j is used, i!=j
        0, otherwise
c_ij := cost (or weight) of using edge (i, j), i!=j

其中i,j = 1,...,| N |,i!= j。从现在开始,设n表示| N |,即n = | N |。

有了这个,我们可以说出以下二进制线性程序,比如说(BLP1)到

minimize     ∑{i = 1 to n} ∑_{j 1 to n, j!= i} (c_ij * x_ij)/2,  (a)
subject to   ∑{j != i} x_ij = 1,   for i = 1, ..., n,            (b)
                       x_ij ∈ {0, 1}.                            (c)

" / 2"考虑到 - 以目标函数和的形式 - 每对将与两个非零x_ij变量相关联(即,计数两次);如果是节点1和4配对,x_(1,4)= x_(4,1)= 1。 n个约束(b)确保每个节点将与其他一个节点配对。

这个程序可以通过用连续放松替换双线性约束(c)来放宽,即用(c)替换为:

                       x_ij ∈ [0, 1],                            (c')    

产生以下线性程序,比如说(LP1),到

minimize     ∑{i = 1 to n} ∑_{j 1 to n, j!= i} (c_ij * x_ij)/2,  (a)
subject to   ∑{j != i} x_ij = 1,   for i = 1, ..., n,            (b)
                       x_ij ∈ [0, 1].                            (c')

(BLP1)的解空间显然是(LP1)的子空间,因此(LP1)的最优解产生(BLP1)最优解的下界。由于(LP1)是一个线性程序,它可以通过Simplex方法轻松解决,使用您喜欢的任何喜欢的优化库。

现在,对于BAB过程,求解(LP1)并在其最优解中,选择一些分数x_ij,即一些x_ij∈(0,1),我们将在(LP1)的分支子中---强制执行(向上削减)或排除(向下削减)。让我们来表示这个变量x_ab。在这个x_ab变量上分支,w.r.t。图形匹配问题,可以描述为:"在后续子问题中使用边缘(a,b)强制执行权重(x_ab = 1),或强制完全排除边缘(a ,b)(x_ab = 0)在随后的子问题"

分支x_ab产生---来自(LP1)---两个子问题,比如说(LP1down)和(LP1up),形式如下

(LP1down)
minimize     ∑{i = 1 to n} ∑_{j 1 to n, j!= i} (c_ij * x_ij)/2,  (a)
subject to   ∑{j != i} x_ij = 1,   for i = 1, ..., n,            (b)
                       x_ij ∈ [0, 1],                            (c')
                       x_ab = 0,                                 (d1)

(LP1up)
minimize     ∑{i = 1 to n} ∑_{j 1 to n, j!= i} (c_ij * x_ij)/2,  (a)
subject to   ∑{j != i} x_ij = 1,   for i = 1, ..., n,            (b)
                       x_ij ∈ [0, 1],                            (c')
                       x_ab = 1,                                 (d2)

只需重新解决这些线性编程问题(LP1down)和(LP1up),并迭代重复分支/求解过程,直到可以通过以下方式修剪子问题:

bound: the optimal (linear programming) solution of some sub-problem 
       is larger than the UB of the original problem (BLP1). This mean
       proceeding along such a branch will never give a better (BLP1)
       solution than the best incumbent one.

optimality: optimal (linear programming) solution of some sub-problem
            is binary valued -> feasible in (BLP1).
              -> update UB with new best incumbent solution.

infeasibility: some sub-problem is infeasible; branching upon it will
               still yield an infeasible problem.

如果您运行BAB流程直到终止,您将保证最佳性(大问题的问题是易处理性)。请注意,如果节点数为奇数,则(BLP1)将不可行。

如果您不想使用线性编程技术,请尝试构建自己的方法来放松原始问题,使其具有以下属性

  • 原始问题的解决方案空间是您放松问题的解决方案空间的一个子集。
  • 通过某种方式可以轻松解决轻松的问题,例如试探法。
  • 决定什么"分支"在您的上下文中意味着:我建议修复包含排除节点对的内容。

然后简单地重复使用上面简要介绍的一般BAB方法。如果您更深入地了解BAB,有几种方法可以通过选择首先处理哪些子问题("节点选择")或哪些变量(在正式处理中)进行分支来改进框架(&# 34;分支规则")。