如何找到有向图中涉及最大数量的非共享边的循环?


26

我不是计算机科学理论家,但认为此现实问题属于此。

问题

我公司在全国各地设有几家分公司。

我们向员工提供了在另一个部门工作的可能性。但是有一个条件:单位的工人总数不能改变。

这意味着:如果某人想要他的职位,我们将允许其员工离开单位。

示例(虚拟)请求数据:

Name            Origin    Destination
Maria              1  ->  2
Marcos             2  ->  3
Jones              3  ->  4
Terry              4  ->  5
Joe                5  ->  6
Rodrigo            6  ->  1
Barbara            6  ->  1
Marylin            1  ->  4
Brown              4  ->  6
Benjamin           1  ->  3
Lucas              4  ->  1

上面,绘制: 可视化上述数据

看看我们如何在红色,蓝色或黑色选项之间进行选择?

真正的问题要复杂一点,因为我们有27个单元和751个请求。请看一下可视化

目标

收集了所有请求后,如何满足大多数请求?

理论(?)应用

有了图,让每个单元为一个顶点,一个请求为有向边,成功的交换将采取有向循环的形式。G(V,E)VE

每个循环只能使用一次(一个工人不能两次离开他的单位),但是可以多次访问(一个单位可以有许多想离开的工人)。EV

问题

如果这个问题表示为

“如何找到有向图共同包含最大数量的非共享边的循环”?

我们会满足大多数要求者吗?

没错,有一种算法可以找到最佳循环集?

这种贪婪的方法会解决问题吗?

  1. 在上找到最大的有向环;G
  2. 从移除边缘;G
  3. 重复1直到没有定向循环;G

你能帮助我吗?

您是否知道另一种描述原始问题的方式(使大多数请求者感到满意)?

编辑:将部门更改为部门,以更好地描述问题。


3
您确定要避免重复使用同一条边吗?从对应用程序的描述来看,我认为您应该避免多次使用同一顶点,这是一个更好的条件。
伊藤刚(Tsuyoshi Ito)2012年

3
@TsuyoshiIto:据我所知,条件是每个顶点的入度应等于出度。因此,不需要顶点不相交。
冈本

7
顺便说一句,如果我的理解是正确的,则该问题应该可以通过网络流量在多项式时间内解决。就是说,如果我们给一条边上的流量单位给出一个利润单位,而在每条边上给出单位容量,那么问题就是要找到最大利润的流通量。
冈本佳夫2012年

3
这篇文章讨论了您的问题的一般化okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html(每个人都想交易一项,即工作岗位)。
Radu GRIGore 2012年

4
令人敬畏的问题,使我们觉得我们所做的事情真的可以在现实生活中使用:)。
Gopi 2012年

Answers:


9

好的,我阅读了TradeMaximizer的代码,我相信它可以解决以下更一般的问题。

问题:给定的是一个有向图,其弧线具有成本。找到一组顶点不相交的循环,该循环首先使覆盖的顶点数量最大化,其次使总成本最小化。

为了解决这里提出的问题,当想要的工作时,使顶点成为雇员,并绘制单位成本的圆弧。请注意,员工现在是顶点而不是边。令人高兴的是,员工可以说“我真的想要的工作,但也可以”。xyxyyz

解:

  1. 如下构建二部图:为原始图中的每个顶点引入一个左顶点,一个右顶点以及一个弧形其成本巨大(大于原始图中的成本之和))。对于原始图中的每个弧,在二分图中引入一个弧。xxLxRxLxRxyxLyR

  2. 在二部图中找到最低成本的完美匹配。

原始图形也有一些预处理:删除SCC之间的弧,然后如上所述处理所有大小 SCC 。>1

(实际上,TradeMaximizer会根据上述两个条件迭代所有最佳解决方案,以启发式地优化其他事情,例如最大周期的长度。大周期会增加“交易”不通过的可能性,因为人改变主意了。)

PS:作者Chris Okasaki在博客文章上确认了代码的作用。


我设法使用TradeMaximizer找到了解决原始问题的方法。我明天将发布detais。
motobói

@motobói,但您要做的就是我在第二段中写的内容
Radu GRIGore 2012年

我发现对算法这样的解释:boardgamegeek.com/wiki/page/TradeMaximizer
motobói

您能否解释或指出为什么必须去除强连通组件之间的电弧?
motobói

@motobói,这是一种优化(针对一般情况)。步骤(1)和(2)应该足够了。
Radu GRIGore 2012年

22

这是标准的最低成本流通问题。给每个有向边容量,成本。那么,可行的循环是边不相交的有向循环的总和(即,并集),循环的成本是边数的否定。11

