Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. def hitting_time(self, start, goal):
  2.  
  3. d = False
  4.  
  5. ordered = []
  6. closed = set()
  7.  
  8. q = []
  9. q.append(list(start))
  10. cnt = 0
  11.  
  12. goal = list(goal)
  13.  
  14. def already_hit(s, goal):
  15. return all([s[i] >= goal[i] for i in range(len(goal))])
  16.  
  17. def flatten_state(s, goal):
  18. return [min(s[0], goal[0]), min(s[1], goal[1]), min(s[2], goal[2])]
  19.  
  20. ### BFS ###
  21.  
  22. # With BFS, Generate an ordering of the possible states leading up the goal state
  23. can_hit_goal = False
  24. while len(q) != 0:
  25. # while not all([already_hit(state, goal) for state in q]) and len(q) != 0:
  26. s = q.pop(0)
  27. closed.add(tuple(s))
  28. ordered.append(s)
  29.  
  30. if s == goal:
  31. can_hit_goal = True
  32.  
  33. if already_hit(s, goal):
  34. continue
  35. all_nxt = [[s[0] + delta[0], s[1] + delta[1], s[2] + delta[2]] for delta in self.board.get_resources(self.player_id)]
  36. for nxt in all_nxt:
  37. nxt = flatten_state(nxt, goal)
  38. if tuple(nxt) not in closed:
  39. q.append(nxt)
  40. closed.add(tuple(nxt))
  41. cnt += 1
  42.  
  43. if not can_hit_goal:
  44. return float("inf")
  45.  
  46.  
  47. ### MATRIX ###
  48.  
  49. num_states = len(ordered)
  50.  
  51. # Figure out the indicies (in the list "ordering") for each possible "next" states from each
  52. # idx_nxt[0] = a list of the indices (in "ordering") that each successor state is at
  53. idx_nxt = [[float("inf") for _ in range(11)] for _ in range(len(ordered))]
  54. for i in range(num_states):
  55. current = ordered[i] # TODO: rename
  56.  
  57. # poss_nxt_state[0] = the state we will be in if we roll a 2
  58. # poss_nxt_state[10] = state we will be in if we roll a 12
  59. poss_nxt_states = [flatten_state((current[0] + delta[0], \
  60. current[1] + delta[1], \
  61. current[2] + delta[2]), goal) \
  62. for delta in self.board.get_resources(self.player_id)]
  63.  
  64. # Look for each of the poss_nxt_states
  65. for j in range(0, len(ordered)):
  66. for k in range(len(poss_nxt_states)): # len should be 11 each time
  67. nxt = poss_nxt_states[k]
  68. if ordered[j] == nxt:
  69. idx_nxt[i][k] = j
  70.  
  71. A = np.zeros((num_states, num_states))
  72. np.fill_diagonal(A, -1)
  73.  
  74. # probs_trans[0] = probability of rolling a 2
  75. probs_trans = [.0278, .0556, .0833, .1111, .1389, .1667, .1389, .1111, .0833, .056, .0278]
  76.  
  77. # Fill in hitting time recursion based off idx_nxt indices
  78. for s in range(num_states):
  79. for trans in range(11):
  80. idx = idx_nxt[s][trans]
  81. prob = probs_trans[trans]
  82. A[s][idx] += prob
  83.  
  84. b = np.array([-1 for _ in range(num_states)])
  85.  
  86. # Change the hitting time of the goal state to be 0. Sanity check: modify the last rows
  87. for s in range(num_states):
  88. if ordered[s] == goal:
  89. A[s] = np.zeros((1, num_states))
  90. A[s][s] = 1
  91. b[s] = 0
  92.  
  93. # Ax = b
  94. x = np.linalg.solve(A, b)
  95.  
  96. return x[0] # return the hitting time from the start state
  97.  
  98. # hitting_time([0,0,0],[4,2,8])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement