def test_reverse_box(): state = State(*list(level_reverse_box.values())) previous_states = state.prev_states() previous_states = {state.__str__() for state in previous_states} assert previous_states == {'#####\n# p #\n# B#\n# S#\n#####\n', '#####\n# #\n#p B#\n# S#\n#####\n', '#####\n# #\n#pB #\n# S#\n#####\n', '#####\n# #\n# B#\n# pS#\n#####\n'}
def test_reverse_box_on_storage(): state = State(*list(level_reverse_box_on_storage.values())) previous_states = state.prev_states() previous_states = {state.__str__() for state in previous_states} assert previous_states == {'#####\n# #\n# $#\n# p #\n#####\n', '#####\n# #\n#p $#\n# #\n#####\n', '#####\n# p #\n# $#\n# #\n#####\n', '#####\n# #\n#pBS#\n# #\n#####\n'}
if player not in boxes: out.append([player, boxes, storages, walls]) return out size = 8, 8 n_levels = 100 n_moves = 50 inner_height, inner_width = 8, 8 state_value_pairs = defaultdict(list) for _ in range(n_levels): n_boxes = random.choice([1, 2]) print("level: ", _, "boxes: ", n_boxes) levels = generate_end_states(inner_width, inner_height, n_boxes) states = [State(*[size[0], size[1]] + level) for level in levels] states_seen = {s.__str__() for s in states} state_value_pairs[0] = [state for state in states] for move in range(1, n_moves + 1): prev_states_list = [] for state in states: prev_states_list.extend(state.prev_states()) print(move, len(states), len(states_seen)) states = set() for state in prev_states_list: if state.__str__() in states_seen: continue states.add(state) if state.filled_storages[0] == state.filled_storages[1]: state_value_pairs[0].append(state) else:
def test_level_storage_box_mismatch(): with pytest.raises(AssertionError): State(*list(level_storage_box_mismatch.values()))
def test_level_player_on_wall_fails(): with pytest.raises(AssertionError): State(*list(level_player_on_wall.values()))
def test_level_ok_completes_level(): state = State(*list(level_ok.values())) for move in level_ok_moves: state.next_state(move) assert state.filled_storages == [3, 3]
def test_level_ok_counting_storages(): state = State(*list(level_ok.values())) assert state.filled_storages == [1, 3]
def test_level_ok_prints_right(): state = State(*list(level_ok.values())) out = state.__str__() lev = '######\n#p #\n# $ #\n# BS#\n# BS #\n######\n' assert lev == out
def test_reverse_no_boxes(): state = State(*list(level_reverse_no_boxes.values())) previous_states = state.prev_states() previous_players = {state.player for state in previous_states} assert previous_players == {(2, 1), (1, 2), (3, 2), (2, 3)}
def test_move_into_wall_down(): state = State(*list(level_move_into_walls.values())) for move in move_into_wall_down: state.next_state(move) assert state.player == (1, 4)
def test_push_two_boxes_from_down(): state = State(*list(level_two_boxes.values())) for move in push_two_boxes_from_down: state.next_state(move) assert state.player == (2, 6)
def test_move_into_wall_right(): state = State(*list(level_move_into_walls.values())) for move in move_into_wall_right: state.next_state(move) assert state.player == (2, 1)
def test_move_out_down(): state = State(*list(level_move_out_of_screen.values())) for move in move_out_down: state.next_state(move) assert state.player == (1, 3)
def test_move_out_right(): state = State(*list(level_move_out_of_screen.values())) for move in move_out_right: state.next_state(move) assert state.player == (5, 1)
level_easiest = { 'width': 8, 'height': 8, 'player': (1, 1), 'boxes': [(2, 3)], 'storages': [(2, 6)], 'walls': set([(0, i) for i in range(8)] + [(7, i) for i in range(8)] + [(i, 0) for i in range(8)] + [(i, 7) for i in range(8)]) } start_state = State(*list(level_easiest.values())) print(start_state.__str__()) ForwardSolvers.deep_q_learning(start_state, 1000, 15, (.25, .05), .95) level_easy = { 'width': 8, 'height': 8, 'player': (1, 1), 'boxes': [(2, 2)], 'storages': [(2, 3)], 'walls': set([(0, i) for i in range(8)] + [(7, i) for i in range(8)] + [(i, 0) for i in range(8)] + [(i, 7) for i in range(8)]) }
level_ok = { 'width': 6, 'height': 6, 'player': (1, 1), 'boxes': [(2, 2), (3, 3), (2, 4)], 'storages': [(2, 2), (3, 4), (4, 3)], 'walls': set([(0, i) for i in range(6)] + [(5, i) for i in range(6)] + [(i, 0) for i in range(6)] + [(i, 5) for i in range(6)]) } start_state = State(*list(level_ok.values())) print(start_state) result, move, states_seen = ReverseSolvers.bfs(start_state) print(result, move, states_seen) print('\n|-------|\n') start_state = State(*list(level_ok.values())) print(start_state) result, move, states_seen = ReverseSolvers.a_star(start_state) print(result, move, states_seen) print('\n|-------|\n') level_blah = { 'width': 8,