簡體   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