【问题标题】:What is the algorithm for generating a random Deterministic Finite Automata?生成随机确定性有限自动机的算法是什么?
【发布时间】:2011-07-28 09:26:27
【问题描述】:

DFA 必须具有以下四个属性:

  • DFA 有 N 个节点

  • 每个节点有 2 个传出转换。

  • 每个节点都可以从其他节点访问。

  • 从所有可能性中以完全一致的随机性选择 DFA

这是我目前所拥有的:

  1. 从 N 个节点的集合开始。
  2. 选择一个尚未选择的节点。
  3. 将其输出连接到其他 2 个随机选择的节点
  4. 将一个转换标记为 1,将另一个转换标记为 0。
  5. 转到 2,除非已选择所有节点。
  6. 确定是否存在没有传入连接的节点。
  7. 如果是这样,从具有多个传入连接的节点窃取传入连接。
  8. 转到 6,除非没有没有传入连接的节点

但是,这个算法是不正确的。考虑图中节点 1 有两个连接到节点 2(反之亦然),而节点 3 有两个连接到节点 4(反之亦然)。是这样的:

1 2

3 4

在哪里, 我的意思是双向两个传出连接(所以总共有 4 个连接)。这似乎形成了 2 个派系,这意味着并非每个州都可以从其他州到达。

有人知道如何完成算法吗?或者,有人知道另一种算法吗?我似乎隐约记得可以使用二叉树来构造它,但我不确定。

【问题讨论】:

  • 您确定要从每个节点访问所有节点吗?制作一个所有节点都可以从起始节点到达的节点要简单得多。
  • 是的,我确定我需要从每个节点都可以访问所有节点。
  • 随机构造的确定性有限自动机 (DFA)。 DFA 是确定性的。它是从具有 N 个节点的所有可能的 DFA 中随机选择的,具有完全均匀的分布。
  • 也就是说,它是从所有DFA中随机选择的,具有我在问题中提到的四个属性。
  • 你会说这真的是一个图形问题吗?由于下面有一两个图形解决方案,我只是对数学感到好奇。SE 会是一个更好的地方来询问这些是否没有解决。

标签: algorithm random finite-automata dfa state-machine


【解决方案1】:

在下文中,我将使用graph theory 的基本术语。

你可以:

  1. 从一个有 N 个顶点且没有弧的有向图开始。
  2. 生成 N 个顶点的随机排列以生成随机哈密顿循环,并将其添加到图中。
  3. 为每个顶点添加一条外向弧到随机选择的顶点。

结果将满足所有三个要求。

【讨论】:

  • 是的,我想过,但是如果我加入哈密顿循环真的是随机的吗?我需要从所有可能性中以完全一致的随机性来选择它。
  • 这是一个非常强的要求。如果那是你真正需要的,你应该在你的问题中清楚地说明它。
  • 存在满足要求且没有汉密尔顿路径的DFA。考虑带有边 {ab,ba,bc,cb,aa,cc} 的图。
  • 是的,但它们都有一个有向循环。
  • 对于你给的那个,一种可能性是:(ab,bc,cb,ba)
【解决方案2】:

只要不断增加一组都可以访问的节点。一旦它们都可以到达,请填写空白。

Start with a set of N nodes called A.
Choose a node from A and put it in set B.
While there are nodes left in set A
    Choose a node x from set A
    Choose a node y from set B with less than two outgoing transitions.
    Choose a node z from set B
    Add a transition from y to x.
    Add a transition from x to z
    Move x to set B
For each node n in B
    While n has less than two outgoing transitions
         Choose a node m in B
         Add a transition from n to m
Choose a node to be the start node.
Choose some number of nodes to be accepting nodes.

集合B中的每个节点都可以到达集合B中的每个节点。只要一个节点可以从集合B中的一个节点到达并且该节点可以到达集合B中的一个节点,它就可以被添加到集合中。

【讨论】:

  • @Jeff B:我很确定。我看不出我的不变量不成立的任何原因。
  • 集合B中是否总是存在y?
  • @Jeff:最近添加的节点总是只有一个传出转换,所以是的,总会有一个 y 的候选者。
  • 我想相信这是可行的,但我很怀疑这是否能让您在具有所需属性的 DFA 上实现均匀分布。你能说明为什么这可以保证返回正确的概率分布吗?
  • @templatetypedef:在我开始尝试证明这一点之前,我们需要对什么是独特的 DFA 有一个很好的定义。
【解决方案3】:

我能想到的最简单的方法是(统一)生成一个随机 DFA,其中包含 N 节点和每个节点的两条传出边,忽略其他约束,然后丢弃任何非强连接(即易于使用强连通分量算法进行测试)。生成统一的 DFA 应该很简单,没有可达性约束。在性能方面可能存在问题的一件事是在找到具有可达性属性的 DFA 之前需要跳过多少个 DFA。不过,您应该先尝试此算法,然后看看最终生成可接受的 DFA 需要多长时间。

