Java 通过该数据对有限确定性自动机进行建模

Java 通过该数据对有限确定性自动机进行建模,java,dfa,Java,Dfa,我有这个输入文件: 2 3 2 1 ab 1 0 2 0 2 0 2 0 3 abaa aab aba 3 3 2 ade 0 1 2 1 2 0 2 1 0 1 2 2 2 a de 第一行表示测试用例的数量 每个测试用例从3个整数开始,第一个是自动机的状态数,第二个是字母表中的符号数,然后是最终状态数 下一行是字母表。这些符号一起出现 然后有一系列的线,相当于描述转移函数的状态数。这组行的第一行表示自动机(qo)中第一个状态的转换函数,第一个元素表示当字母表中的第一个符号进入该状态时达到的

我有这个输入文件:

2
3 2 1
ab
1 0
2 0
2 0
2
0 3
abaa
aab
aba
3 3 2
ade
0 1 2
1 2 0
2 1 0
1 2
2 2
a
de
第一行表示测试用例的数量

每个测试用例从3个整数开始,第一个是自动机的状态数,第二个是字母表中的符号数,然后是最终状态数

下一行是字母表。这些符号一起出现

然后有一系列的线,相当于描述转移函数的状态数。这组行的第一行表示自动机(qo)中第一个状态的转换函数,第一个元素表示当字母表中的第一个符号进入该状态时达到的状态,依此类推。从最初的问题陈述中我很难理解这一点。这是我看到它的最简单的方式:

台词:

1 0
2 0
2 0
相等:

            AlphabetSymbol0        AlphabetSymbol1
State0         State1                State0
State1         State2                State0
State2         State2                State0
然后有一条线显示了自动机的最终状态

然后是一行,说明哪一个是初始状态以及将出现多少个输入字符串

然后是带有输入字符串的行

该程序的输出应为:

Case #1:
accept 2
reject 0
reject 1
Case #2:
accept 2
reject 0
它应该说明字符串是被接受还是被拒绝,以及它在哪个状态结束

到目前为止,我只使用输入对工作进行了编码

我不知道如何最方便地表示自动机。我应该创建一个Graph类吗?我应该简单地使用数组吗?我将对阵列应用什么逻辑

编辑这是我按照MICHAEL BORGWARDT的建议编写的代码。 转换工作正常,但我不知道为什么处理时字符串会卡在状态0上。 **

/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
包装afd;
导入java.io.*;
导入java.util.*;
/**
*
*@作者管理员
*/
公共班机{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)引发IOException{
//此处的TODO代码应用程序逻辑
FileReader fr=new FileReader(“E://Documents and Settings//Administrator//My Documents//NetBeansProjects//AFD//src//AFD//dfa.in”);
BufferedReader br=新的BufferedReader(fr);
字符串firstLine=br.readLine();
字符串[]firstLineSplitted=firstLine.split(“”);
/*调试*/
System.out.println(“第一行是”+第一行);
int numberOfTestCases=Integer.parseInt(第一行);
for(int indexOfTestCases=0;indexOfTestCases对于(int stringIndex=0;stringIndex我认为最自然的表示是将每个状态建模为一个
Map
,以字母符号作为键和结果状态(即
Map
实例)作为值。表示自动机的类将具有初始状态的引用、当前状态的引用、状态的
集和最终状态的
集。噢,以及字母表的

上面的内容应该会为所有相关操作提供良好的性能。添加一些方便和封装的方法,您就完成了

编辑:

您需要一个
State
类才能正确使用泛型:

public class State extends HashMap<Character, State>{ }

public class Automaton{ 
    private Set<State> allStates;
    private Set<State> finalStates;
    private State initialState;
    private State currentState;
    private Set<Character> alphabet;

    public boolean doTransition(Character input)){
        if(!alphabet.contains(input){ 
            throw new IllegalArgumentException();
        }
        if(finalStates.contains(currentState)){ 
            throw new IllegalStateException(); 
        }

        currentState = currentState.get(input);

        if(currentState == null){ 
            throw new IllegalStateException(); 
        }

        return finalStates.contains(currentState);
    }

    // more methods go here
}
当然,这应该通过自动化类的初始化方法来实现。

这是一个有趣的项目

你可以
public class State extends HashMap<Character, State>{ }

public class Automaton{ 
    private Set<State> allStates;
    private Set<State> finalStates;
    private State initialState;
    private State currentState;
    private Set<Character> alphabet;

    public boolean doTransition(Character input)){
        if(!alphabet.contains(input){ 
            throw new IllegalArgumentException();
        }
        if(finalStates.contains(currentState)){ 
            throw new IllegalStateException(); 
        }

        currentState = currentState.get(input);

        if(currentState == null){ 
            throw new IllegalStateException(); 
        }

        return finalStates.contains(currentState);
    }

    // more methods go here
}
State s0 = new State();
State s1 = new State();
State s2 = new State();
s0.put('a', s1);
s0.put('b', s0);
s1.put('a', s2);
s1.put('b', s0);
s2.put('a', s2);
s2.put('b', s0);
fsm.setStates("ab");
fsm.setInitialState(0);
fsm.addTransition(1,0);
fsm.addTransition(2,0);
fsm.addTransition(2,0);
fsm.setFinalState...
newState=table[oldState][transition];