initialState(t,m,b,n,I,p){ for h = 1 to m: s_h = 0 for i = 1 to n: for j=1 to ell_i o_{i,j} <- {r_{i,j},...,r_{i,j}+p_{i,j}-1} v<-1 return(s,o,v) subsIt(sub,set): if(#sub=0): return(True,set) (end, sub) <- fSubsIt(sub,set) if(end): return(False,{set_1,...,set_{#sub-1}}) else return(False,sub) fSubsIt(sub,set): i <- #sub for j=1 to #sub: while set_i\notin sub : i <- i-1 if j<=#set-i: sub <- sub \backslash {set_i} sub <- sub \cup {set_{i+1},...,set_{i+j}} sub <- sub \backslash {set_{i+j+1},...,set_{#set}} return(False,sub) i <- i-1 return(True,{set_1,...,set_{#sub}) obligationoverlap(t,obl,k,r,p,d,U): V <- emptyset for j=1 to k: if (U\cup V) \cap obl_j = emptyset: V <- V \cup obl_j else: return True return False chooseObl(t,borSub,b,s,r,p,d,k): U <- emptyset for j=1 to k: obl_j = {r_j,...,r_j+p_j-1} for h=1 to #b A <- {s_h,...,s_h+b_h-1} if(A \cap U /= \empty) return(False, obl) U <- U \cup {s_h,...,s_h+b_h-1} loop <- True while loop: if not obligationoverlap(t,obl,k,r,p,d,U): return(True, obl) for i = 1 to k: (end,obl_j) <- fSubsIt(obl_j,{r_j,...,d_j}) loop <- not end if end: obl_j <- {r_j,...,r_j+p_j-1} else: break borrelIt(t,m,b,s): for h=1 to m: s_h <- s_h+1 if s_h+b_h-1<=t: return(False,s) else: s_h<-0 return(True,s) borrel(t,m,b,n,I,p,ell): (s,o,v) <- initialState(t,m,b,n,I,p,ell) (s*,o*,v*) <-initialState(t,m,b,n,I,p,ell) while True: v<-0 for i=1 to n: borSub <- {1,...,m} vS <- 0 while True (canAttend,obl) = chooseObl(t,borSub,b,s,r_i,d_i,p_i,\ell_i) if(canAttend): vS <- #borSub o*_i <- obl break (end,borSub) <- subsIt(borSub,{1,...,m}) if subsIt(borSub) break v <- v+vS if(v*