这个问题的想法是探索无向图的所有节点及其所有邻居。
每个联盟都有相关的权重。 我们的想法是使最大可能配对与最小权重。
考虑到一旦创建,无法加入。 要实现此算法,使用分支和绑定,我必须找到上限和下限。
我的想法是有一个解决方案列表和一个部分列表,其中我介绍了所有可能的邻居对。
然后比较成本是否更低,添加到解决方案列表中。
问题是我不知道用于实现这些界限的启发式方法
伪代码有什么想法吗?
此致
修改
对不起,我离开了这么开放的问题。 让我解释一下这个问题。
在图像中,有三个工会观察到。 (1,3),(2,5),(6,4)。
这些是最佳工会。
对于最优解,必须满足一对(x,y)的并集的权重最小而“x”和“y”永远不会再次匹配
我认为的一个条件是: 如果满足以下条件,则返回所有匹配的列表解决方案:
len (G.nodes ()) / 2 == len (solutions)
我使用贪婪算法。
迭代所有节点并加入未访问且权重最小的邻居。
但是这样,我无法保证最优性。
答案 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;分支规则")。