【讨论】:

    【解决方案4】:

    强连通性是一个困难的约束。让我们生成统一的随机 surjective 转换函数,然后使用例如Tarjan 的线性时间 SCC 算法,直到我们得到一个强连接的算法。这个过程有正确的分布,但不清楚它是否有效;我的研究人员的直觉是强连通性的极限概率小于 1 但大于 0,这意味着预期中只需要 O(1) 次迭代。

    生成满射转换函数本身就是不平凡的。不幸的是,如果没有这个约束,每个状态都不太可能有一个传入的转换。使用this question 的答案中描述的算法对 {(1, a), (1, b), (2, a), (2, b), ..., (N, a) 的均匀随机分区进行采样, (N, b)} 有 N 个部分。随机排列节点并将它们分配给部件。

    例如,令 N = 3 并假设随机分区是

    {{(1, a), (2, a), (3, b)}, {(2, b)}, {(1, b), (3, a)}}.
    

    我们选择一个随机排列 2、3、1 并导出一个转移函数

    (1, a) |-> 2
    (1, b) |-> 1
    (2, a) |-> 2
    (2, b) |-> 3
    (3, a) |-> 1
    (3, b) |-> 2
    

    【讨论】:

    • 请注意,这是假设可区分状态。对于不可区分的状态,使用 Brendan McKay 的 nauty 计算自同构 A 的数量,然后如果它是强连通的,则以 1/A 的概率接受图。请注意,A 几乎总是 1,因此 (a) 仍然有效 (b) 与可区分状态的分布差别不大。
    • 另请注意,尽管 Jeremiah Willcock 的算法是指数时间的,但如今计算机的速度确实很快,在您知道 N 太大之前,您应该避免强制执行满射性。
    • 我指的是无法区分的状态。那么,你说我需要以 1/A 的概率接受什么图表?你上面给出的算法生成的图?
    • 小野最近的发现与分区函数背后的理论的完成能否加快这一进程?他不是想出了一个比较容易确定任意数的分区数的方法吗?
    • @Jeff B. 我对此表示怀疑,因为链接算法确实需要最多 k 个部分的分区数,这会破坏对称性。如果您使用的是 nauty,那么 nauty 无论如何都可能成为瓶颈。如果您放弃 nauty,那么可能会有更好的采样算法(但这可能最好留给单独的问题)。
    【解决方案5】:

    我们可以从 N 到 2N 之间的随机数状态 N1 开始。

    假设初始状态为状态编号 1。 对于每个状态,对于输入字母表中的每个字符,我们都会生成一个随机转换(介于 1 和 N1 之间)。

    我们从初始状态开始采用连接自动机。我们检查状态的数量,经过几次尝试,我们得到一个具有 N 个状态的状态。

    如果我们也希望有一个最小自动机,那么只剩下最终状态的分配,但是随机分配也很有可能得到一个最小自动机。

    【讨论】:

      【解决方案6】:

      以下参考资料似乎与您的问题有关:

      F。 Bassino, J. David 和 C. Nicaud,可能不完全确定性自动机的枚举和随机生成,纯数学和应用 19 (2-3) (2009) 1-16 .

      F。巴西诺和 C.尼考。可访问自动机的枚举和随机生成。 理论。比较。科学。381 (2007) 86-104。

      【讨论】:

        【解决方案7】:

        有一个预计运行时间为 O(n^{3/2}) 的算法。

        如果您生成具有 m 个顶点的均匀随机有向图,使得每个顶点都有 k 个标记的外弧(一个 k-out 有向图),那么该有向图中最大的 SCC(强连通分量)的大小很可能约为c_k m,其中 c_k 是取决于 k 的常数。实际上,这个 SCC 的大小恰好是 c_k m (四舍五入为整数)的概率大约为 1/\sqrt{m}。

        因此,您可以生成大小为 n/c_k 的统一随机 2-out digraph,并检查最大 SCC 的大小。如果它的大小不完全是 n,就再试一次,直到成功。所需的预期试验次数为 \sqrt{n}。并且生成每个有向图应该在 O(n) 时间内完成。因此,该算法总共具有预期的运行时间 O(n^{3/2})。详情请见this paper

        【讨论】:

          猜你喜欢
          • 2011-11-24
          • 2013-04-28
          • 2013-11-29
          • 2018-07-14
          • 1970-01-01
          • 2019-06-23
          • 2018-05-20
          • 2017-04-18
          • 1970-01-01
          相关资源
          最近更新 更多