NDFA to DFA conversion WORKING, including with epsilon

This commit is contained in:
Yorick Rommers
2017-05-24 14:08:36 +02:00
parent adf6391c84
commit 80019b2ea7
2 changed files with 181 additions and 44 deletions
+98 -11
View File
@@ -118,25 +118,112 @@ public class Main {
Character [] characters = {'a', 'b'};
NDFA<String> myAutomata = new NDFA<String>(characters);
myAutomata.addTransition(new Transition<String>("0", 'a', "1"));
myAutomata.addTransition(new Transition<String>("0", 'a', "2"));
myAutomata.addTransition(new Transition<String>("1", 'a', "1"));
myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
myAutomata.addTransition(new Transition<String>("2", 'b', "1"));
myAutomata.addTransition(new Transition<String>("2", 'b', "3"));
myAutomata.addTransition(new Transition<String>("3", 'a', "2"));
myAutomata.addTransition(new Transition<String>("3", 'a', "1"));
// myAutomata.addTransition(new Transition<String>("0", 'a', "1"));
// myAutomata.addTransition(new Transition<String>("0", 'a', "2"));
// myAutomata.addTransition(new Transition<String>("1", 'a', "1"));
// myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
// myAutomata.addTransition(new Transition<String>("2", 'b', "1"));
// myAutomata.addTransition(new Transition<String>("2", 'b', "3"));
// myAutomata.addTransition(new Transition<String>("3", 'a', "2"));
// myAutomata.addTransition(new Transition<String>("3", 'a', "1"));
// myAutomata.defineAsStartState("0");
// myAutomata.defineAsEndState("0");
// myAutomata.defineAsEndState("1");
// Test 2
// myAutomata.addTransition(new Transition<String>("0", 'a', "1"));
//
// myAutomata.addTransition(new Transition<String>("0", 'a', "3"));
// myAutomata.addTransition(new Transition<String>("0", 'b', "3"));
//
// myAutomata.addTransition(new Transition<String>("0", 'a', "2"));
// myAutomata.addTransition(new Transition<String>("0", 'b', "2"));
//
// myAutomata.addTransition(new Transition<String>("1", 'a', "1"));
// myAutomata.addTransition(new Transition<String>("1", 'b', "3"));
//
// myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
// myAutomata.addTransition(new Transition<String>("1", 'b', "2"));
//
// myAutomata.addTransition(new Transition<String>("2", 'b', "2"));
// myAutomata.addTransition(new Transition<String>("2", 'b', "4"));
//
// myAutomata.addTransition(new Transition<String>("2", 'b', "3")); //ja? Ja.
// myAutomata.addTransition(new Transition<String>("3", 'b', "2"));
//
// myAutomata.addTransition(new Transition<String>("3", 'b', "3"));
//
// myAutomata.addTransition(new Transition<String>("3", 'a', "4"));
// myAutomata.addTransition(new Transition<String>("3", 'b', "4"));
//
// myAutomata.defineAsStartState("0");
// myAutomata.defineAsEndState("1");
// Test 3
// myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
// myAutomata.addTransition(new Transition<String>("1", 'b', "1"));
//
// myAutomata.addTransition(new Transition<String>("2", 'a', "3"));
// myAutomata.addTransition(new Transition<String>("2", 'b', "2"));
// myAutomata.addTransition(new Transition<String>("2", Transition.EPSILON, "1"));
//
// myAutomata.addTransition(new Transition<String>("3", 'a', "4"));
// myAutomata.addTransition(new Transition<String>("3", 'b', "3"));
// myAutomata.addTransition(new Transition<String>("3", Transition.EPSILON, "2"));
//
// myAutomata.addTransition(new Transition<String>("4", 'a', "1"));
// myAutomata.addTransition(new Transition<String>("4", 'b', "4"));
// myAutomata.addTransition(new Transition<String>("4", Transition.EPSILON, "3"));
//
// myAutomata.defineAsStartState("1");
// myAutomata.defineAsEndState("2");
// myAutomata.defineAsEndState("3");
myAutomata.defineAsStartState("0");
myAutomata.defineAsEndState("1");
System.out.println("De NDFA is ");
myAutomata.printTransitions();
System.out.println("Met als begin en eind states");
System.out.println(myAutomata.beginStates);
System.out.println(myAutomata.eindStates);
System.out.println("DFA is dan ");
myAutomata.toDFA().printTransitions();
DFA<String> myDfa = myAutomata.toDFA();
myDfa.printTransitions();
System.out.println("Met als begin en eind states");
System.out.println(myDfa.beginStates);
System.out.println(myDfa.eindStates);
}
public static void Practicum5 () {
Character [] characters = {'a', 'b'};
DFA<String> myAutomata = new DFA<String>(characters);
// Test 4 minimalisatie
myAutomata.addTransition(new Transition<String>("0", 'a', "0"));
myAutomata.addTransition(new Transition<String>("0", 'b', "1"));
myAutomata.addTransition(new Transition<String>("1", 'a', "0"));
myAutomata.addTransition(new Transition<String>("1", 'b', "2"));
myAutomata.addTransition(new Transition<String>("2", 'a', "0"));
myAutomata.addTransition(new Transition<String>("2", 'b', "3"));
myAutomata.addTransition(new Transition<String>("3", 'a', "4"));
myAutomata.addTransition(new Transition<String>("3", 'b', "5"));
myAutomata.addTransition(new Transition<String>("4", 'a', "5"));
myAutomata.addTransition(new Transition<String>("4", 'b', "3"));
myAutomata.addTransition(new Transition<String>("5", 'a', "0"));
myAutomata.addTransition(new Transition<String>("5", 'b', "3"));
myAutomata.defineAsStartState("0");
myAutomata.defineAsEndState("2");
myAutomata.defineAsEndState("4");
}
public static void main(String[] args) {
// System.out.println("Here my code be");
// com.imegumii.codevandocent.Automata<String> t1 = TestAutomata.getExampleSlide8Lesson2();
+83 -33
View File
@@ -21,60 +21,110 @@ public class NDFA<T extends Comparable> extends Automata<T> {
while(it.hasNext()) {
Transition<T> t = it.next();
boolean isGelijk = false;
isGelijk = s == t.symbol;
if (t.vanState == vanaf) {
boolean isGelijk = false;
isGelijk = s == t.symbol;
if (isGelijk && !bereikbaar.contains(t.naarState)) {
bereikbaar.add(t.naarState);
bereikbaar.addAll(statesBereikbaarVanaf(t.naarState, Transition.EPSILON));
if (isGelijk && !bereikbaar.contains(t.naarState)) {
bereikbaar.add(t.naarState);
bereikbaar.addAll(statesBereikbaarVanaf(t.naarState, Transition.EPSILON));
}
}
}
return bereikbaar;
}
public SortedSet<T> statesBereikbaarVanafSymbool(char s) {
SortedSet<T> bereikbareStates = new TreeSet<T>();
Iterator<T> it = this.states.iterator();
while (it.hasNext()) {
T state = it.next();
bereikbareStates.addAll(statesBereikbaarVanaf(state, s));
}
return bereikbareStates;
}
public SortedSet<T> transitie (char c) {
SortedSet<T> bereikbareStates = statesBereikbaarVanafSymbool(c);
if (bereikbareStates.equals(this.states)) {
return this.states;
} else {
return bereikbareStates;
}
}
public DFA<T> toDFA () {
DFA<T> eindDFA = new DFA<T>(this.symbols);
public DFA<String> toDFA () {
DFA<String> eindDFA = new DFA<>(this.symbols);
SortedSet<T> startSet = new TreeSet<T>();
T firstState = this.beginStates.first();
startSet.add(firstState);
startSet.addAll(statesBereikbaarVanaf(firstState, Transition.EPSILON));
System.out.println("Begin states zijn: ");
startSet.forEach(System.out::println);
// System.out.println("Begin states zijn: ");
// startSet.forEach(System.out::println);
for (T t : startSet) {
eindDFA.defineAsStartState(t);
}
HashMap<SortedSet<T>, Integer> totaalEindStates = new HashMap<>();
totaalEindStates.put(startSet, 0);
Queue<SortedSet<T>> kue = new LinkedList<>();
kue.offer(startSet);
kue.offer(startSet); // add beginstate(s)
// System.out.println("Start ------------");
int stateCounter = 1;
SortedSet<Transition<String>> trans = new TreeSet<>();
while (!kue.isEmpty()) {
SortedSet<T> set = kue.poll();
// we beginnen bij de begin states
// kijk welke states je kunt bereiken vanaf deze state.
for (Character symbol : this.symbols) {
SortedSet<T> totaalTeBereiken = new TreeSet<>();
boolean isEindState = false;
boolean isBeginState = stateCounter == 1;
for (T t : set) {
// kijk wat er te bereiken is vanaf t
SortedSet<T> bereikbareStates = statesBereikbaarVanaf(t, symbol);
// System.out.println("Vanaf " + t + " kan ik bij " + bereikbareStates + " komen via " + symbol);
totaalTeBereiken.addAll(bereikbareStates);
if (this.eindStates.contains(t)) {
isEindState = true;
}
}
if (!totaalEindStates.containsKey(totaalTeBereiken)) {
kue.offer(totaalTeBereiken);
totaalEindStates.put(totaalTeBereiken, stateCounter);
stateCounter++;
}
// add transitions
// System.out.println("Vanaf " + set + " kan ik dus bij " + totaalTeBereiken + " komen via " + symbol);
eindDFA.addTransition(new Transition<>(totaalEindStates.get(set).toString(), symbol, totaalEindStates.get(totaalTeBereiken).toString()));
if (isBeginState) {
// beginstate
eindDFA.defineAsStartState(totaalEindStates.get(set).toString());
}
if (isEindState) {
// System.out.println("Eind state is ");
eindDFA.defineAsEndState(totaalEindStates.get(set).toString());
}
}
}
// System.out.println("----end");
// System.out.println("In totaal krijgen we " + totaalEindStates);
// eindDFA.transistions.forEach((t) -> {
//// System.out.println(t.vanState);
// System.out.println("(" + getByValue(totaalEindStates, t.vanState) + ", " + t.symbol + ")-->" + getByValue(totaalEindStates, t.naarState));
//
// });
// trans.forEach(System.out::println);
// for (Transition<String> t : trans) {
// eindDFA.addTransition(t);
// }
return eindDFA;
}
// public SortedSet<T> getByValue (HashMap<SortedSet<T>, Integer> map, String value) {
// for (Map.Entry<SortedSet<T>, Integer> e : map.entrySet()) {
// if (value.equals(e.getValue().toString())) {
// return e.getKey();
// }
// }
//
// return null;
// }
}