diff --git a/main.py b/main.py index 069cb9b..75f038b 100644 --- a/main.py +++ b/main.py @@ -8,8 +8,8 @@ import time import math from queue import PriorityQueue as pq -DEBUG=True -# DEBUG=False +# DEBUG=True +DEBUG=False class SquareType(Enum): AISLE = 0 @@ -25,6 +25,8 @@ entries=[(0,3)] # entries=[(7,3),(7,43)] # entries=[(7,3)] +passengers = None + class GridSquare: #typ: SquareType, occupant: index @@ -42,6 +44,9 @@ def makeGrid(): class Passenger: shuffled = 0 inter = None + interback = None + path = [] + recalc = True #dest and curr are both 2-tuples def __init__(self, dest, curr): self.dest = dest @@ -57,7 +62,9 @@ def mooreNeighbourhood(pos): i[0] >= 0 and i[1] >= 0 and i[0] < height and i[1] < width] def nextSquare(passenger, grid): + passenger.path=[] dist=[[0 for x in range(0,width)] for y in range(0,height)] + prev=[[None for x in range(0,width)] for y in range(0,height)] dest = None @@ -75,29 +82,35 @@ def nextSquare(passenger, grid): mn = mooreNeighbourhood(passenger.curr) for (i, man) in enumerate(mn): - if (grid[passenger.curr[0]][passenger.curr[1]].typ != SquareType.SEAT or man[1] == passenger.curr[1]) and grid[man[0]][man[1]].typ != SquareType.WALL: + if (grid[passenger.curr[0]][passenger.curr[1]].typ != SquareType.SEAT or man[1] == passenger.curr[1]) and grid[man[0]][man[1]].typ != SquareType.WALL and not (grid[man[0]][man[1]].typ == SquareType.AISLE and grid[man[0]][man[1]].occupant is not None): q.put((1, man, i)) dist[man[0]][man[1]] = 1 + prev[man[0]][man[1]] = (0, passenger.curr, 0) while not q.empty(): u = q.get() if u[1] == dest: - return mn[u[2]] + while prev[u[1][0]][u[1][1]] != None: + passenger.path.append(u[1]) + u=prev[u[1][0]][u[1][1]] + return for x in mooreNeighbourhood(u[1]): - alt = 0 - if grid[x[0]][x[1]].typ == SquareType.SEAT or grid[u[1][0]][u[1][1]].typ == SquareType.SEAT: - alt = dist[u[1][0]][u[1][1]] + 5 - else: - alt = dist[u[1][0]][u[1][1]] + 1 - # if alt == 0: - # if x == dest: - # print("mn: " + str(x) + ", alt: " + str(alt)) - # print("dist" + str(x) + ": " + str(dist[x[0]][x[1]])) - if alt < dist[x[0]][x[1]]: - dist[x[0]][x[1]] = alt - q.put((alt, x, u[2])) + if not( grid[x[0]][x[1]].typ == SquareType.SEAT and u[1][1] != x[1]) and grid[x[0]][x[1]].typ != SquareType.WALL: + alt = 0 + if grid[x[0]][x[1]].typ == SquareType.SEAT or grid[u[1][0]][u[1][1]].typ == SquareType.SEAT: + alt = dist[u[1][0]][u[1][1]] + 5 + else: + alt = dist[u[1][0]][u[1][1]] + 1 + # if alt == 0: + # if x == dest: + # print("mn: " + str(x) + ", alt: " + str(alt)) + # print("dist" + str(x) + ": " + str(dist[x[0]][x[1]])) + if alt < dist[x[0]][x[1]]: + dist[x[0]][x[1]] = alt + prev[x[0]][x[1]] = u + q.put((alt, x, u[2])) - return passenger.curr + passenger.path = [passenger.curr] def GenPassList(): @@ -132,39 +145,41 @@ def GenPassList(): inc = (-1)**i * sign * math.floor((i+1)/2) if (inc + x.dest[0] > 0) and (inc + x.dest[0] < height) and (grid[x.dest[0]+inc][x.dest[1]].typ == SquareType.AISLE): x.inter=(inc + x.dest[0], x.dest[1]) + x.interback = x.inter return border -#boarding order -passengers = GenPassList() - -# rnd.seed(605) -# passengers.reverse() -rnd.shuffle(passengers) -toad = 0 -btime = 3 #passengers board every btime ticks - - def nunty(x): if x is None: return -1 return x -def tick(t): +btime = 3 #passengers board every btime ticks + +def tick(t, toad): done=True - global toad global btime # print grid if DEBUG: + print(chr(0x3000), end="") + print(chr(0x3000), end="") for x in range(0, width): if x % 10 == 0: print(chr(0xFF10 + int(x / 10)), end="") else: print(chr(0x3000), end="") print() + print(chr(0x3000), end="") + print(chr(0x3000), end="") for x in range(0, width): print(chr(0xFF10 + (x % 10)), end="") print() - for row in grid: + for (i, row) in enumerate(grid): + if i % 10 == 0: + print(chr(0xFF10 + int(i / 10)), end="") + else: + print(chr(0x3000), end="") + print(chr(0xFF10 + (i % 10)), end="") + for guy in row: if guy.occupant is not None: print(chr(0x20000 + guy.occupant), end="") @@ -189,15 +204,34 @@ def tick(t): if man.inter is not None and man.curr == man.inter: man.shuffled = 3 man.inter = None + man.recalc = True if man.curr == (-1, -1): continue # if i == 36 and DEBUG: # print(nextSquare(man, grid)) - if DEBUG: - print(str(man.curr) + ", " + str(man.inter) + ", " + str(man.dest)) done=False #im sexist - nextS=nextSquare(man,grid) + if man.recalc: + # if DEBUG: + # print("Recalculating: " + str(man.curr)) + nextSquare(man, grid) + man.recalc = False + if len(man.path) == 0: + # if DEBUG: + # print("Recalculating: " + str(man.curr)) + nextSquare(man, grid) + + nextS = man.path.pop() + + if manhattanDistance(nextS, man.curr) > 1: + # if DEBUG: + # print("Recalculating: " + str(man.curr)) + nextSquare(man, grid) + nextS = man.path.pop() + + if DEBUG: + print(str(man.curr) + ", " + str(man.interback) + ", " + str(man.dest) + ", " + str(nextS) + ", " + str(man.inter)) + if passengers[i].shuffled == 0 and not ( grid[nextS[0]][nextS[1]].typ == SquareType.AISLE and grid[nextS[0]][nextS[1]].occupant is not None): cp = man.curr man.curr = nextS @@ -211,16 +245,39 @@ def tick(t): if man.shuffled != 0: man.shuffled-=1 if DEBUG: - time.sleep(0.05) + # time.sleep(1.0) + # time.sleep(0.5) + # time.sleep(0.1) + # time.sleep(0.05) + # time.sleep(0.02) + # time.sleep(0.01) + # time.sleep(0.001) os.system("clear") if done and toad >= len(passengers): print("Number of ticks: " + str(t)) - exit() + return -1 + # exit() + return toad def run(): + toad = 0 t = 0 - while 1: - tick(t) + while toad != -1: + toad = tick(t,toad) t += 1 -run() + +def main(): + global passengers + #boarding order + + for seediter in range(0,200): + passengers = GenPassList() + print("Seed: " + str(seediter)) + rnd.seed(seediter) + # passengers.reverse() + rnd.shuffle(passengers) + run() + +if __name__ == "__main__": + main()