图的代数

图论是我最喜欢的数学和计算科学主题,我将在这篇博文中介绍图的代数我已经努力了一段时间。代数已经成为我操作图形的工具,我希望你也会发现它很有用。

这项工作的根源可以追溯到我在2009年CONCUR会议上提交的文件,该文件被正确地拒绝了。随后,我发表了一些针对具体应用的论文,逐渐提高了我对代数的理解。最全面的描述可以在ACM TECS公司(有预印本在这里). 在这里,我将对图代数的最简单版本进行一般介绍,并展示如何在Haskell中实现它。

更新:这一系列博客文章是作为功能珍珠在2017年哈斯克尔研讨会上。

构建图形

G公司是一组顶点来自固定宇宙的图。例如,我们可以考虑顶点为正整数的图。图g∈g可以用一对表示(V、E)其中V是其顶点集,E⊆V×V是其边集。

最简单的可能图形是空的图表。我将用以下方式表示ε公式和依据空的在Haskell代码中。因此,ε=(∅,∅)和ε∈G。

带有单个顶点v将简单地表示为v(v)例如,1∈G是具有单个顶点1的图,即({1},∅)。在哈斯克尔我会用顶点将给定的顶点提升为图的类型。

为了从上述原语构造更大的图,我将使用两个二进制运算符覆盖连接,分别用+和→表示。两个图形的叠加+定义为:

(五)1,E1)+(V2,E2)=(V1(V)2,E1“E2)

换句话说,两个图的重叠只是它们的顶点和边的并集。connect→的定义类似:

(五)1,E1)→(V2,E2)=(V1(V)2,E1“E2(V)1×V2)

不同的是,当我们连接两个图时,我们从左参数中的每个顶点向右参数中的各个顶点添加一条边。以下是几个示例:

  • 1+2是具有两个孤立顶点1和2的图。
  • 1→2是顶点1和2之间具有有向边的图。
  • 1→(2+3)是具有三个顶点{1,2,3}和两条有向边(1,2)和(1,3)的图。在哈斯克尔我们可以写作连接1(覆盖2 3).
  • 1→1是带有顶点1和a的图自循环(从顶点到自身的边)。

以下类型类在Haskell中表达了上述内容:

 图表  哪里
    类型 顶点空的   :: 
    顶点  :: 顶点  -> 
    覆盖 ::  ->  -> 
    连接 ::  ->  -> 

让我们构造一些图!包含给定的未连接顶点列表的图可以按如下方式构造:

顶点 :: 图表  =>[顶点 ]-> 顶点= 文件夹覆盖为空. 地图顶点

这里有一个集团给定顶点列表上的(完全连通图):

集团 :: 图表  =>[顶点 ]-> 集团= 文件夹连接为空. 地图顶点

例如,集团[1..]是所有正整数上的无限团;我们将把这种派系称为覆盖整个宇宙的派系完全图.我们也可以构造任何给定其边缘主义者:

从边缘列表 :: 图表  =>[(顶点 ,顶点 )]-> 从边缘列表= 文件夹覆盖为空. 地图边缘哪里边缘(x,年)=顶点x`连接`顶点y

正如我们将在下一节中看到的那样,图满足几个定律,并形成一个与半环.

代数结构

上面介绍的结构(G,+,→,ε)满足许多常见的定律:

  • (G,+,ε)是幂等可换的幺半群
  • (G,→,ε)是幺半群
  • 分布在+上,例如1→(2+3)=1→2+1→3

以下内容分解公理,是使图代数不同于半环的唯一定律:

x→y→z=x→y+x→z+y→z

实际上,在半环中,这两个算子有不同的单位元,让我们将它们表示为ε+和ε分别是。通过使用分解公理,我们可以证明它们是一致的:

         ε+   = ε+εε (→的标识)
= ε+ε + ε+ε + εε (分解)
= ε+ + ε+ + ε (→的标识)
= ε (+的标识)

+的幂等性也遵循分解公理。

以下是描述图代数的最小公理集:

  • +是交换的和结合的
  • (G,→,ε)是幺半群,即→是结合的,ε是单位元
  • 分布在+
  • 可以分解为:x→y→z=x→y+x→z+y→z

读者的练习:从上述最小公理集证明ε是+的恒等式。这可不是小事!还证明了+是幂等的。

注意,要从有向图切换到无向图,添加→的交换性公理就足够了。我们将在中对此进行探讨未来的博客帖子.

示例

让我们看一下图表类型满足上一节中的规则的类。第一个叫关系,采用我们基于集合的覆盖和连接操作符定义,因此是自由的实例(即不符合任何其他法律):

