Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
25 views7 pages

Ai Lab9

Artificial Intelligence Lab Manual

Uploaded by

ali shaham
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
25 views7 pages

Ai Lab9

Artificial Intelligence Lab Manual

Uploaded by

ali shaham
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 7

LAB 9

ARTIFICIAL INTELLIGENCE
QUESTION NO 1

Answer

OPEN ENDED LAB

The 8-puzzle problem is a puzzle invented and popularized by Noyes


Palmer Chapman in the 1870s. It is played on a 3-by-3 grid with 8 square
blocks labeled 1 through 8 and a blank square. Our goal is to rearrange
the blocks so that they are in order. We are permitted to slide blocks
horizontally or vertically into the blank square.

Example

The following shows a sequence of legal moves from an initial board


position (left) to the goal position (right).

13 13 123 123 123 425 =>425 =>4 5 =>45 => 456 786 786 786 786 78

initial goal

Question No 2

Source Code

class Node:
def __init__(self,data,level,fval):

""" Initialize the node with the data, level of the node and the calculated
fvalue """ self.data = data
self.level = level
self.fval = fval

def generate_child(self):
""" Generate child nodes from the given node by moving the blank space
either in the four directions {up,down,left,right} """
x,y = self.find(self.data,'_')
""" val_list contains position values for moving the blank space in either of
the 4 directions [up,down,left,right] respectively. """
val_list = [[x,y-1],[x,y+1],[x-1,y],[x+1,y]]
children = []
for i in val_list:
child = self.shuffle(self.data,x,y,i[0],i[1])
if child is not None:
child_node = Node(child,self.level+1,0)
children.append(child_node)
return children
def shuffle(self,puz,x1,y1,x2,y2):
""" Move the blank space in the given direction and if the position value
are out of limits the return None """
if x2 >= 0 and x2 < len(self.data) and y2 >= 0 and y2 < len(self.data):
temp_puz = []
temp_puz = self.copy(puz)
temp = temp_puz[x2][y2]
temp_puz[x2][y2] = temp_puz[x1][y1]
temp_puz[x1][y1] = temp

return temp_puz else:


return None

def copy(self,root):
""" Copy function to create a similar matrix of the given node""" temp = []
for i in root:
t = []
for j in i:
t.append(j)
temp.append(t)
return temp
def find(self,puz,x):
""" Specifically used to find the position of the blank space """ for i in
range(0,len(self.data)):
for j in range(0,len(self.data)):
if puz[i][j] == x:
return i,j

class Puzzle:
def __init__(self,size):
""" Initialize the puzzle size by the specified size,open and closed lists to
empty """ self.n = size
self.open = []
self.closed = []

def accept(self):
""" Accepts the puzzle from the user """ puz = []
for i in range(0,self.n):
temp = input().split(" ") puz.append(temp)
return puz

def f(self,start,goal):
""" Heuristic Function to calculate hueristic value f(x) = h(x) + g(x) """
return self.h(start.data,goal)+start.level

def h(self,start,goal):
""" Calculates the different between the given puzzles """ temp = 0
for i in range(0,self.n):
for j in range(0,self.n):
if start[i][j] != goal[i][j] and start[i][j] != '_':
temp += 1
return temp

def process(self):
""" Accept Start and Goal Puzzle state""" print("Enter the start state
matrix \n") start = self.accept()

print("Enter the goal state matrix \n") goal = self.accept()

start = Node(start,0,0)

start.fval = self.f(start,goal)

""" Put the start node in the open list"""

self.open.append(start)

print("\n\n")

while True:

cur = self.open[0]

print("")

print(" | ")

print(" | ")

print(" Error! Hyperlink reference not valid. \n")

for i in cur.data:

for j in i:

print(j,end=" ")

print("")

""" If the difference between current and goal node is 0 we have reached
the goal node"""

if(self.h(cur.data,goal) == 0): break


for i in cur.generate_child(): i.fval = self.f(i,goal) self.open.append(i)
self.closed.append(cur)
del self.open[0]

""" sort the opne list based on f value """ self.open.sort(key = lambda
x:x.fval,reverse=False)

puz = Puzzle(3) puz.process()

Output
References

1. https://www.cs.princeton.edu/courses/archive/spr10/cos226/assignments/8
puzzle.html

2. https://blog.goodaudience.com/solving-8-puzzle-using-a-algorithm-
7b509c331288

You might also like