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