6、增量式半自动方法:从二元关系到最优继承图

增量式半自动方法:从二元关系到最优继承图

在数据处理和图论领域,将二元关系转化为有效的继承图是一个重要的问题。本文将介绍一种增量式半自动方法,它能够逐步将二元关系转化为无环的继承图,并通过一系列优化步骤得到最优继承图。

1. 构建最优继承图的步骤

构建最优继承图主要分为以下三个步骤:
1. 生成初始继承图 :利用偏序关系,将二元关系逐步转化为一个无环的初始继承图(Brute Inheritance Graph,BIG)。
2. 简化初始继承图 :通过移除冗余的实体或属性,对初始继承图进行简化。
3. 验证和优化 :系统使用一些推理规则对简化后的图进行分析,并将其展示给设计者进行验证。设计者的反馈可以帮助我们得到一个最优继承图,避免出现名称冲突、冗余继承等问题。

2. 数学基础

在深入探讨构建方法之前,我们需要了解一些相关的数学基础。

2.1 二元关系

设集合 $E$ 上的二元关系 $R$ 是笛卡尔积 $E \times E$ 的一个子集。我们用 $eRe’$ 表示集合 $E$ 中的元素 $e$(输入)通过关系 $R$ 与元素 $e’$(输出)相连。在集合 $E$ 上的关系中,有恒等关系 $I$ 和空关系 $\varnothing$。如果 $S$ 是 $E$ 的子集,那么 $I(S) = {(e,e) | e \in S}$ 表示 $S$ 在恒等关系 $I$ 下的像集。

对于给定的二元关系 $R$,我们可以定义以下子集:
- 元素 $e$ 的像集 :$e.R = {e’ \in E | e R e’}$
- 元素 $e’$ 的前件集 :$R.e’ = {e \in E | e R e’}$
- 关系 $R$ 的定义域 :$Dom(R) = {e | \exists e’ \in E : e R e’}$
- 关系 $R$ 的值域 :$Range(R) = {e’ | \exists e \in E : e R e’}$

2.2 矩形

设 $R$ 是定义在集合 $E$ 和 $F$ 上的二元关系。$R$ 的一个矩形是一对集合 $(A,B)$,使得 $A \times B \subseteq R$。其中,$A$ 是矩形的定义域,$B$ 是矩形的值域。

需要注意的是,矩形 $(A_i,B_i)$ 与相关的矩形关系 $A_i \times B_i$ 之间的对应关系是双射的,除非 $A_i = \varnothing$ 或 $B_i = \varnothing$。例如,矩形 $(\varnothing, B_1)$ 和 $(A_1, \varnothing)$ 都与空矩形关系 $\varnothing$ 相关联。区分矩形和矩形关系的主要原因是,矩形的概念使我们能够获得格结构。

2.3 最大矩形

设 $(A,B)$ 是定义在集合 $S$ 上的给定关系 $R$ 的一个矩形。如果对于任意满足 $A \times B \subseteq A’ \times B’ \subseteq R$ 的矩形 $(A’,B’)$,都有 $A = A’$ 且 $B = B’$,则称矩形 $(A,B)$ 是最大矩形。

最大矩形的概念并不新鲜,它在不同的文献中有不同的名称,如“完全对”(Complete couple)或“概念”(Concept)。

2.4 增益

从概念经济的角度来看,给定矩形 $R_E = (A,B)$(或相关的矩形关系 $A \times B$)所获得的增益可以通过以下函数计算:
$g(R_E) = (||A|| * ||B||) - (||A|| + ||B||)$
其中,$||A||$ 表示集合 $A$ 的基数,$||B||$ 表示集合 $B$ 的基数。

矩形的主要优点是它们减少了概念的数量,这是一个重要的贡献。随着实体或属性数量的增加,这种方法在最大化概念经济方面表现得更好。

2.5 最优矩形

如果一个矩形 $R_E = (A,B)$ 包含二元关系 $R$ 中的一个元素 $(a, b)$,并且在所有包含 $(a, b)$ 的最大矩形中实现了最大增益 $g(R_E)$,则称该矩形为最优矩形。

