不确定有穷自动机NFA的确定化

这篇具有很好参考价值的文章主要介绍了不确定有穷自动机NFA的确定化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从文件读入一个非确定有穷状态自动机(NFA),用子集法将其确定化,并输出一个确定化的有穷状态自动机(DFA)。

原理:
不确定有穷自动机的确定化,编译原理,python,开发语言
不确定有穷自动机的确定化,编译原理,python,开发语言

流程图如下:
不确定有穷自动机的确定化,编译原理,python,开发语言
具体代码实现:
这里为了实现图形可视化,使用了graphviz,下载完成Graphviz工具后,需将其添加至系统环境变量中,且需将其上移至Matlab在系统环境变量中的路径之上。这样在Python中导入Graphviz工具包后,画图工具才能起作用,具体配置方法请自行百度…

from graphviz import Digraph


# 空用“*”表示,规定第一个节点的空闭包为初态集合
# nodes:其中每个元素称为一个状态
# path:其中每个元素称为一个输入符号
# edges:是单值转换函数,表示一个状态node1,在输入字符path后,转到另一个状态node2
# start:初态集
# end:终态集


def Read_NFA_Data():
    # 读入NFA数据
    # 第一行为nodes(用“,”隔开),第二行为path(用“,”隔开)
    # 第三行为edges(每个元素用“;”隔开,每个元素的数据用“,”隔开)
    # 第四行为start(用“,”隔开),第五行为终态集(用“,”隔开)
    with open('NFA.txt', 'r') as r:
        lines = [line.rstrip('\n') for line in r.readlines()]
    nodes = lines[0].split(',')
    path = lines[1].split(',')
    edges = lines[2].split(';')
    edges = [x.split(',') for x in edges]
    start = lines[3].split(',')
    end = lines[4].split(',')
    return nodes, path, edges, start, end


def NFA_Show(nodes, edges, start, end):
    # 生成NFA图
    NFA = Digraph('NFA', format='png')
    for node in nodes:
        if node in start:
            NFA.node(node, shape='circle', color='red')
        elif node in end:
            NFA.node(node, shape='doublecircle')
        else:
            NFA.node(node, shape='circle')
    for edge in edges:
        NFA.edge(edge[0], edge[1], label=edge[2])
    NFA.attr(rankdir='LR')
    NFA.view()


def DFA_Show(D_nodes, D_edges, start, end):
    # 生成DFA图
    DFA = Digraph('DFA', format='png')
    for n in D_nodes:
        list_node = n.split(',')
        if len(list(set(list_node) & set(end))) != 0 and list_node == start:
            DFA.node(n, shape='doublecircle', color='red')  # 该状态既是初态又是终结态
        elif len(list(set(list_node) & set(end))) != 0:
            DFA.node(n, shape='doublecircle')   # 该状态是终结态
        elif list_node == start:
            DFA.node(n, shape='circle', color='red')   # 该状态是初态
        else:
            DFA.node(n, shape='circle')  # 该状态既不是初态也不是终结态
    for e in D_edges:
        DFA.edge(e[0], e[1], label=e[2])
    DFA.attr(rankdir='LR')
    DFA.view()


def move(my_nodes, my_path, my_edges):
    # 定义单值转换函数
    My_Node = []
    for node in my_nodes:
        for edge in my_edges:
            if edge[0] == node and edge[2] == my_path:
                My_Node.append(edge[1])
    return My_Node


def closure(my_nodes, my_edges, My_Node=None):
    # 定义求闭包的函数
    if My_Node is None:
        My_Node = my_nodes[::]
    Temp = move(my_nodes, '*', my_edges)
    todo = [x for x in Temp if x not in My_Node]
    My_Node.extend(todo)
    for each in todo:
        closure(each, my_edges, My_Node)
    My_Node = list(set(My_Node))
    return My_Node


def is_in(Nodes, Temp):
    # 判断Temp是否在Nodes中
    for Node in Nodes:
        if set(Node) == set(Temp):
            return True
    return False


