Ho un esame tra poco e non mi vuole proprio funzionare questo programma
. E' un metodo di una classe DFA che minimizza l'automa generandone uno nuovo con il numero di stati minore possibile. La classe DFA è una classe che tratta di automi deterministici a stati finiti. Ho seguito l'algoritmo del prof ma funziona solo in caso di alcuni automi, non in altri, e non ne capisco il perché. Sotto al metodo vi scrivo i prototipi delle varie funzioni che ho usato.
codice:
public DFA minimize() {
boolean[][] eq = new boolean[numberOfStates][numberOfStates];
HashSet<Character> alfabeto = alphabet();
boolean cambiamento = true;
for(int i=0; i<numberOfStates; i++){
for(int j=0; j<numberOfStates; j++){
if((finalState(i) && finalState(j)) || (!finalState(i) && !finalState(j)))
eq[i][j] = true;
}
}
while(cambiamento) {
cambiamento=false;
for(int i=0; i<numberOfStates; i++){
for(int j=0; j<numberOfStates; j++){
if(eq[i][j]) {
for(char ch: alfabeto) {
int arrivoI = move(i,ch);
int arrivoJ = move(j,ch);
if(arrivoI!=-1 && arrivoJ!=-1 && !eq[arrivoI][arrivoJ]) {
eq[i][j]=false;
cambiamento=true;
}
}
}
}
}
}
int[] m = new int[numberOfStates];
int min;
for(int i=0; i<numberOfStates; i++){
min=numberOfStates;
for(int j=0; j<numberOfStates; j++){
if(eq[i][j] && j<min)
min = j;
}
m[i]=min;
}
int k=0;
for(int j=0; j<numberOfStates; j++){
if(m[j]>k)
k = m[j];
}
k++;
DFA newDfa = new DFA(k);
for(int i=0; i<numberOfStates; i++){
int arrivo;
for(char ch: alfabeto) {
arrivo = move(i, ch);
if(arrivo!=-1)
newDfa.setMove(m[i],ch,m[arrivo]);
}
}
for(int fs: finalStates) {
if(!newDfa.finalState(m[fs]))
newDfa.addFinalState(m[fs]);
}
return newDfa;
}
codice:
boolean finalState(int q)
restituisce se lo stato q è uno stato finale
codice:
int move(int q, char c)
restituisce lo stato di arrivo da q leggendo c
codice:
HashSet alfphabet()
restituisce l'alfabeto dell'automa
codice:
setMove(int p, char c, int q)
inserisce nell'automa una transazione da p a q tramite il carattere c
codice:
addFinalState(int q)
inserisce lo stato q tra gli stati finali
numberOfStates è una variabile privata della classe che, come da nome, indica il n° degli stati dell'automa
Vi ringrazio molto per qualsiasi aiuto