例如,图 3.2-a 表示一个关系 $R$,图 3.2-b、3.2-c 和 3.2-d 表示包含对 $(y,3)$ 的三个最大矩形。这三个最大矩形在内存空间方面获得的增益分别为 1、0 和 -1。因此,包含关系 $R$ 中对 $(y,3)$ 的最优矩形是图 3.2-b 所示的矩形,因为它实现了最大增益。

2.6 两个矩形的下确界

设 $(A,B)$、$(A’,B’)$ 和 $(A’‘,B’‘)$ 是给定关系 $R$ 的三个矩形。如果 $A \subseteq A’ \cap A’‘$ 且 $B \subseteq B’ \cup B’‘$,则称矩形 $(A,B)$ 是 $(A’,B’)$ 和 $(A’‘,B’‘)$ 的下确界。

例如,图 3.3 表示矩形 $R_1 = ({a, b},{1, 2})$,它是 $R_2 = ({a, b, c},{1})$ 和 $R_3 = ({a, b, d},{2})$ 的下确界矩形。

2.7 最小覆盖

设 $R$ 是一个二元关系。$R$ 的一个覆盖是一组矩形 $C = {R_{E1}, R_{E2}, \cdots, R_{En}}$,使得对于 $R$ 中的每个元素 $(x,y)$,都存在 $C$ 中的一个矩形 $R_{Ei}$ 包含 $(x, y)$。$R$ 的最小覆盖是 $C$ 中覆盖 $R$ 的最小子集。

2.8 偏序关系

命题 1:在二元关系 $R$ 的最优矩形集合上定义的以下关系是一个偏序关系:对于任意两个最优矩形 $(A_1, B_1)$ 和 $(A_2, B_2)$,$(A_1, B_1) \leq (A_2, B_2)$ 当且仅当 $A_1 \subseteq A_2$ 且 $B_2 \subseteq B_1$。

2.9 最优矩形图

设 $R$ 是定义在集合 $E$ 和 $F$ 上的二元关系。设 $G$ 是一组覆盖 $R$ 的最优矩形。$(G, \leq)$ 构成一个图,该图有一个上确界 $(E,\varnothing)$ 和一个下确界 $(\varnothing,F)$。

2.10 伽罗瓦格

对于定义在有限集合 $E$ 和 $F$ 上的二元关系 $R$,存在一个唯一的伽罗瓦格与之对应。格中的每个元素必须是如 2.3 节所定义的最大矩形,记为 $(X,Y)$,其中 $X \in P(E)$,$Y \in P(F)$。

设 $f$ 和 $g$ 定义如下:
$f = { (X,Y) / \forall x \in X, \forall y \in Y (x , y) \in R}$
$g = f^{-1} = { (Y ,X) / (X,Y) \in f }$

函数对 $(f, g)$ 被称为 $P(E)$ 和 $P(F)$ 之间的伽罗瓦连接,二元关系的伽罗瓦格 $(GL, \leq)$ 是所有最大矩形的集合,带有偏序关系。偏序用于生成伽罗瓦格的图,称为哈斯图(Hasse Diagram)。伽罗瓦格有一个上确界 $(E,\varnothing)$ 和一个下确界 $(\varnothing,F)$。

3. 二元关系的增量式矩形分解

接下来,我们将介绍如何将上述数学概念应用于二元关系的处理,以生成初始继承图。

3.1 增量式矩形分解的原理

对于一个有限的二元关系 $R$,增量式矩形分解是指选择一组最优矩形,这些矩形构成 $R$ 的最小覆盖。二元关系 $R$ 从集合 $E$ 到集合 $F$ 定义了一个二分图 $(E \cup F, R)$ 的边。因此,一个矩形是该二分图的一个完全二分子图。

选择包含二元关系 $R$ 中元素 $(a, b)$ 的最优矩形的问题,可以看作是选择一组最大矩形的子集。这个问题类似于在二分图中选择一个具有最大基数的完全二分子图。

