RAMIFICACIÓN Y PODA
297
INC(p^.k); INC(p^.peso,peso*j); INC(p^.beneficio,beneficio*j); hijos[nhijos-1]:=p; INC(j) END; RETURN nhijos; END Expandir;
Las demás funciones del módulo “Nodos” quedan igual. Respecto a la modificación de limitar el número de objetos de un tipo, en primer lugar necesitamos modificar la estructura de datos que almacena los datos globales sobre los elementos, para incluir la información sobre el número de objetos que disponemos de cada tipo: VAR tabla:ARRAY[1..N]OF RECORD beneficio,peso,unidades:CARDINAL END;
y, por supuesto, incluir la inicialización de tales datos en el proceso de inicialización del módulo “Nodos”: tabla[1].unidades:=2; tabla[2].unidades:=2; tabla[3].unidades:=2; tabla[4].unidades:=2;
Por otro lado, en la función Expandir hace falta tener en cuenta esta limitación: PROCEDURE Expandir(n:nodo;VAR hijos:ARRAY OF nodo):CARDINAL; VAR i,j,peso,plazo,beneficio,nhijos:CARDINAL; p:nodo; BEGIN nhijos:=0; (* en cada etapa generamos los posibles nodos hijos *) i:=n^.k+1; IF i>N THEN RETURN nhijos END; (* caso especial *) peso:=tabla[i].peso; beneficio:=tabla[i].beneficio; (* caso 0: no lo metemos *) INC(nhijos); Copiar(n,p); INC(p^.k); (* no se aumenta el peso ni el beneficio *) hijos[nhijos-1]:=p;
(* resto de los casos: metemos 1, 2, ... unidades *) j:=1; WHILE (n^.peso+(peso*j)<=capacidad)AND(j<=tabla[i].unidades) DO (* caben j unidades *) INC(nhijos); Copiar(n,p);