Pastebin

Paste #1236: differential simulated annealing

< previous paste - next paste>

Pasted by Verte

Download View as text

def d_neighbour(h, reservations):
    """Find a neighbour state"""

    # Pick a random reservation
    r = random.choice(reservations)
    rsize = len(r.seats)

    #print """We randomly selected reservation %s, with %s seats""" % (r.id, rsize)
    #print r.pp()

    # Pick random row with enough seats
    row = None
    while not row:
        crow = random.choice(h.rows)
        if len(crow.seats) >= rsize:
            row = crow

    # Pick a random start seat in this row
    new_idx = int(rand() * (len(row.seats)-rsize))

    # the unmodified reservation and the new seats
    return reservation, row.seats[new_idx:new_idx+rsize]

    
def d_E(reservation, new_seats):
    return sum(r.seat.score for r in new_seats) - sum(r.seat.score for r in reservation)


def apply_diff(reservation, new_seats):
    for seat in reservation.seats:
        seat.sold -= 1
    reservation.seats = new_seats

# ...

base_E = E(sn)
hall, reservations = sn
en = base_E # ?

i = 0
while k < kmax and e > emax:                 # While time remains & not good enough:
    i+=1
    reservation, new_seats = neighbour(hall, reservations)
    energy_diff = d_E(reservation, new_seats)

    if energy_diff < 0:
        apply_diff(reservation, new_seats)
        en += energy_diff

    if P(e, en, temp(k/kmax)) > rand():      #   Should we move to it?
        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)

New Paste


Do not write anything in this field if you're a human.

Go to most recent paste.