虽然一些文献中提出的算法可以精确解决格构建问题,但它们是组合性的,当有限二元关系的基数较大(超过 16 对)时,这些算法并不适用。因此,我们采用最优矩形的概念来优化节点数量,同时不丢失信息。

3.2 增量式生成最优继承图

增量式生成最优继承图主要包括以下几个方面:
1. 生成初始继承图(BIG) :通过连续调用 INC - RDBR 算法,以增量方式生成与二元关系对应的继承图。
2. 简化初始继承图 :对生成的初始继承图进行简化,移除冗余信息。
3. 与设计者交互 :系统与设计者进行交互,根据设计者的反馈进一步优化图,定义出合适的继承图或最优继承图。

为了说明算法,我们将以一个具体的例子来展示如何生成类层次结构。

设 $E$ 是现实世界中的实体集合,$F$ 是与实体 $E$ 对应的属性集合,$R$ 是从 $E$ 到 $F$ 的二元关系。设 $f$ 是一个函数,$G$ 是与 $R$ 对应的图。设 $x^ $ 是要添加到图 $G$ 中的元素,$R^ $、$E^ $、$F^ $、$G^ $ 分别是添加 $x^ $ 后 $R$、$E$、$F$、$G$ 的版本。

图 $G^ $ 中的节点可以分为以下四种类型:
1.
新节点 :节点的 $X’$ 不在图 $G$ 中,且不能从其父节点推断出来。
2.
旧节点 :节点的 $X$ 和 $X’$ 都没有被修改。
3.
修改节点 :节点的 $X’$ 在图 $G$ 中,但在 $G^ $ 中 $X$ 被修改。
4. 删除节点 :节点 $(X, X’)$ 可以从其父节点推导出来。

修改节点的集合 $X$ 总是等于 $Y \cup {x^ }$,其中 $(Y, Y’)$ 在图 $G$ 中且 $X’ = Y’$。满足 $Y’ \subseteq f(x^ )$ 的节点 $(Y, Y’)$ 在 $G^*$ 中会产生一个修改节点。

创建新节点比修改节点更复杂。图 $G^ $ 中的每个新集合 $X’$ 是 $f(x^ )$ 与图 $G$ 中集合的交集,并遵循非下确界矩形的概念。这要求图 $G^ $ 中的节点 $(X, X’)$ 对应一个最优矩形,即该节点不能从其父节点推导出来。此外,如果 $f(x^ )$ 不包含在 $F$ 中,则将节点 $(x^ , f(x^ ))$ 添加到图 $G^*$ 中。

以下是 INC - RDBR 算法的详细步骤:

