繁体   English   中英

生成随机确定性有限自动机的算法是什么?

[英]What is the algorithm for generating a random Deterministic Finite Automata?

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

  • DFA有N个节点

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

  • 每个节点都可以从每个其他节点到达。

  • 从所有可能性中选择DFA具有完全均匀的随机性

这是我到目前为止:

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

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

1 <==> 2

3 <==> 4

其中,通过<==>我的意思是两种方式的两个传出连接(所以总共4个连接)。 这似乎形成了两个派系,这意味着并非每个州都可以从其他所有州获得。

有谁知道如何完成算法? 或者,有没有人知道另一种算法? 我似乎模糊地回忆起可以使用二叉树来构造它,但我不确定。

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

生成满射过渡函数本身就是不平凡的。 不幸的是,如果没有这种限制,每个州都有一个进入过渡的指数不可能。 使用此问题的答案中描述的算法来采样{(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

有一个预期的运行时间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图,并检查最大SCC的大小。 如果它的大小不完全是n,那么再试一次直到成功。 预期的试验次数是\\ sqrt {n}。 生成每个有向图应该在O(n)时间内完成。 因此总的来说算法预期运行时间为O(n ^ {3/2})。 有关详细信息,请参阅此文章

在下文中,我将使用图论的基本术语。

你可以:

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

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

以下参考文献似乎与您的问题相关:

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

F. Bassino和C. Nicaud。 可访问自动机的枚举和随机生成。 理论值。 比较。 SC。 381 (2007)86-104。

只需保持一组可以访问的节点。 一旦他们都可以到达,填写空白。

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中的节点,就可以将其添加到集合中。

我能想到的最简单的方法是(统一)生成一个随机DFA,每个节点有N节点和两个传出边,忽略其他约束,然后扔掉任何没有强连接的(这很容易使用一个强连通分量算法)。 在没有可达性约束的情况下,生成统一的DFA应该是直截了当的。 在性能方面可能存在问题的一件事是,在找到具有可达性属性的DFA之前,您需要跳过多少个DFA。 但是,您应该首先尝试此算法,并查看它最终需要多长时间才能生成可接受的DFA。

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

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

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

如果我们也希望最小的自动机,那么只保留最终状态的分配,但是随机分配也很有可能获得最小的自动机。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM