def Union_Especial (self, automatas): #Se crea un AFN vacío para guardar el resultado Nuevo_Automata = AFN () #Se crea un nuevo estado inicial Nuevo_Inicio = Estado () for a in automatas: #Se agregan todos los estados al nuevo automata Nuevo_Automata.Estados = (Nuevo_Automata.Estados).union (a.Estados) #Se crea el alfabeto del nuevo automata con la union de alfabetos de los otros automatas Nuevo_Automata.Alfabeto = (Nuevo_Automata.Alfabeto).union (a.Alfabeto) #Se agrega una transición del nuevo estado inicial a los estados iniciales de los automatas Nuevo_Inicio.AddTransition (a.Estado_Inicial, '') #Agregar el nuevo estado de inicio al conjunto de estados del nuevo AFN (Nuevo_Automata.Estados).add (Nuevo_Inicio) #Se asigna el nuevo estado inicial del AFN Nuevo_Automata.Estado_Inicial = Nuevo_Inicio token = 10 for a in automatas: for e in a.Estados_Aceptacion: #Se agregan los estados de aceptación al conjunto de estado de aceptación de los AFN (Nuevo_Automata.Estados_Aceptacion).add (e) #Se asigna un token distinto a cada estado de aceptación e.Token = token token = token + 10 return Nuevo_Automata
def read_line_first(line): global i_line, has_changed, Estados, pos_estado, pos_estado_atual, all_have_eps i_line = 1 estado = splitNT(line) if exists_estado(estado): pos_estado_atual = search_pos_estado(estado) else: Est = Estado() Est.nome = estado Estados.append(Est) pos_estado_atual = len(Estados)-1 while (line[i_line] == ' ' or line[i_line] == '>' or line[i_line] == ':' or line[i_line] == '='): i_line += 1 while line[i_line] != '\n': while line[i_line] != ' ' and line[i_line] != '\n': if read_production_first(line) == True: break while line[i_line] != '|': if line[i_line] == '\n': return #Current line is over, end function i_line += 1 i_line += 1 while line[i_line] == ' ': i_line += 1
def sucesores(self, state): actual = state.get_posicionActual # Obtenemos la posicion actual y la marcamos como el origen sucesores = [] # Creamos una lista vacia de sucesores listadenodos = self.graph.adyacentesnodo(actual) #Ver cuando listadenodos es NoneType if listadenodos is None: return sucesores for sucesor in listadenodos: # Para cada nodo: destino = sucesor[1] # marcamos el sucesor como destino #accM = 'Ir por ' + self.graph.get_nombrecalle(actual, destino) accM = '(' + self.graph.get_nombrecalle(actual, destino) + ')' costAcci = float(sucesor[3]) #costAcci = self.graph.get_coste(actual, destino) # buscamos el coste en el grafo entre esos dos nodos try: listadenodos.remove(actual) except ValueError: pass estadoNuevoM = Estado( destino, list.copy(state.listaNodos) ) # Creamos el nuevo estado desde el nodo destino actual = destino # Cambiamos la posicion actual sucesores.append([ accM, estadoNuevoM, costAcci ]) # Añadimos el sucesor a la lista en el formato pedido return sucesores
def Unir_AFN (self, AFN_2): #Se crea un nuevo estado inicial Nuevo_Inicio = Estado () #Se crea un nuevo estado final Nuevo_Fin = Estado () #Se agrega una transición del nuevo estado inicial al estado inicial del AFN_1 Nuevo_Inicio.AddTransition (self.Estado_Inicial, '') #Se agrega una transición del nuevo estado inicial al estado inicial del AFN_2 Nuevo_Inicio.AddTransition (AFN_2.Estado_Inicial, '') #Agregar una transición con epsilon de todos los estados finales al nuevo fin for e in self.Estados_Aceptacion: e.AddTransition (Nuevo_Fin, '') e.Estado_Aceptacion = False #Agregar una transición con epsilon de todos los estados finales al nuevo fin for e in AFN_2.Estados_Aceptacion: e.AddTransition (Nuevo_Fin, '') e.Estado_Aceptacion = False #Eliminar los estados de aceptación de ambos automatas self.Estados_Aceptacion = set () AFN_2.Estados_Aceptacion = set () #Agregar el nuevo estado de inicio al conjunto de estados del nuevo AFN self.Estados.add (Nuevo_Inicio) #Agregar el nuevo estado final al conjunto de estados del nuevo AFN self.Estados.add (Nuevo_Fin) #Se hace la union de alfabetos self.Estados = self.Estados.union (AFN_2.Estados) #Se asigna el estatus de estado de aceptación al nuevo estado final Nuevo_Fin.Estado_Aceptacion = True #Se agrega el nuevo estado final al conjunto de estados de aceptación self.Estados_Aceptacion.add (Nuevo_Fin) #Se actualiza el estado inicial del AFN self.Estado_Inicial = Nuevo_Inicio #Se actualiza el alfabeto del AFN con la unión de los alfabetos self.Alfabeto = (self.Alfabeto).union (AFN_2.Alfabeto) return self
def Cerradura_Opcional (self): #Se crea un nuevo estado inicial Nuevo_Inicio = Estado () #Se crea un nuevo estado final Nuevo_Fin = Estado () #Se agrega una transición del nuevo estado inicial al estado inicial del AFN Nuevo_Inicio.AddTransition (self.Estado_Inicial, '') #Se agrega una transición del nuevo estado inicial al nuevo estado final Nuevo_Inicio.AddTransition (Nuevo_Fin, '') #Agregar una transición con epsilon de todos los estados finales al nuevo estado final for e in self.Estados_Aceptacion: e.AddTransition (Nuevo_Fin, '') e.Estado_Aceptacion = False #Eliminar los estados de aceptación del AFN self.Estados_Aceptacion = set () #Agregar el nuevo estado de inicio al conjunto de estados del nuevo AFN self.Estados.add (Nuevo_Inicio) #Agregar el nuevo estado final al conjunto de estados del nuevo AFN self.Estados.add (Nuevo_Fin) #Se asigna el estatus de estado de aceptación al nuevo estado final Nuevo_Fin.Estado_Aceptacion = True #Se agrega el nuevo estado final al conjunto de estados de aceptación self.Estados_Aceptacion.add (Nuevo_Fin) #Se actualiza el estado inicial del AFN self.Estado_Inicial = Nuevo_Inicio return self
def creaEdo(self, raiz, token): """Crea un estado y lo agrega al AFN""" e = Estado(str(len(self.K)), raiz, token) self.K.append(e) if e.Raiz: self.S = e if e.Token > -1: self.Z = e return e
def agregar_estado(self, nombre): if self.alfabeto_vacio and self.estados_vacio: nuevo_estado = Estado.Estado(nombre) self.estados.append(nuevo_estado) else: for x in self.alfabeto: if x == nombre: print( "Este estado ya esta ingresado como parte del alfabeto" ) input("Presione enter") os.system("cls") return for y in self.estados: if y.nombre == nombre: print("Este estado es repetido") input("Presione enter") os.system("cls") return nuevo_estado = Estado.Estado(nombre) self.estados.append(nuevo_estado)
def __init__(self, simbolo=''): #Si no se recibe ningun simbolo, se inicializa todo a vacío if (len(simbolo) == 0): #Inicialización del estado inicial a 'null' self.Estado_Inicial = None #El conjunto del alfabeto se inicializa como un conjunto vacío self.Alfabeto = set() #El conjunto de estados se inicializa como un conjunto vacío self.Estados = set() #El conjunto de estados de aceptación se inicializa como un conjunto vacío self.Estados_Aceptacion = set() #Si se recibe un simbolo, se crea un AFN básico else: #Se crea un estado inicial de tipo Estado como atributo del AFN self.Estado_Inicial = Estado() #Se crea un estado final de tipo Estado Estado_Final = Estado() #Se cambia el estado de la bandera a true para saber que es estado final Estado_Final.Estado_Aceptacion = True #El conjunto del alfabeto se inicializa como un conjunto vacío self.Alfabeto = set() #Se agrega el símolo al alfabeto del AFN (si es un rango, se añaden todos los simbolos) if (len(simbolo) == 1): self.Alfabeto.add(simbolo) #Se agrega una transición del estado inicial al estado final con el caracter 'simbolo' (self.Estado_Inicial).AddTransition(Estado_Final, simbolo) else: (self.Estado_Inicial).AddTransition(Estado_Final, simbolo[0], simbolo[2]) for i in range(ord(simbolo[0]), ord(simbolo[2]) + 1): self.Alfabeto.add(chr(i)) #El conjunto de estados se inicializa como un conjunto vacío self.Estados = set() #Se agregan los estados al conjunto de Estados del AFN self.Estados.add(self.Estado_Inicial) self.Estados.add(Estado_Final) #El conjunto de estados de aceptación se inicializa como un conjunto vacío self.Estados_Aceptacion = set() #Se agrega el estado final del AFN como un estado de aceptación self.Estados_Aceptacion.add(Estado_Final)
def __init__(self, file): with open(file) as f: # Leemos el archivo json data = json.load(f) graphmlfile = data[ "graphlmfile"] + '.xml' # Cogemos el nombre del fichero para construir el grafo y # arreglamos el nombre añadiendo al final ".xml" que es como de verdad se llaman los ficheros nodoini = data['IntSt']['node'] # Capturamos el nodo inicial nodosproblem = data['IntSt'][ 'listNodes'] # Capturamos los nodos que quedan por recorrer ide = data['IntSt']['id'] self.estadoinicial = Estado( nodoini, nodosproblem, ide) # Guardamos el estado inicial del problema self.espacioDeEstados = EspacioEstados(graphmlfile)
def __init__(self): # Insere o primeiro estado na fila de execução, sendo o estado inicial do problema (3 Canibais, 3 Missionarios, 1 Barco na margem Esquerda) self.fila_execucao = [Estado(3, 3, 1)] self.solucao = None