因为所有成本和容量都受常数限制,所以简单的循环取消算法将在多项式时间内找到所需的循环。这与显而易见的贪婪算法几乎相同:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

在这里,一个循环的成本是其边缘成本的总和。可以在时间使用Bellman-Ford最短路径算法找到负成本周期。每次迭代将当前循环的成本降低至少1。初始(空)循环的成本为,而最终循环的成本至少为。因此,该算法在最多次迭代后结束,因此其总运行时间最多为。O(VE)0EEO(VE2)

这不是已知最快的算法。


认为只要一个人不想在一个以上的“单元”中工作,它就可以工作,对吗?使用原始问题的措词。但是如果人们想在一个以上的单元中工作,请怀疑这种抽象是否会破坏。OP仅用一个单元就表示了问题,但是这似乎是人为地限制了我。[什么人只有一个偏爱...?]
vzn

1
什么是“人”和“单位”?这是关于图的问题。
杰夫斯

我很困惑:我的示例不是该算法的反例吗?选择C之后,循环C_1和C_2不再是循环(因为每个循环都有一个反向边);C将不会再次使用,因为在反转其边缘后它具有正成本,并且没有引入新的循环。我们在谈论同样的问题吗?希望对问题进行数学表述。
FIB 2012年

3
选择(并反转),删除和共享的的边会留下一个长的有向循环。选择(和反转)产生的结果与从一开始选择和结果相同。(简而言之,。)另外:我的答案是问题的数学表达!CCC1C2CCC1C2C=C1+C2C
杰夫斯

显然,“单位”类似于“部门”,并且用户正在记录部门之间转移的请求(不是部门中特定的确切位置)?FIB图似乎将单位作为顶点,将边缘作为单位之间的放大要求。FiB--“很想有问题的数学公式” ..它真的是给你提供一个确切的表述..你似乎是半路那里..
VZN

4

这种贪婪的方法并不总是能提供最佳解决方案。

考虑一个具有边的循环和两个不相交的循环和每个循环具有边并与共享一个边。n { v 1v 2v nv 1} C 1 C 2 n 1 CCn{(v1,v2),,(vn,v1)}C1C2n1C

如果首先使用最大的循环,则可以使员工感到满意。然后,周期和各自失去一个边沿,不再是周期。n C 1 C 2CnC1C2

但是,如果选择和,则可以使员工感到满意。C 2 2 n 1 = 2 n 2C1C22(n1)=2n2

另外:您可以添加周期,而不是在上面的示例中添加两个周期,这会使贪婪的解决方案更加糟糕。n2


-3

可能有一种图论方法/公式来解决这个问题,但是对我来说,这个问题听起来更像是一个排列问题,其中所有排列中的某些被拒绝,而其他排列是有效的。排列是员工,职位是公司中的“职位”。如果排列不符合“人[x]想要位置[y]”的要求,则拒绝该排列。在这种情况下,单位/部门/组织边界的区分显然对解决方案是多余的。

这种具有约束的置换问题可以很容易地转换为SAT(可满足性)问题的实例。布尔变量分配表示雇员,约束子句表示“人员[x]想要职位[y]”约束。附近有一些经典的例子,一个通常被称为“餐桌”的问题,在这个问题中,您有坐席和来宾,但并非所有来宾都想坐在旁边(或者非常相似,有些来宾要坐在其他客人旁边)。

当然,对于PC上涉及大约多达数百个变量和子句的相当大的实例,也有复杂的SAT解算器,如果问题不是“困难的”,则成千上万个。

参见[1]作为专业参考,[2]作为课堂练习。与所谓的“鸽子洞问题”在结构上也有一些相似之处,这些问题在SAT圈中得到了很好的研究,在这些圈子中,鸽子被分配给鸽子洞,而您所拥有的鸽子洞比鸽子多或少。但是在那种情况下,鸽子通常被认为是可互换的。换句话说,饭桌问题就像约束更严格的鸽子洞问题,客人/鸽子都有要求的偏好。

当然/请注意,对于这些类型的问题,根据约束条件,答案可能是“不存在这种受约束的解决方案”。

[1] 餐桌算法,由crato

[2] CS402普林斯顿HW SAT

[3] 满意度问题,维基百科


我尝试使用trademaximizer进行排列。将一名雇员设置为用户,希望将其X单位替换Y单位。但是该软件不允许一个以上的用户交易同一物品(他的单位)。每个项目都必须是唯一的。为了适应这一点,我将不得不有,比方说,[(琼斯)想要交易单位-C-詹姆斯单位-d-劳拉或单位-d-塞尔吉奥或单位-d-玛丽]
motobói
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.