数据 关系= 关系{域:: 设置,关系:: 设置(a),a) }衍生(等式,显示)实例 订单  => 图表(关系 )哪里
    类型 顶点(关系a)=空的= 关系 设置.空的设置.空的顶点x= 关系(设置.单例x)设置.空的覆盖x y= 关系(域x`设置.联合`domain y)(关系x`设置.并集`关系y)连接x y= 关系(域x`设置.联合`domain y)(关系x`设置.并集`关系y`设置.工会`设置.来自DistinctAscList[(a),b)|<- 设置.元素(域x),b条<- 设置.元素(域y)])

让我们也做关系的实例号码键入class,以便使用+和*运算符。

实例(订单 ,号码 )=> 号码(关系 )哪里
    from整数 =顶点. from整数
    (+)         =覆盖(*)=连接符号      = 常数空的防抱死制动系统         = 身份证件
    否定      = 身份证件

注:号码法律abs x*符号x==x满足,因为x→ε=x。事实上,任何图表实例可以成为号码实例,如果需要的话。我们现在可以使用交互式GHC玩图形了:

λ> 1* (2 + ):: 关系 国际
关系{域=来自列表[1,2,],关系=来自列表[(1,2),(1,)]}λ> 1* (2 + )+ 2* ==(集团[1..]:: 关系 国际)真的

通过将所有图构造函数嵌入到基本代数数据类型中,可以获得另一个简单的实例:

数据 基本= 清空
             | 顶点| 覆盖(基本a)(基本a)| 连接(基本a)(基本a)衍生 显示

实例 图表(基本 )哪里
    类型 顶点(基本a)=空的= 清空顶点= 顶点覆盖= 覆盖连接= 连接

我们不能使用派生的等式例如,因为这显然违反了代数定律。覆盖空空在结构上与清空。但是,我们可以实现自定义等式实例如下:

实例 订单  => 等式(基本 )哪里x个===到关系x==到关系y哪里
        到关系 :: 订单  => 基本  -> 关系 到关系=折叠基础折叠基础 ::(顶点 ~,图表 )=> 基本  -> 折叠基础清空         =空的折叠基础(顶点x)=顶点x折叠基础(覆盖x年)=覆盖(折叠基本x)(折叠基本y)折叠基础(连接x年)=连接(折叠基本x)(折叠基本y)

这个基本实例很有用,因为它可以更紧凑地表示紧密连接的图。例如,集团[1.n]::基本智力在内存中具有线性大小表示,而集团[1.n]::关系Int分别存储每条边,因此O(n)2)内存。正如我将在未来的博客文章中演示的那样,我们可以利用紧凑的图表示来推导算法,这些算法在稠密图上的速度比在边缘专家上运行的现有图算法更快。

总结

几年来,我在许多不同的项目中使用了上述图形代数,发现它非常有用。我将介绍一些代数的味道后续博客帖子允许处理无向图、传递闭图(也称为部分订单依赖图)、图形族及其各种组合。代数的所有这些风格都可以通过扩展公理集来获得。

我在哈斯克尔图书馆工作藻类实现图的代数,并打算很快发布。如果您对如何改进上述代码片段有任何建议,请告诉我。

