Index: sa2-non-destructive.py =================================================================== --- sa2-non-destructive.py (revision 1132) +++ sa2-non-destructive.py (working copy) @@ -11,6 +11,8 @@ seats_file = "seats" reservations_file = "reservations" +#seats_file = "seats_large" +#reservations_file = "reservations_large" HINT = 5 NOTE = 4 @@ -186,23 +188,33 @@ # # Place the new reservation # return (h, reservations) return (r, row, new_idx) - -def E(s, patch=None): + +def patch_apply(s, patch): + (r, row, new_idx) = patch + seats = r.seats[:] + + for ts in r.seats: + ts.sold -= 1 + r.seats = [] + rsize = len(seats) + for x in range(0, rsize): + r.seats.append(row.seats[x+new_idx]) + row.seats[x+new_idx].sold += 1 + return seats + +def patch_unapply(s, patch, seats): + (r, row, new_idx) = patch + for ts in r.seats: + ts.sold -= 1 + r.seats = seats + rsize = len(r.seats) + for x in range(0, rsize): + row.seats[x+new_idx].sold += 1 + +def E(s, patch): (h, reservations) = s if patch: - (r, row, new_idx) = patch - # apply patch - seats = r.seats[:] - # Delete the old reservation - for ts in r.seats: - ts.sold -= 1 - r.seats = [] - seats = r.seats - r.seats = None - rsize = len(r.seats) - for x in range(0, rsize): - r.seats.append(row.seats[x+new_idx]) - row.seats[x+new_idx].sold += 1 + seats = patch_apply(s, patch) energy = 0 for r in reservations: for seat in r.seats: @@ -210,13 +222,7 @@ if seat.sold > 1: energy += seat.sold * seat.score if patch: - # de-apply patch - for ts in r.seats: - ts.sold -= 1 - r.seats = seats - rsize = len(r.seats) - for x in range(0, rsize): - row.seats[x+new_idx].sold += 1 + patch_unapply(s, patch, seats) return energy def P(e, en, t): @@ -251,23 +257,26 @@ # make initial state with ff s0 = firstfit(h, reservations) -s = s0; e = E(s) # Initial state, energy. +s = s0; e = E(s, None) # Initial state, energy. sb = deepcopy(s); eb = e # Initial "best" solution k = 0 # Energy evaluation count. -kmax = 1600 +kmax = 4000 #kmax = len(reservations) * 10 emax = 0-calc_emax(num_guests(reservations), h) i = 0 while k < kmax and e > emax: # While time remains & not good enough: +# print "." i+=1 sn = neighbour(s) # Pick some neighbour. en = E(s, sn) # Compute its energy. if en < eb: # Is this a new best? - sb = deepcopy(sn); eb = en # Yes, save it. + patch_apply(sb, sn); eb = en # Yes, save it. if P(e, en, temp(k/kmax)) > rand(): # Should we move to it? - s = deepcopy(sn); e = en # Yes, change state. + sb = deepcopy(s); e = en +# print +# s = deepcopy(sn); e = en # Yes, change state. k = k + 1 # One more evaluation done log("""Status: en: %s, eb: %s, e: %s""" % (en, eb, e), HINT) log(80*"=" + "\n" + str(sb), NOTE) # Return the best solution found. @@ -275,6 +284,7 @@ #log(h.pp(), NOTE) log("----------- ", NOTE) log("sb: ", NOTE) +#print sb (h, reservations) = sb for r in reservations: log(r.pp(), NOTE)