# -*- coding: utf-8 -*-
"""
Created on Mon Oct 16 12:38:47 2017
@author: drkhan
"""
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 22 20:48:1 2017
@author: zia
"""
# This code demonstrates problem representation
# of the sliding puzzle example
# representing sliding puzzle states as a tuple
start = (1,2,3,4,0,5,6,7,8)
goal = (1,2,3,4,5,6,7,8,0)
# 0 1 2
# 3 4 5
# 6 7 8
#%%
# function to print states in three rows
# to represent a real puzzle state
def printstate(state):
print(state[0:3])
print(state[3:6])
print(state[6:9])
# test whether or not a state is the same as
# the goal state
def goaltest(state, goal):
if state == goal:
return True
else:
return False
# this functions implements the transition model
# given a state and action it returns the resultant
# state
def result(statein,action):
stateout = list(statein) # # make a local copy of statein
if action == 'Up':
idx = statein.index(0)
stateout[idx] = statein[idx-3]
stateout[idx-3] = 0
elif action == 'Down':
idx = statein.index(0)
stateout[idx] = statein[idx+3]
stateout[idx+3] = 0
elif action == 'Left':
idx = statein.index(0)
stateout[idx] = statein[idx-1]
stateout[idx-1] = 0
elif action == 'Right':
idx = statein.index(0)
stateout[idx] = statein[idx+1]
stateout[idx+1] = 0
return tuple(stateout)
# this function returns a list of states that
# can be reached from the given state.
def expand(state):
# an empty list to store possible actions from state
actions = []
# an empty list to store states reachable after applying the actions
successors = []
# find the index of the blank tile i.e. 0 in the puzzle
blank = state.index(0)
if blank in {3,4,5,6,7,8}: # action up is possible if blank tile is on one
of these locations
actions.append('Up') # append up in actions list
if blank in {0,1,2,3,4,5}: # locations from which down action is possible
actions.append('Down')
if blank in {1,2,4,5,7,8}:
actions.append('Left')
if blank in {0,1,3,4,6,7}:
actions.append('Right')
#print(actions)
for action in actions: # iterate over actions
#print(action)
# apply all possible actions one by one and store the resultant
# states in succesors list
successors.append(result(state,action))
return successors
# searching alogrithm
# this part of the code demonstrates breadth first search
# using the previouly coded problem formulation
#def search(start,goal):
if goaltest(start,goal):
# return
print('goal reached')
else:
frontier = []
explored = []
frontier.append(start)
while frontier:
# if len(frontier) >=300:
# break
current = frontier.pop(0)
print('current:',current)
print('frontier',len(frontier))
print('explored',len(explored))
if goaltest(current,goal):
print('gaoal reached')
break
explored.append(current)
children = expand(current)
for child in children:
if child not in frontier and child not in explored:
frontier.append(child)