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; }restituisce se lo stato q è uno stato finalecodice:boolean finalState(int q)
restituisce lo stato di arrivo da q leggendo ccodice:int move(int q, char c)
restituisce l'alfabeto dell'automacodice:HashSet alfphabet()
inserisce nell'automa una transazione da p a q tramite il carattere ccodice:setMove(int p, char c, int q)
inserisce lo stato q tra gli stati finalicodice:addFinalState(int q)
numberOfStates è una variabile privata della classe che, come da nome, indica il n° degli stati dell'automa
Vi ringrazio molto per qualsiasi aiuto![]()

. 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.
Rispondi quotando
