Estoy haciendo una tarea para simular un autómata finito no determinista, tal como explico en este post. Tengo esta entrada de leer el archivo tarea4.in
:Diseñe un autómata finito no determinista en C++ (salida incorrecta)
1
6 8 0 2
2
5
0 0 a
0 1 a
1 1 b
1 2 c
1 3 c
3 4 d
4 4 d
4 5 d
5
aaabcccc
aabbbbcdc
abbcdddcc
acdddddd
abc
La primera línea de entrada es un entero T, representa el número de casos para evaluar el programa. Cada caso de prueba comienza con 4 enteros, el primero es el número de estado del autómata, el siguiente es el número de transiciones del autómata, el tercer número es el estado inicial y luego el número de estados finales. luego vienen los estados finales (en el ejemplo, los estados finales son 2 y 5). Luego vienen las líneas F, cada una con un número entero E, que representa E es un estado final.
Luego vienen N líneas (N es el número de transiciones), cada una con 2 enteros y un carácter, I, J y C, representando los estados donde la transición, es decir, la transición va del estado i al estado J con el carácter C. Siguiendo esta línea, viene con un entero único S, que contendrá el número de cadenas para probar, luego S líneas con las cadenas respectivas.
la salida esperada es:
Test Case #2:
aaabcccc Rejected
aabbbbcdc Rejected
abbcdddcc Rejected
acdddddd Accepted
abc Accepted
La salida resultante en mi código:
Test Case #1:
aaabcccc Rejected
aabbbbcdc Rejected
abbcdddcc Rejected
acdddddd Rejected
abc Rejected
Aquí está mi código:
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <vector>
using namespace std;
typedef map<pair<int, int>, char> transitions;
transitions trans;
int numberFinals;
vector<int> currentStates;
int main(){
freopen ("tarea4.in", "r", stdin);
//freopen ("tarea4.out", "w", stdout);
int testCases, i, j,k, cont=1,finalStates,numberInputs,stateOrigin, stateDestination;
int numberStates, numberTransitions, initialState;
char transitionCharacter ;
set<int> current;
set<int> next;
set<int>::iterator it;
set <int> final;
std::set<int> the_intersection; // Destination of intersect
map<pair<int, int>, char>::iterator p;
string inputString;
cin>> testCases;
for (i=0;i< testCases;i++){
cin>>numberStates>>numberTransitions>>initialState>>numberFinals;
current.insert (initialState);
for (j=0;j<numberFinals;j++){
cin>>finalStates;
final.insert(finalStates);
}
for (j=0; j<numberTransitions;j++){
cin>> stateOrigin>>stateDestination>>transitionCharacter;
trans.insert(transitions::value_type(std::make_pair(stateOrigin, stateDestination), transitionCharacter));
}
cin>>numberInputs;
cout<<"Test Case #"<<cont++<<":"<<endl;
for (j=0; j<numberInputs;j++){
//////////////////the code of the answer /////////////////
current.insert (initialState);
cin>> inputString;
cout<<inputString<<" ";
for (k=0; k<str.size();k++){
next.clear();
for (it=current.begin() ; it != current.end(); it++){
for (q= trans.begin(); q!= trans.end();q++){
if((*it == q->first.first)&&(str[k]==q->second)){
next.insert(q->first.second);
}
current=next;
}
}
}
std::set_intersection(current.begin(), current.end(), final.begin(), final.end(), std::inserter(the_intersection, the_intersection.end()));
if (the_intersection.size()>0){
cout<< "Accepted"<<endl;
}
else{
cout<< "Rejected"<<endl;
}
}
printf ("\n");
}
return 0;
}
Mi pregunta es: ¿Por qué aparece incorrecta ¿salida? Creo que es por el no determinismo del autómata definido en el caso de prueba, pero ¿cómo puedo evaluar la cadena correctamente? ¿Cómo puedo cambiar mi función llamada evaluate_string
para que de alguna manera compruebe las diferentes rutas que puede tomar el autómata para evaluar la cadena por el no determinismo?
He estado atascado con esto durante varios días y para ser sincero, estoy algo desesperado.
Formatee su código correctamente la próxima vez. Tus hendiduras estaban muy lejos. Además, no entiendo el resultado esperado. Por ejemplo, ¿de dónde viene '0 b 3'? Finalmente, ¿qué quieres? ¿Un NFA o un DFA? Nada en su publicación es un autómata determinista (ni la entrada ni la salida esperada), así que he eliminado las menciones de "DFA" por ahora ... –
'¿de dónde viene 0 b 3?': Para la entrada aabbbbcdc las transiciones del autómata son: '(q0, a) = 0, (q0, a) = 0, (q0, b) = 3, (q3, b) = 0, (q0, b) = 3, (q3, b) = 0' '¿qué desea?'; Mi función "evaluate_string" implementa un DFA y quiero saber cómo modificarlo para obtener un NFA – novaKid
Eso no es lo que quiero decir. El '0 b 3' es de la función de transición, no hay entrada a considerar. - Con respecto a tu pregunta: ah, lo tengo. La mala noticia es que puede transformar un NFA en un DFA y resolverlo, pero no puede obtener el resultado de transición de estado idéntico porque sus nombres de estado * * serán diferentes. Además, ejecutar el NFA directamente es probablemente más fácil (¡ni siquiera 10 líneas!) Que transformarlo primero en DFA. –