Algorithm DFA—设计一个DFA,它接受{0,1}上最多包含两个00'的所有字符串;s和三个11';s作为子串

Algorithm DFA—设计一个DFA,它接受{0,1}上最多包含两个00'的所有字符串;s和三个11';s作为子串,algorithm,math,finite-automata,automata,dfa,Algorithm,Math,Finite Automata,Automata,Dfa,我正在练习我的DFA,我遇到了这个问题,似乎非常复杂。我试着把它分成两个小问题,我有一个答案,但我觉得不对 有人能帮我吗,或者至少给我一些建议 顺便说一句,他们都是接受国。 我能想到的另一种可能性是,每两个O或1,你只有接受态,因为它们需要成对。例如11接受11接受11接受 好吧,不用画自动机,你可以用文字来描述它 我将如何解决您的问题: 设一个顶点是一个三元组,其中 第一个元素是0、1、2、3和“至少4”,表示11的数量 第二个元素是0、1、2和“至少3”,具体取决于“00”的数量 第三个

我正在练习我的DFA,我遇到了这个问题,似乎非常复杂。我试着把它分成两个小问题,我有一个答案,但我觉得不对

有人能帮我吗,或者至少给我一些建议

顺便说一句,他们都是接受国。


我能想到的另一种可能性是,每两个O或1,你只有接受态,因为它们需要成对。例如11接受11接受11接受

好吧,不用画自动机,你可以用文字来描述它

我将如何解决您的问题: 设一个顶点是一个三元组,其中

  • 第一个元素是0、1、2、3和“至少4”,表示11的数量
  • 第二个元素是0、1、2和“至少3”,具体取决于“00”的数量
  • 第三个元素是最后一个符号(0、1或“字符串为空”)
定义转换、开始状态和结束状态非常容易

因此,有5*4*3=60个状态


您可能会注意到,有些不可实现的状态和一些可能合并为“失败状态”的状态可以显著减小自动机的大小

您将您的状态机描述为一幅巨大的画面,但是你可以用结构化的名称来命名你的州,而不是试图画一个巨大的图表,这样你的问题就容易多了

让您的状态为(n,m,s),其中n是您看到的00的数量,m是您看到的11的数量,s是之前读取的字符(s='','1','0')(其中''表示您没有看到之前的字符,或者您刚刚找到了'00'或'11')

那么您的转换是:

(n, m, '')  -0-> (n, m, '0')
(n, m, '')  -1-> (n, m, '1')
(n, m, '0') -0-> (n+1, m, '')
(n, m, '0') -1-> (n, m, '1')
(n, m, '1') -0-> (n, m, '0')
(n, m, '1') -1-> (n, m+1, '')
所有有n3的州。同样,我们将所有不接受状态合并为一个状态

这有(3*4*2+2)=26个状态,这也是最小值

生成FSM图。 给出形式描述后,可以编写程序生成描述机器的点文件。下面是在答案的第一部分生成机器图表的程序。(请注意,它不会显示哪些状态正在接受,但它们都在接受,但失败除外)

下面是通过
dot-Tpng管道输出的结果:

您能详细介绍一下吗?你说的顶点是三元组到底是什么意思?你的意思是:(x,x,0)?我不确定我是否理解。是的,比如(0,“至少3”,1)意味着它还不是11号,至少有3个“00s”,最后一个符号是1OK,所以在这种情况下(0,至少3,1)对应于0 000 1?所以本质上是两个00和一个1。那么在这种情况下,为什么第一个条件是“如果还没有11,那么第一个元素是0,否则是1”?假设有11个,为什么第一个元素不能也是1呢?我的意思是,这个问题说,最多三个11(即11),我认为这肯定是在正确的步骤。对于第二个元素,我可以说一些“最多30个”吗?你能举几个三顶点的例子吗?非常感谢Paul!这也是我所拥有的(再次假设00是一个00)。出于某种原因,我认为(0,1,1)意味着因为1是最后一个读取字符,所以它也是到1的转换。而不是为转换使用单独的0和1。这让我更清楚了。再次感谢。
S -0-> (0, 0, '0')
S -1-> (0, 0, '1')
(n, m, '0') -0-> (n+1, m, '0')
(n, m, '0') -1-> (n, m, '1')
(n, m, '1') -0-> (n, m, '0')
(n, m, '1') -1-> (n, m+1, '1')
def state(n, m, s):
    if n > 2 or m > 3: return 'FAIL'
    return "n%s_%s_%s" % (n, m, s)

def T(st, c):
    n, m, s = st
    if s == '':
        return (n, m, c)
    if s == '0':
        return (n+1, m, '') if c=='0' else (n, m, c)
    if s == '1':
        return (n, m+1, '') if c=='1' else (n, m, c)

print 'digraph {'
for n in xrange(3):
    for m in xrange(4):
        for s in ['', '0', '1']:
            for c in '01':
                print '    %s -> %s [label="%s"]' % (state(n, m, s), state(*T((n, m, s), c)), c)

print '}'