关于“图的代数

    1. 你同意我们可以用一对顶点和边来表示任何普通的旧图吗?

      然后,分解公理简单地声明,此类对上的运算符+和->满足等式x->y->z=x->y+x->z+y->z。我没有给出证明,但它不是很复杂:只需用定义替换公理中的+和->。

      我定义+和->的方式并不是使分解公理工作的唯一方式,可能还有其他合适的定义。

      希望这能澄清问题!

        1. 我更喜欢在类Graph的定义中使用“connect”,因为它相对于边有向性是相对中性的,因此可以由有向图和无向图实例使用。但我明白你的意思!

  1. 我很喜欢你在这篇文章中对图表的处理。然而,在我看来,您通过声明边是有序对(从而导致有向图处理),对边进行了常见的过度简化。我更喜欢Tutte[1]的作品:

    >图G由边的集合E(G)和顶点的(不相交)集合V(G)组成,以及与每条边相关联的两个顶点(不一定是不同的)称为其端点的关联关系。

    注意,这个定义对不同类型的图(无向图、平面图、容易扩展到超图等)有更好的适应性。

    我很想看看你的库进展如何,并可以帮助尝试在其中支持fgl图;当需要进行测试时,fgl-anquisive可能会有所帮助[2]。

    [1]:http://www.sciencedirect.com/science/article/pii/S1385725861500455
    [2]:https://hackage.haskell.org/package/fgl-arbirry-0.2.0.2/docs/Data-Graph-Inductive-Arbirary.html#g:5

    1. 非常感谢Ivan!你(和Martin Erwig)的fgl库很酷,我一定会研究这个代数与fgl的关系。

      关于边:请注意,代数本身并没有以任何特定的方式定义边,因此我相信它也可以描述使用Tutte的边定义表示的图,这确实更通用。正如我提到的,如果你添加一个->的交换性公理,把它变成类似-的东西,那么边就会变成无向的,即无序对1-2=2-1。

  2. 你知道其他类似的例子吗?在这些例子中,恒等元由半环的两个操作共享?

    你有没有研究过图构造的其他自然操作,特别是那些可以给出半环结构的操作?

    不知道你对此有什么宏伟的看法,但在下一篇文章中,从分类的角度探讨这一点也很有意思……单元类和图元类、环和图代数类之间的函子是什么,这些问题是否合适?

    我当然在想。。谢谢你的帖子!

    1. 你问的问题很有趣!

      我没有发现任何半环代数对这两个操作具有相同的恒等式(除了一些琐碎的操作)。我还在找,如果你遇到这样的情况,请告诉我。

      有许多类似于图的半环,我看过其中许多,例如Kleene代数。到目前为止,我还没有发现任何带有分解公理的代数。

      为什么我需要分解公理?我实际上还没有提供它的动机(或者为什么我定义覆盖并以我这样的方式连接)。所以,这里是:我想用表达式表示*任意*图和*仅*图,所以表达式x->y->z应该只是一个图,因此我应该能够用较小的块构造它。但这些碎片应该是什么呢?我们不能使它等于x->y+y->z,因为->的定义是偏的,因为不可能总是找到需要连接到z的“最后一个节点”(在本例中是y)(例如,左侧可能是一个循环)。唯一可行的选择是将左侧的所有顶点连接到右侧的所有顶点,这直接导致分解公理。

      关于你的范畴理论问题:我对范畴理论知之甚少,所以我认为我在这个方向上做不到任何明智的事情。事实上,我还需要一些时间来理解你的问题🙂 但如果你有什么想法,我很想听听你的意见——请随时通过电子邮件与我联系,我们可以继续讨论。

  3. 由于同一个图可能有许多通过->和+结构的表示,你们有没有想过什么是好的“规范”表示?最简单的表示似乎是析取形式(奇异顶点的连接重叠,如fromEdgeList计算的),但公理似乎可以被视为某些规范性定义的约简规则。例如,可以通过反转分配性和分解律来计算“最大团之和”(但不是最大)表示。一般来说,由于我们不知道如何容易地计算图同构,因此定义一些唯一的规范表示可能是一个很高的要求,而这种表示也可以有效地进行计算/还原。

    1. 紧凑的正则表示是这个代数最有趣的问题之一,至少我花了很多时间来思考这个问题。

      到目前为止,我只得到了类似fromEdgeList的规范形式:很容易将任何表达式重写为顶点和顶点对的(有序)覆盖,就像您提到的那样。

      基于最大团的方法的问题是,一个图可以有一个指数数量的团:O(3^(n/3)),我相信,如果没有其他技巧,这甚至比上面的简单规范形式更紧凑。

      一种很有前途的方法是图的“模块分解”:

      https://en.wikipedia.org/wiki/Modular_decosition网站

      底层的算法并不简单,我还没有时间评估这种表示在实践中的紧凑程度-这可能是一个很好且有趣的项目!

      顺便说一句,我不认为图同构问题是实现紧致正则形式的障碍:我们不需要匹配两个给定图的顶点!换句话说,图1->2与2->3不同,尽管它们是同构的。

  4. 你好,安德烈,很高兴看到你写这篇文章!一点小小的评论,我认为要证明Relation是这个代数的自由模型,实际上需要做更多的工作。从形式上讲,说关系是自由模型意味着对于任何其他模型M来说,从关系到M有一个唯一的同态。为了证明这一点,您必须证明,例如,使用代数建立的每个表达式都可以使用定律简化为某种标准形式,然后证明这些规范形式可以用关系表示。事实上,这是真的,因为每个表达式都可以简化为单个顶点和边的总和,我知道你在一些关于这个主题的论文中已经证明了这一点。

    1. 你好,布伦特,很高兴你找到了这篇博客帖子!🙂 我们在ICFP的简短聊天让我有了回到代数并写下它的冲动。谢谢!

      是的,我同意证明Relation是这个代数的一个自由模型实际上需要一些额外的工作,为了简洁起见,我在这里跳过了这些工作。

  5. 这一页是一个启示!2015年8月,我在孟买印度理工学院(Indian Institute of Technology Bombay)攻读网络信息理论(network information theory)博士学位期间,被介绍了函数式编程,我想在很长一段时间内更深入地探索这个主题。当时,我遇到了埃尔维格的归纳图方法。我将于下周一(2018年3月5日)提交论文,也许在短暂的休息之后,我希望能将我的注意力全部转向函数式编程。

留下回复

您的电子邮件地址将不会被发布。 已标记必填字段*