260
TÉCNICAS DE DISEÑO DE ALGORITMOS
También vamos a considerar una tercera versión del algoritmo para cuando necesitemos encontrar la mejor de entre todas las soluciones de un problema: PROCEDURE RyP_lamejor():nodo; VAR E:Estructura; (* estructura para almacenar los nodos *) n,solucion:nodo; hijos:ARRAY [1..MAXHIJOS] OF nodo; (* hijos de un nodo*) numhijos,i,j,valor,valor_solucion:CARDINAL; BEGIN E:=Crear(); n:=NodoInicial(); Anadir(E,n,h(n)); solucion:=NoHaySolucion(); valor_solucion:=MAX(CARDINAL); PonerCota(valor_solucion); WHILE NOT EsVacia(E) DO n:=Extraer(E); INC(numanalizados); numhijos:=Expandir(n,hijos); INC(numgenerados,numhijos); Eliminar(n); FOR i:=1 TO numhijos DO IF EsAceptable(hijos[i]) THEN IF EsSolucion(hijos[i]) THEN (* Eureka! *) valor:=Valor(hijos[i]); IF valor<valor_solucion THEN Eliminar(solucion); solucion:=hijos[i]; valor_solucion:=valor; PonerCota(valor); END; ELSE Anadir(E,hijos[i],h(hijos[i])) END; ELSE Eliminar(hijos[i]); INC(numpodados) END; END; END; Destruir(E); RETURN solucion; END RyP_lamejor;
Una vez disponemos del esquema de este tipo de algoritmos, vamos a definir el interfaz de los tipos abstractos de datos que representan los nodos y la estructura de datos para almacenarlos. En primer lugar, el módulo Nodos ha de implementar los siguientes procedimientos y funciones: DEFINITION MODULE Nodos; CONST MAXHIJOS = ...; (* numero maximo de hijos de un nodo *) TYPE nodo; PROCEDURE NodoInicial():nodo; (* raiz del arbol *) PROCEDURE Expandir(n:nodo;VAR hijos:ARRAY OF nodo):CARDINAL;