RAMIFICACIÓN Y PODA
305
FOR j:=1 TO N DO IF EsKprometedor(n^.s,i-1,j) THEN INC(nhijos); Copiar(n,p); p^.s[i]:=j; INC(p^.k); hijos[nhijos-1]:=p; END END; RETURN nhijos; END Expandir;
Las funciones auxiliares de las que hace uso la función Expandir son las siguientes: PROCEDURE Copiar(VAR n1,n2:nodo); (* duplica un nodo *) BEGIN NEW(n2); n2^.s:=n1^.s; n2^.k:=n1^.k; END Copiar; PROCEDURE EsKprometedor(s:solucion;k,j:CARDINAL):BOOLEAN; VAR i:CARDINAL; BEGIN FOR i:=1 TO k DO IF (s[i]=j)OR(ValAbs(s[i],j)=k+1-i) THEN RETURN FALSE END; END; RETURN TRUE; END EsKprometedor;
Esta función hace uso de la que calcula el valor absoluto de la diferencia de dos enteros no negativos: PROCEDURE ValAbs(a,b:CARDINAL):CARDINAL; (* valor absoluto de la diferencia de sus argumentos: |a-b| *) BEGIN IF a>b THEN RETURN a-b ELSE RETURN b-a END END ValAbs;
Otra función importante es aquella que determina cuándo un nodo es una hoja del árbol de expansión, esto es, una solución al problema. Para ello, basta ver que el vector solución construido es n-prometedor: PROCEDURE EsSolucion(n:nodo):BOOLEAN; BEGIN