课设前几题都是比较简单的,不需要怎么动脑。
这里贴一份python代码,需要注意的是默认设定以下几种情况:
1.每个状态转换集只有一个目标,也就是转换矩阵中不允许出现多个字符。
2.状态必须以数字为标号,且按顺序从0开始一直往下
以上情况是为了减少代码工作量而做的设置,但文章末尾会把解决方法给大家。
那么接下来就是激动人心的贴代码时刻拉
def selection1(target):
"这里是选择1的引导函数"
closure=FindClosure(target);
print('%d 的z闭包为:%s \n' % (target, closure));
return ;
def selection2() :
"选择2的引导函数,用i遍历所有状态,并找出相应的z闭包"
for i in raw_df.index :
closure=FindClosure(i)
print('%d 的z闭包为:%s \n' %(i,closure));
return ;
def FindClosure(target):
"关键的寻找闭包函数"
closure=[]; #用于存放寻找到的状态集
closure.append(target); #z闭包包括自身和经过任意条z弧能到达的状态
while (pd.isnull(raw_df.loc[target,'z'])==False) :
#当target 经过z弧之后有后继结点(即target有向外的z弧),则进行循环
target=raw_df.loc[target, 'z'];#把经过z弧之后的后继节点当作新的target,继续向下寻找
closure.append(target);#把这个新节点加入到z闭包中
return closure;
#主函数
if __name__ == '__main__':
print('Hello,world!');
import pandas as pd;
raw_df=pd.read_excel('datafile.xlsx');#导入表格数据
print(raw_df);#打印
sign=input('请选择要执行的功能,输入编号后按回车,1.寻找目标字符的z闭包。\n2.自动寻找所有字符的z闭包\n');
if sign == '1':#选择功能
target=int(input('请输入要找的目标字符:\n'));#注意接受的是个字符,需要转换成int
selection1(target);
if sign == '2':
selection2();
这里给出开头两种情况的解决方案:
1.若转换矩阵包含多个字符,则需要在获取该格数据之后用split等函数进行分割,之后将这些分割好的字符全部加入到一个容器里面,可以用列表,字典等。然后依次从容器中取出一个字符进行闭包运算。直到容器为空,代表计算完毕,则停止。
2.用pandas的set_index()函数,设置新的索引值,新的索引值可以是各个状态,这样就可以实现abcd等索引方式,之后在代码内部修改loc相关函数即可
这个是数据表格,用Exel软件建立即可
输入输出结果:
状态 z a b
0 0 4.0 NaN NaN
1 1 NaN 3.0 NaN
2 2 5.0 NaN NaN
3 3 NaN 2.0 NaN
4 4 1.0 4.0 4.0
5 5 6.0 5.0 5.0
6 6 NaN NaN NaN
请选择要执行的功能,输入编号后按回车,1.寻找目标字符的z闭包。
2.自动寻找所有字符的z闭包
2
0 的z闭包为:[0, 4.0, 1.0]
1 的z闭包为:[1]
2 的z闭包为:[2, 5.0, 6.0]
3 的z闭包为:[3]
4 的z闭包为:[4, 1.0]
5 的z闭包为:[5, 6.0]
6 的z闭包为:[6]
Process finished with exit code 0
最后,可以做的更加精细,以下是加分项:
1.闭包可视化——结果自动生成图像并保存
2.根据状态矩阵自动生成nfa图像——也是可视化