Algorithm INC - RDBR (G, (x*, f(x*)), R, G*, R*)
Begin
    /* R is defined on E  F */
    1. E* := E ∪ {x*};
    /* State Initialization of graph’s nodes */
    2. For All node N of G do
        3. N.Flag := False;
        4. Next node;
    5. End For;
    6. If (f(x*) ⊄ F) Then
        /* Add a new node with N’ as is its name, {x*} its domain, f(x*) its range, its flag is equal true. This insertion is done at the level which has cardinality equal ||f(x*)|| */
        7. Add_node (||f(x*)||, N’, {x*}, f(x*), true);
        8. F* := F ∪ f(x*);
    9. End If;
    10. For all Level_N of graph G do
        11. For all node N of Level_N do
            12. If (N.Flag = False) then
                13. If f(x*) = N.Range Then /* Modified node */
                    14. N.domain = N.domain ∪ {x*};
                    15. N.Flag := true;
                    /* This modification is propaged on list of fathers of node N of the level Level_N */
                    16. Propagation_modification (Level_N, list_father(N));
                    16. Exit;
                17. Else /* Int is the variable contained the intersection between f(x*) and N.range */
                    18. Int := f(x*) ∩ N.range;
                    19. If Int = f(x*) Then Exit End If;
                    20. If (Int = N.range) Then /*modified node*/
                        21. N.domain := N.domain ∪ {x*};
                        22. N.flag := true; /* This modification is propagated on list of fathers (parents) of node N of the level Level_N */
                        23. Propagation_modification( Level_N, list_father(N));
                    24. Else
                        /* level_Int is the level correspond to ||Int|| */
                        25. If (Int ⊄ [∪((list_father(N)).range)] or (level_Int > HL and (N.domain ∪ {x*}) = E*) Then /* Add a new node with N’ is its name, its domain is N.domain ∪ {x*}, its range is Int, flag is equal true at level which has ||Int|| as cardinality */
                            26. Add_node (||Int||, N’, N.domain ∪ {x*}, Int, true);
                            27. Update_list_father(N’, N); /* add N’ to list of fathers of N at queue */
                            28. Update_list_children(N, N’); /* add N to list of children of N’ at queue */
                            /* simplification of infimum rectangles in the graph G */
                            infimum_rectangle_Simplification();
                        29. End If
                    30. End If
                31. End If
            32. End If
            33. Next Node;
        34. End For
        35. Next level;
    36. End For
    37. HL := High_Level(G); /* this procedure returns the high level of G */
    38. End

以下是相关的辅助过程:

Procedure infimum_rectangle_Simplification()
Begin
    For all level_N of graph G do
        For all node N of level_N Do
            If (N.range ⊆ [∪([list_father(N)].range)] or (N.domain ≠ E and level_N = Hight_level) Then
                Delete N;
                /* To reorganize links between fathers of N and its children */
                For all node N’ of list_father(N) do
                    For all node N’’ of list_children(N) do
                        Delete N from N’’.list_father(N’’);
                        Delete N from N’.list_father(N’);
                        If (N’’.list_father(N’’) = NULL) then
                            Link (N’, N’’); /* add an edge between N’ and N’’ in the graph */
                            Update_list_father(N’, N’’); /* add N’ to list_father of N’’ at queue */
                            Update_list_children(N’’, N’); /* add N’’ to list_children of N’ at queue */
                        End If;
                    End For
                End For
            End If
            Next node;
        End For
        Next level;
    End For
End.

Procedure propagation_modification(first_level, list_father(N))
Begin
    /*first_level: The level from where the propagation is done on the nodes of father of N*/
    For each father N’ of N do
        If N’.flag = false then
            For level_N’ := (first_level + 1) to Hight_level do
                N.domain := N.domain ∪ {x*};
                N.flag = true;
                /* This modification is propaged on list of father of N’ */
                Propagation_modification(level_N’, N’);
            End For;
        End If;
        Next father node of N;
    End for;
End;

INC - RDBR 算法的输入是图 $G$、关系 $R$ 和要处理的 $R$ 中的一行。输出是图 $G^ $ 和关系 $R^ $。我们从给定的关系和空图开始,沿着二元关系的行逐步处理,相应地修改 $R$ 和 $G$。

下面是一个具体的例子,展示了如何使用该算法生成继承图。

假设我们有一个二元关系,用以下矩阵表示:
| | Credits ($b_1$) | Salary ($b_2$) | Vacations ($b_3$) | Type_of_Training ($b_4$) | Penalty ($b_5$) | Type_of_Viol ($b_6$) |
| — | — | — | — | — | — | — |
| Staff ($a_1$) | 1 | 0 | 1 | 0 | 0 | 0 |
| Student ($a_2$) | 1 | 1 | 0 | 0 | 0 | 0 |
| Vacations_Student ($a_3$) | 1 | 1 | 1 | 1 | 0 | 0 |
| Training_Staff ($a_4$) | 1 | 1 | 1 | 0 | 1 | 0 |
| Bad_Staff ($a_5$) | 1 | 0 | 1 | 0 | 0 | 1 |
| Bad_Student ($a_6$) | 1 | 1 | 0 | 0 | 0 | 1 |

初始时,$R = G = \varnothing$。处理第一行 $L_1 = {{a_1},{b_1,b_3}}$ 时,$f(x^*) = {b_1,b_3}$,由于它不是空集 $F$ 的子集,执行语句 7,创建一个新节点 $N’ = ({a_1},{b_1,b_3})$,并更新 $F$。

处理后续行时,算法会根据节点的类型(新节点、旧节点、修改节点、删除节点)进行相应的操作,逐步生成继承图。例如,处理第二行 $L_2 = {{a_2}, {b_1, b_2}}$ 时,由于 $f(x^ )$ 不是 $F$ 的子集,创建一个新节点 $N’ = ({a_2}, {b_1, b_2})$。然后遍历图中上级为 1 的节点,找到节点 $({a_1},{b_1,b_3})$,计算 $f(x^ )$ 与该节点范围的交集为 ${b_1}$,满足条件后创建一个新节点 $({a_1,a_2},{b_1})$。

通过不断处理每一行,最终可以得到一个完整的初始继承图。然后对这个图进行简化和优化,结合设计者的反馈,得到最优继承图。

这种增量式半自动方法在处理二元关系和构建继承图方面具有很大的优势,它能够有效地处理大规模数据,避免了传统方法在处理大数据时的局限性,同时通过与设计者的交互,能够更好地满足实际需求。

增量式半自动方法:从二元关系到最优继承图

4. 算法处理示例详解

为了更清晰地展示 INC - RDBR 算法的工作过程,我们继续对前面的二元关系矩阵进行详细处理。

4.1 处理第三行 $L_3 = { {a_3}, {b_1, b_2, b_3, b_4 } }$
  • 添加新节点 :首先检查 $f(x^*) = {b_1, b_2, b_3, b_4 }$ 是否包含在 $F$ 中,由于此时不满足包含关系,所以添加一个新节点 $N’ = ( {a_3}, {b_1, b_2, b_3, b_4 } )$,并更新 $F$。
  • 遍历节点并处理 :从图中上级为 2 的节点开始遍历。
    • 遇到节点 $({a_2},{b_1,b_2})$,计算 $f(x^*)$ 与该节点范围的交集 $Int = {b_1,b_2}$,满足修改节点的条件,将该节点修改为 $({a_2,a_3},{b_1,b_2})$,标记该节点,并调用 Propagation_modification 过程对其父节点进行修改。
    • 遇到节点 $({a_1},{b_1,b_3})$,计算交集为 ${b_1,b_3}$,等于该节点的范围,同样将其修改为 $({a_1,a_3},{b_1,b_3})$,并对其父节点进行相应处理。

处理完第三行后,得到的图如下:

a1 a2 a3 b1
a1 a3
b1 b3
a2 a3
b1 b2
a3 b1 b2 b3 b4
4.2 处理第四行 $L_4 = { {a_4}, {b_1, b_2, b_3, b_5 } }$
  • 添加新节点 :添加新节点 $N’ = ( {a_4}, {b_1, b_2, b_3, b_5 } )$。
  • 遍历节点并处理
    • 计算 $f(x^*)$ 与某些节点范围的交集,如与节点 $({a_1,a_3},{b_1,b_3})$ 和 $({a_2,a_3},{b_1,b_2})$ 的交集为 ${b_1,b_2,b_3}$,该值可以从父节点推导出来,所以不做处理。
    • 遇到节点 $({a_2,a_3},{b_1,b_2})$,交集等于其范围,将该节点修改为 $({a_2,a_3,a_4},{b_1,b_2})$,并对其父节点进行修改。
    • 遇到节点 $({a_1,a_3},{b_1,b_3})$,同样进行修改操作。

处理完第四行后,得到的图如下:

a1 a2 a3 a4
b1
a1 a3 a4
b1 b3
a2 a3 a4
b1 b2
a3 b1 b2 b3 b4
a4 b1 b2 b3 b5
4.3 处理第五行 $L_5 = { {a_5}, {b_1, b_3, b_7 } }$

按照同样的步骤,添加新节点 $N’ = ( {a_5}, {b_1, b_3, b_7 } )$,并对图中的节点进行遍历和处理,最终得到的图如下:

a1 a2 a3 a4 a5
b1
a1 a3 a 4 a5
b1 b3
a2 a3 a4
b1 b2
a3 b1 b2 b3 b4
a5 b1 b3 b7
a4 b1 b2 b3 b5
4.4 处理第六行 $L_6 = { {a_6}, {b_1, b_2, b_6, b_7 } }$

完成最后一行的处理后,得到完整的初始继承图,即 Brute 继承图:

a1 a2 a3 a4 a5 a6
b1
a1 a3 a 4 a5 a6
b1 b3
a2 a3 a4 a6
b1 b2
a3 b1 b2 b3 b4
a5 b1 b3 b7
a4 b1 b2 b3 b5
a6 b1 b2 b6 b7
5. 简化初始继承图

在得到 Brute 继承图后,需要对其进行简化,移除冗余的实体或属性,避免出现名称冲突、冗余继承等问题。简化过程主要通过 infimum_rectangle_Simplification 过程实现,具体步骤如下:
1. 遍历图中的每个节点 :对于图中每个层级的每个节点,检查其范围是否包含在其父节点范围的并集中,或者该节点的定义域不等于全集且处于最高层级。
2. 删除冗余节点 :如果满足上述条件,则删除该节点,并重新组织其父节点和子节点之间的链接。
- 对于删除节点的每个父节点和子节点,从它们的父节点列表和子节点列表中删除该节点。
- 如果某个子节点的父节点列表为空,则在其父节点和该子节点之间添加一条边,并更新相应的父节点列表和子节点列表。

6. 与设计者交互并优化

简化后的图需要展示给设计者进行验证。设计者可以根据实际需求对图进行反馈,系统根据设计者的反馈进一步优化图,得到最优继承图。具体交互流程如下:
1. 系统展示图 :将简化后的 Brute 继承图展示给设计者。
2. 设计者反馈 :设计者检查图中是否存在名称冲突、冗余继承等问题,并提出修改建议。
3. 系统优化图 :系统根据设计者的反馈,对图进行相应的修改,如添加、删除或修改节点,调整节点之间的关系等。
4. 重复验证和优化 :重复上述步骤,直到设计者认为图满足实际需求,得到最终的最优继承图。

7. 总结

这种增量式半自动方法在处理二元关系和构建继承图方面具有显著的优势:
- 处理大规模数据 :通过增量式的方式,避免了传统组合算法在处理大规模数据时的局限性,能够更高效地处理基数较大的二元关系。
- 优化节点数量 :采用最优矩形的概念,在不丢失信息的前提下,优化了图中的节点数量,提高了系统的性能。
- 满足实际需求 :通过与设计者的交互,能够根据实际情况对图进行调整和优化,更好地满足实际应用的需求。

在实际应用中,可以根据具体的场景和需求,灵活运用该方法,构建出高效、准确的继承图,为数据处理和分析提供有力的支持。

以下是整个过程的 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(定义二元关系 R):::process
    B --> C(初始化图 G 和关系 R 为空):::process
    C --> D(选择二元关系 R 的一行进行处理):::process
    D --> E{是否还有未处理的行?}:::decision
    E -- 是 --> F(执行 INC - RDBR 算法):::process
    F --> G(更新图 G 和关系 R):::process
    G --> D
    E -- 否 --> H(生成 Brute 继承图):::process
    H --> I(执行 infimum_rectangle_Simplification 过程):::process
    I --> J(简化 Brute 继承图):::process
    J --> K(展示简化后的图给设计者):::process
    K --> L{设计者是否满意?}:::decision
    L -- 否 --> M(根据设计者反馈修改图):::process
    M --> K
    L -- 是 --> N([得到最优继承图]):::startend

通过这个流程图,可以清晰地看到整个增量式半自动方法的处理流程,从二元关系的定义到最终最优继承图的生成,每个步骤都紧密相连,相互配合,确保了系统的高效运行和结果的准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值