#USE "proto.tsr" #USE strmhdr #USE splib #USE solib PROC knap.k(CHAN OF STREAM from.queue, --to.queue, CHAN OF STREAM out, VAL INT name, VAL INT num.trans) BOOL running: [MAX.CAP]INT sol: [MAX.QUEUE]INT queue: [MAX]INT p.k, w.k: INT M, bandas, resto, best.solution: SEQ [MAX.CAP]INT p, w: INT t.p, t.w: SEQ from.queue ? CASE problem; t.p::p; t.w::w; M sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," Problem") sem ! 1 out ! problem; t.p::p; t.w::w; M SEQ bandas := t.p / num.trans resto := t.p \ num.trans IF resto >= name bandas := bandas + 1 resto = 0 resto := num.trans TRUE SKIP SEQ i = 0 FOR bandas SEQ p.k[i] := p[(i * num.trans) + (name - 1)] w.k[i] := w[(i * num.trans) + (name - 1)] INT last.solution, top, f.u, u, c.p, c.w: BOOL no.last: SEQ SEQ i = 0 FOR bandas SEQ c.p := p.k[i] c.w := w.k[i] no.last := NOT((i = (bandas - 1)) AND (resto = name)) SEQ k = 0 FOR (M + 1) sol[k] := INFINITY last.solution := c.w best.solution := INFINITY top := 0 sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," solving bandas=") so.write.int(from.isv,to.isv,bandas,0) sem ! 1 SEQ running:= TRUE WHILE running SEQ --to.queue ! signal from.queue ? CASE optimal; f.u; u SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," R=") so.write.int(from.isv,to.isv,f.u,0) sem ! 1 IF sol[u] < f.u sol[u] := f.u TRUE SKIP SEQ SEQ k = top FOR (u - top) + 1 IF (sol[k] > best.solution) SEQ best.solution := sol[k] IF no.last SEQ out ! optimal; sol[k]; k sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," S=") so.write.int(from.isv,to.isv,sol[k],0) sem ! 1 TRUE SKIP TRUE SKIP top := u + 1 SEQ IF (u + c.w) <= M SEQ last.solution := u + c.w sol[last.solution] := f.u + c.p TRUE SKIP finish SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," Finish") sem ! 1 IF (top <= last.solution) SEQ k = top FOR (last.solution - top) + 1 IF (sol[k] > best.solution) SEQ best.solution := sol[k] IF no.last out ! optimal; sol[k]; k TRUE SKIP TRUE SKIP TRUE SKIP IF no.last out ! finish TRUE SKIP running := FALSE IF resto = name SEQ out ! solution; best.solution sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," Solucion=") so.write.int(from.isv,to.isv,best.solution,0) sem ! 1 resto < name SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NEsperando solucion") sem ! 1 from.queue ? CASE solution; best.solution out ! solution; best.solution TRUE SKIP sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," FIN") sem ! 1 :