Ai Manual
Ai Manual
LAB MANUAL
AIM
ALGORITHM
1. The code starts by creating a Solution class and then defining the method solve.
2. The function takes in a board as an argument, which is a list of tuples representing the positions on the
board.
3. It iterates through each position in the list and creates a dictionary with that position's value set to 0.
4. Then it iterates through all possible moves for that position and returns their number of occurrences in dict.
5. After this, it loops over all nodes on the board until it finds one where there are no more moves left to
make (i.e., when len(current_nodes) == 0).
6. This node will be returned as -1 if found or else its index will be stored into pos_0 so that we can find out
what move was made at that point later on.
7. The next step is finding out what move was made at every node by looping over all possible moves for
each node using self's find_next function, which takes in a single node as an argument and returns any
other nodes connected to it via path-finding algorithms like DFS or BFS (see below).
8. For example, if pos_0 = 1 then self would call: moves = { 0: [1], 1:
9. The code will print the number of paths in a solution.
PROGRAM
class Solution:
defsolve(self, board):
dict = {} flatten = []
for i in range(len(board)):
flatten += board[i] flatten = tuple(flatten) dict[flatten] = 0
if flatten == (0, 1, 2, 3, 4, 5, 6, 7, 8):
return 0
return self.get_paths(dict) defget_paths(self, dict):
cnt = 0 while True:
current_nodes = [x for x in dict if dict[x] == cnt] if len(current_nodes) == 0:
return -1
deffind_next(self, node):
moves = {
0: [1, 3],
1: [0, 2, 4],
2: [1, 5],
3: [0, 4, 6],
4: [1, 3, 5, 7],
5: [2, 4, 8],
6: [3, 7],
7: [4, 6, 8],
8: [5, 7],
}
results = []
pos_0 = node.index(0)
for move in moves[pos_0]:
new_node = list(node)
new_node[move], new_node[pos_0] = new_node[pos_0], new_node[move] results.append(tuple(new_node))
return results
ob = Solution() matrix = [
[3, 1, 2],
[4, 7, 5],
[6, 8, 0]
]
print("NO OF MOVES==",ob.solve(matrix))
OUTPUT
NO OF MOVES== 4
RESULT:
Thus the program to implement 8 puzzles search strategy is implemented and executed successfully.
EX.No. 2 Implement basic search strategies – 8-Queens Problem DATE:
AIM
ALGORITHM
PROGRAM
defN_queens(n):
if n==0:
return True for i in range(0,N):
for j in range(0,N):
if (not(attack(i,j))) and (board[i][j]!=1): board[i][j] = 1
if N_queens(n-1)==True:
return True board[i][j] = 0
RESULT
Thus the program to implement 8 queens search strategy is implemented and executed successfully.
EX.No.3 Implement basic search strategies – Crypt arithmetic DATE:
AIM
To implement basic search strategies – Crypt arithmetic.
ALGORITHM
32. Then, the code creates a list called solutions and iterates through each solution in order to print out its
contents.
33. The first line says "CRYPTARITHMETIC PUZZLE SOLVER".
34. This is just an example of what you might see on your screen after running this program.
35. The code will print 0 Solutions!
36. If the input is not a word or number.
37. The code above will then iterate through the list of solutions and print them out.
PROGRAM
OUTPUT
RESULT
Thus the program to implement crypt arithmetic search strategy is implemented and executed successfully
EX.No. 4 Implement A* Algorithm DATE:
ALGORITHM
PROGRAM
defGetDistance(self): pass
defCreateChildren(self):
pass
# Creating subclass
class State_String(State):
definit (self, value, parent, start = 0, goal = 0 ): super(State_String, self). init (value, parent, start, goal) self.dist =
self.GetDistance()
defGetDistance(self):
if self.value == self.goal: return 0
dist = 0
for i in range(len(self.goal)): letter = self.goal[i]
dist += abs(i - self.value.index(letter)) return dist
defCreateChildren(self):
if not self.children:
for i in range(len(self.goal)-1): val = self.value
val = val[:i] + val[i+1] + val[i] + val[i+2:] child = State_String(val, self) self.children.append(child)
# Creating a class that hold the final magic class A_Star_Solver:
definit (self, start, goal):
if not self.path:
print("Goal Of is not possible !" + self.goal ) return self.path
OUTPUT
RESULT
AIM
ALGORITHM
PROGRAM
else:
best = MAX
# Recur for left and # right children
for i in range(0, 2):
val = minimax(depth + 1, nodeIndex * 2 + i,True, values, alpha, beta) best = min(best, val)
beta = min(beta, best) # Alpha Beta Pruning if beta <= alpha:
break
return best
# Driver Code
if name == " main ":
values = [3, 5, 6, 9, 1, 2, 0, -1]
print("The optimal value is :", minimax(0, 0, True, values, MIN, MAX))
OUTPUT
The optimal value is : 5
RESULT
Thus the program to implement Minimax algorithm for game playing is implemented and executed successfully
EX.No.6 Solve constraint satisfaction problems DATE:
AIM
ALGORITHM
PROGRAM
VARIABLES = ["csc", "maths", "phy", "che", "tam", "eng", "bio"] DOMAIN = ["Monday", "Tuesday",
"Wednesday"] CONSTRAINTS = [
("csc", "maths"),
("csc", "phy"),
("mat", "phy"),
("mat", "che"),
("mat", "tam"),
("phy", "tam"),
("phy", "eng"),
("che", "eng"),
("tam", "eng"),
("tam", "bio"),
("eng", "bio")
]
def backtrack(assignment):
#"""Runs backtracking search to find an assignment.""" # Check if assignment is complete
if len(assignment) == len(VARIABLES): return assignment
var = select_unassigned_variable(assignment) for value in DOMAIN:
if consistent(var, value, assignment): assignment[var] = value
result = backtrack(assignment) if result is not None:
return result
return None
defselect_unassigned_variable(assignment):
# """Chooses a variable not yet assigned, in order.""" for var in VARIABLES:
if var not in assignment.keys(): return var
solution = backtrack(dict())
print(solution)
OUTPUT
{'csc': 'Monday', 'maths': 'Tuesday', 'phy': 'Tuesday', 'che': 'Monday', 'tam': 'MoMonday', 'eng': 'Wednesday', 'bio':
'Tuesday'}
RESULT
Thus the program to solve constraint satisfaction problem is implemented and executed successfully.
EX.No. 7 Propositional Model Checking Algorithms DATE:
AIM
To Implement Propositional Model checking Algorithm.
ALGORITHM
1. Class Literal, it has attributes name and sign to denote whether the literal is positive or negative in use.
2. The neg function returns a new literal with the same name but the opposite sign of its parent literal.
3. The repr function returns the string of the literal name,( or the string with a negative sign) each time
the instance of the literal is called.
4. The CNFConvert function converts the KiB from a list of sets to a list of list for easier computing
5. The VariableSet function finds all the used literals in the KB, and in order to assist with running the
DPLL.
6. The Negativeofx function is for holding the negative form of the literal, for use in the DPLL algorithm
7. The pickX function picks a literal from the variable set and works with it as a node in the tree.
8. Now define the functions splitfalseliterals() and splitTrueLiteral().
9. Create the function dpll() that performs the dpll algorithm recursively.
10. Finally call the function to execute the code.
PROGRAM
defVariableSet(KB):
# This function finds all the used literals in the KB, and in order to assist with running the DPLL
KB=eval((CNFconvert(KB). str ()))
storage=[]
for obj in KB:
for item in obj:
if item[0] == '-' and item[1:] not in storage: storage.append(str(item[1:]))
elif item not in storage and item[0] != '-': storage.append(str(item))
return storage
defNegativeofx(x):
# This function is for holding the negative form of the literal, for use in the DPLL algorithm check=re.match("-",
str(x))
if (check):
return str(x[1:])
else:
return "-"+str(x)
defpickX(literals, varList):
# This function picks a literal from the variable set and works with it as a node in the tree for x in varList:
if x not in literals:
break
return x
return holder
defunitResolution(clauses):
literalholder={} # dictionary for holding the literal holder and their bool
i=0
# This part of the code goes through each and every clause until the all literals in the KB are resolved while
i<len(clauses): # for each clause
newClauses=[] clause=clauses[i]
# picks a clause to work on if (len(clause) == 1):
literal=str(clause[0]) pattern=re.match("-", literal) # Populates the dictionary
if (pattern):
nx=literal[1:] literalholder[nx]=False
else:
nx="-"+literal literalholder[literal]=True
# Checks for all other appearances o the literal or its opposite int he KB for item in clauses:
if item != clauses[i]:
if (nx in item):
item.remove(nx) newClauses.append(item)
i=0 clauses=newClauses # no unit clause else:
i += 1
return literalholder, clauses
defdpll(clauses, varList):
# recursively performs the dpll algorithm literals, cnf=unitResolution(clauses) if (cnf == []):
return literals elif ([] in cnf):
return "notsatisfiable"
else:
# pick a literal which isn't set yet but has an impact on the Kb, and then work on it recursively while True:
x=pickX(literals, varList) x=str(x)
def DPLL(KB):
# Finally restructures the output to fit the required output by the assignment description
KB=eval((CNFconvert(KB). str ()))
varList=VariableSet(KB) result=dpll(KB, varList)
if result == 'notsatisfiable':
False
else:
for i in varList:
if i in result and result[i] == True: result[i]='true'
elifi in result and result[i] == False: result[i]='false'
else:
result[i]='free'
return [True, result] A=Literal('A') B=Literal('B') C=Literal('C') D=Literal('D')
KB=[{A, B}, {A, -C}, {-A, B, D}]
print(DPLL(KB))
OUTPUT
RESULT
Thus the program to implement Propositional Model checking Algorithm is implemented and executed
successfully.
EX.No. 8 Implement Forward Chaining Algorithm DATE:
AIM
ALGORITHM
PROGRAM
database = ["Croaks", "Eat Flies", "Shrimps", "Sings"] knowbase = ["Frog", "Canary", "Green", "Yellow"]
defdisplay():
print("\n X is \n1..Croaks \n2.Eat Flies \n3.shrimps \n4.Sings ", end='') print("\n Select One ", end='')
defmain():
print("*-----Forward--Chaining *", end='')
display()
x = int(input()) print(" \n", end='') if x == 1 or x == 2:
print(" Chance Of Frog ", end='') elif x == 3 or x == 4:
print(" Chance of Canary ", end='')
else:
print("\n-------In Valid Option Select ", end='')
if x >= 1 and x <= 4:
print("\n X is ", end='')
print(database[x-1], end='')
print("\n Color Is 1.Green 2.Yellow", end='') print("\n Select Option ", end='')
k = int(input())
if k == 1 and (x == 1 or x == 2): # frog0 and green1 print(" yes it is ", end='') print(knowbase[0], end='')
print(" And Color Is ", end='') print(knowbase[2], end='')
elif k == 2 and (x == 3 or x == 4): # canary1 and yellow3 print(" yes it is ", end='')
print(knowbase[1], end='') print(" And Color Is ", end='') print(knowbase[3], end='')
else:
print("\n---InValid Knowledge Database", end='')
*-----Forward--Chaining *
X is 1.Croaks
2.Eat Flies 3.shrimps 4.Sings Select One 1
Chance Of Frog X is Croaks Color Is 1.Green 2.Yellow
Select Option 1
yes it is Frog And Color Is Green
RESULT
Thus the program to implement Forward Chaining Algorithm is implemented and executed successful
EX.No. 9 Implement backward Chaining Algorithm DATE:
AIM
ALGORITHM
1. The code starts with a function called display () which prints out the text "X is 1.frog 2.canary"
2. And then asks for input from the user, asking them to select one of two options: Chance of eating flies or
Chance of shrimping.
3. If they choose either option, it will print out what that option would be in green or yellow color
respectively.
4. The next line is x = int (input ()) which takes the value entered by the user and assigns it to variable x.
5. The if statement checks whether x equals 1 or 2
6. So if they enter 1 as their answer, it will print out "Chance of eating flies"
7. Otherwise it will print "Chance of shrimping".
PROGRAM
defdisplay():
print("\n X is \n1.frog \n2.canary ", end='') print("\n Select One ", end='')
defmain():
print("*-----Backward--Chaining *", end='')
display()
x = int(input()) print(" \n", end='') if x == 1:
print(" Chance Of eating flies ", end='') elif x == 2:
print(" Chance of shrimping ", end='')
else:
print("\n-------In Valid Option Select ", end='')
if x >= 1 and x <= 2:
print("\n X is ", end='') print(knowbase[x-1], end='') print("\n1.green \n2.yellow") k = int(input())
if k == 1 and x == 1: # frog0 and green1 print(" yes it is in ", end='')
print(color[0], end='')
print(" colour and will ", end='') print(database[0])
elif k == 2 and x == 2: # canary1 and yellow3 print(" yes it is in", end='') print(color[1], end='')
print(" Colour and will ", end='') print(database[1])
else:
print("\n---InValid Knowledge Database", end='')
*-----Backward--Chaining *
X is 1.frog 2.canary
Select One 1
Chance Of eating flies X is Frog
1. green 2.yellow 1
yes it is in Green colour and will Croak
RESULT
Thus the program to implement backward chaining algorithm is implemented and executed successfully.
EX.No. 10 Implement Naïve Bayes Models DATE:
AIM
ALGORITHM
PROGRAM
OUTPUT
[0 2 1 1 0 0 2 2 1 2 1 0 1 2 0 2 2 0 2 1 1 2 2 0 1 0 0 2 2 0 0 2 0 1 1 1 1
1 2 1 1 0 0 2 1 0 1 0 2 2]
[0 2 1 1 0 0 2 2 1 2 1 0 1 2 0 2 2 0 2 1 1 2 2 0 1 0 0 2 2 0 0 2 0 1 1 1 1
1 2 1 1 0 0 2 1 0 1 0 2 2]
accuracyScore is 1.0
confusion matrix [[16 0 0]
[ 0 17 0]
[ 0 0 17]]
RESULT
Thus the program to implement Naïve Bayes Model is implemented and executed successfully.
EX.No. 11 Implement Bayesian Networks and perform inferences DATE:
ALGORITHM:
1. The code starts by importing the datasets module.
2. This is used to load the iris dataset from sklearn, which is then passed into a variable called data.
3. The target and data_tensorare then created with torch's numpy library.
4. The code continues by creating an instance of a sequential model that has three layers:
bnn.BayesLinear(prior_mu=0, prior_sigma=0.1, in_features=4), nn.ReLU(), and
bnn.BayesLinear(prior_mu=0, prior_sigma=0.1, in_features=100).
5. The cross entropy loss function is then created as well as an instance of it being assigned to the cross
entropy loss variable named crossEntropyLoss().
6. The code will create a model that takes in 100 features and outputs 3.
7. The code starts by importing the necessary libraries.
8. Then it creates a model that will be used to predict the target variable, which is the number of people who
are likely to buy a product in one month.
9. The code then calculates how much money it would cost for this prediction and compares it with what's
actually spent on advertising.
10. The code starts by creating an optimizer object that uses Adam as its learning algorithm and has a
parameter of 0.01 for its learning rate.
11. It then loops through 3000 steps, each step taking about 1 second, where models are created from
data_tensor using torch's max function and predicted is calculated using torch's max function on models'
data tensor (which is just another way of saying "the most recent value").
12. Cross entropy loss is calculated between predictions and targets using cross_entropy_loss
13. Finally, kloss , which stands for Kullback-Leibler divergence, is calculated with klloss .
14. This loss measures how different two probability distributions are from each other; in this case we're
measuring how different our predictions are from their actual values (i.e., whether they were correct).
15. Total cost is then calculated by adding cross entropy plus klweight*kl .
16. Finally, optim
17. The code is used to predict the output of a model given input data.
18. The code starts by initializing the variables that will be needed for later calculations.
19. Next, it calculates the cross entropy loss between target and predicted values.
20. Then, it calculates the cost function which is then minimized using Adam optimizer.
21. Finally, it prints out the predicted value and total cost after every iteration of optimization process.
22. The code starts by defining a function called draw_graph that takes in a predicted value.
23. The code then creates two subplots on the same figure, one for each of the predictions.
24. The first subplot is created with fig_1 and has an index of 1, which means it's the second plot in this figure.
25. This plot will have two axes: x-axis and y-axis.
26. The x-axis represents time, while the y-axis represents accuracy percentage (0% to 100%).
27. The second subplot is created with fig_2 and has an index of 2, which means it's the third plot in this
figure.
28. This plot will also have two axes: x-axis and y-axis but they represent different values than those on fig_1 .
29. The code is a function that takes in an input of predicted and returns the accuracy, cross entropy, and KL
values.
30. The first line of code calculates the size of the tensor using target_tensor.size(0) which will be equal to 1
because it is a one-dimensional tensor.
31. Next, we have the function draw_graph which draws a graph with two subplots; one for accuracy and one
for cross entropy.
32. The last line prints out some statistics on how accurate this prediction was.
PROGRAM
import numpy as np
from sklearn import datasets import torch
import torch.nn as nn import torch.optim as optim import torchbnn as bnn
import matplotlib.pyplot as plt dataset = datasets.load_iris() data = dataset.data
target = dataset.target
data_tensor = torch.from_numpy(data).float() target_tensor = torch.from_numpy(target).long()
model = nn.Sequential(bnn.BayesLinear(prior_mu=0, prior_sigma=0.1, in_features=4, out_features=100),
nn.ReLU(), bnn.BayesLinear(prior_mu=0, prior_sigma=0.1, in_features=100, out_features=3), )
cross_entropy_loss = nn.CrossEntropyLoss()
defdraw_graph(predicted):
fig = plt.figure(figsize=(16, 8)) fig_1 = fig.add_subplot(1, 2, 1)
fig_2 = fig.add_subplot(1, 2, 2)
z1_plot = fig_1.scatter(data[:, 0], data[:, 1], c=target, marker='v') z2_plot = fig_2.scatter(data[:, 0], data[:, 1],
c=predicted) plt.colorbar(z1_plot, ax=fig_1)
plt.colorbar(z2_plot, ax=fig_2) fig_1.set_title("REAL") fig_2.set_title("PREDICT") plt.show()
models = model(data_tensor)
_, predicted = torch.max(models.data, 1) draw_graph(predicted)
OUTPUT
RESULT
Thus, the program to implement Bayesian Networks and perform inferences is implemented and executed
successfully.