RAMIFICACIÓN Y PODA
293
n^.peso:=0; n^.beneficio:=0; n^.k:=0; RETURN n; END NodoInicial;
La estrategia de ramificación está a cargo de la función Expandir. Cada nodo puede generar a lo sumo dos hijos, que corresponden a incluir el elemento o no en la mochila. Sólo serán generados aquellos nodos que sean válidos, esto es, si caben en la mochila, teniendo en cuenta la capacidad utilizada hasta el momento. PROCEDURE Expandir(n:nodo;VAR hijos:ARRAY OF nodo):CARDINAL; VAR i,j,peso,plazo,beneficio,nhijos:CARDINAL; p:nodo; BEGIN nhijos:=0; 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; (* caso 1: lo metemos *) IF n^.peso+peso<=capacidad THEN (* cabe! *) INC(nhijos); Copiar(n,p); p^.s[i]:=1; INC(p^.k); INC(p^.peso,peso); INC(p^.beneficio,beneficio); hijos[nhijos-1]:=p; END; RETURN nhijos; END Expandir;
Esta función hace uso de un procedimiento que permite duplicar un nodo: PROCEDURE Copiar(VAR n1,n2:nodo); VAR i:CARDINAL; BEGIN NEW(n2); FOR i:=1 TO N DO n2^.s[i]:=n1^.s[i] END;