def From_NFA_to_DFA(path, edges, start):
    # 初始化DFA的状态和路径转换
    D_nodes = []
    D_edges = []

    # 用子集法将NFA确定化为DFA
    Start_node = start[::]
    Start_Node = closure(Start_node, edges)
    Nodes = [Start_Node]
    location = 0
    length = len(Nodes)
    while location < length:
        for p in path:
            Temp_one = move(Nodes[location], p, edges)
            Temp_two = closure(Temp_one, edges)
            if Temp_two:
                Last = ','.join(Nodes[location])
                Next = ','.join(Temp_two)
                D_edge = (Last, Next, p)
                D_edges.append(D_edge)
                D_nodes.append(Last)
            if Temp_two != [] and is_in(Nodes, Temp_two) is False:
                Nodes.append(Temp_two)
            length = len(Nodes)
        location += 1
    return D_nodes, D_edges, Start_Node


if __name__ == '__main__':
    N_nodes, N_path, N_edges, N_start, N_end = Read_NFA_Data()   # 读入NFA数据
    NFA_Show(N_nodes, N_edges, N_start, N_end)   # 绘制NFA
    D_Nodes, D_Edges, Start = From_NFA_to_DFA(N_path, N_edges, N_start)   # NFA转换为DFA
    DFA_Show(D_Nodes, D_Edges, Start, N_end)   # 绘制DFA

读入文件内容:
X,0,1,2,3,Y
0,1
X,0,;0,0,0;0,1,;1,1,0;1,2,1;2,1,0;1,3,;3,3,0;3,Y,
X
Y
代码运行结果:
NFA:
不确定有穷自动机的确定化,编译原理,python,开发语言
DFA:
不确定有穷自动机的确定化,编译原理,python,开发语言文章来源地址https://www.toymoban.com/news/detail-726430.html

到了这里,关于不确定有穷自动机NFA的确定化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「学习笔记」AC 自动机

    点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前置:「学习笔记」字符串基础:Hash,KMP与Trie。 好像对例题的讲解越来越抽象了? 求 (n) 个单词在一个长度为 (m) 的文章里出现

    2024年02月02日
    浏览(43)
  • 数模笔记14-元胞自动机

    元胞自动机理论 元胞自动机(Cellular Automata,CA)是一种时空离散的局部动力学模型,是研究复杂系统的一种典型方法,特别适合用于空间复杂系统的时空动态模拟研究。 元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的 规则 构成。凡是满足这些

    2024年02月09日
    浏览(40)
  • 元胞自动机(数学建模)

    一.元胞自动机的概念       元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。     元胞自动机是用一系列模型构造的 规则 构成,只要满足规则就可以算作是元胞

    2024年02月08日
    浏览(39)
  • 【数学建模】元胞自动机

    元胞自动机(Cellular Automaton,简称CA) 元胞自动机(Cellular Automaton,简称CA)是一种离散空间和时间的计算模型。它由许多简单的计算单元(称为元胞)组成,每个元胞可以处于有限的状态之一。元胞自动机通过在空间上进行迭代更新的方式,根据元胞自身的状态和邻居元胞

    2024年02月15日
    浏览(35)
  • 数学建模-元胞自动机

    2024年02月14日
    浏览(45)
  • 【NLP】有限自动机的KMP算法

    目录 一、说明 二、无策略直接匹配法 2.1  简单粗暴的无脑匹配: 2.2 跳过外循环的思路

    2024年02月08日
    浏览(40)
  • 100行python代码实现细胞自动机(康威生命游戏)

     英国数学家约翰·何顿·康威在1970年发明了细胞自动机,它属于一种仿真程序,通过设定一些基本的规则来模拟和显示的图像的自我进化,看起来颇似生命的出生和繁衍过程,故称为“生命游戏”。 完成效果 用到的第三方库 pygame 基本规则 康威生命游戏在网格上进行,有填

    2023年04月08日
    浏览(40)
  • 元胞自动机( Cellular Automata)研究 (Python代码实现)

     👨‍🎓 个人主页: 研学社的博客   💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🌈

    2024年02月09日
    浏览(40)
  • 正规文法、正规表达式、有限自动机及其之间的转换(笔记)

    The Equivalent Transforming among RG, RE and FA A Grammar G is a quadruple (四元组):G = (V N , V T , S, P ) Where, V N is a finite set of nonterminals. V T is a finite set of terminals. S is the start symbol, S ∈ in ∈ V N . P is a finite set of productions (产生式). Regular Grammar (RG) (正规文法): α∈V N and β ∈V T ∪V T V N Regular Exp

    2024年02月08日
    浏览(40)
  • 【数学建模】元胞自动机(CA)详解 + Matlab代码实现

    元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。 元胞自动机的构建没有固定的数学公式,构成方式繁杂,变种很多,行为复杂。故其分类难度也较大,自元胞自

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包