mirror of
https://github.com/Rushilwiz/AI.git
synced 2025-04-09 22:10:17 -04:00
135 lines
4.0 KiB
Python
135 lines
4.0 KiB
Python
# Name: Rushil Umaretiya
|
|
# Period: 1
|
|
|
|
from tkinter import *
|
|
from graphics import *
|
|
import random
|
|
|
|
def check_complete(assignment, vars, adjs):
|
|
# check if assignment is complete or not. Goal_Test
|
|
for i in vars:
|
|
if i not in assignment: return False
|
|
|
|
for assigned in assignment:
|
|
if assigned in adjs:
|
|
for adj in adjs[assigned]:
|
|
if assignment[assigned] == assignment[adj]: return False
|
|
|
|
return True
|
|
|
|
def select_unassigned_var(assignment, vars, adjs):
|
|
# Select an unassigned variable - forward checking, MRV, or LCV
|
|
var, low = '', 999999
|
|
for i in vars:
|
|
if len(vars[i]) < low and len(vars[i]) > 0:
|
|
var = i
|
|
low = len(vars[i])
|
|
|
|
|
|
return var if var != '' else None
|
|
|
|
|
|
def isValid(value, var, assignment, vars, adjs):
|
|
# value is consistent with assignment
|
|
# check adjacents to check 'var' is working or not.
|
|
|
|
if var not in adjs: return True
|
|
|
|
for adj in adjs[var]:
|
|
if adj in assignment and value in assignment[adj]: return False
|
|
|
|
return True
|
|
|
|
def backtracking_search(variables, adjs, shapes, frame):
|
|
return recursive_backtracking({}, variables, adjs, shapes, frame)
|
|
|
|
def recursive_backtracking(assignment, vars, adjs, shapes, frame):
|
|
# Refer the pseudo code given in class.
|
|
if check_complete(assignment, vars, adjs):
|
|
draw_final_shapes(assignment, shapes, frame)
|
|
return assignment
|
|
|
|
var = select_unassigned_var(assignment, vars, adjs)
|
|
|
|
for value in vars[var]:
|
|
if isValid(value, var, assignment, vars, adjs):
|
|
assignment[var] = value
|
|
new_vars = dict(vars)
|
|
new_vars[var] = {}
|
|
if var in adjs:
|
|
for i in adjs[var]:
|
|
if value in new_vars[i]: new_vars[i].remove(value)
|
|
result = recursive_backtracking(assignment, new_vars, adjs, shapes, frame)
|
|
if result != None: return result
|
|
assignment.pop(var)
|
|
|
|
return None
|
|
|
|
|
|
def draw_final_shapes(assignment, shapes, frame):
|
|
for node in assignment:
|
|
draw_shape(shapes[node], frame, assignment[node])
|
|
|
|
|
|
# return shapes as {region:[points], ...} form
|
|
def read_shape(filename):
|
|
infile = open(filename)
|
|
region, points, shapes = "", [], {}
|
|
for line in infile.readlines():
|
|
line = line.strip()
|
|
if line.isalpha():
|
|
if region != "": shapes[region] = points
|
|
region, points = line, []
|
|
else:
|
|
x, y = line.split(" ")
|
|
points.append(Point(int(x), 300-int(y)))
|
|
shapes[region] = points
|
|
return shapes
|
|
|
|
# fill the shape
|
|
def draw_shape(points, frame, color):
|
|
shape = Polygon(points)
|
|
shape.setFill(color)
|
|
shape.setOutline("black")
|
|
shape.draw(frame)
|
|
space = [x for x in range(9999999)] # give some pause
|
|
|
|
def main():
|
|
regions, vars, adjacents = [], {}, {}
|
|
# Read mcNodes.txt and store all regions in regions list
|
|
for line in open('mcNodes.txt', 'r'): regions.append(line.strip())
|
|
|
|
|
|
# Fill variables by using regions list -- no additional code for this part
|
|
for r in regions: vars[r] = {'red', 'green', 'blue'}
|
|
|
|
# Read mcEdges.txt and fill the adjacents. Edges are bi-directional.
|
|
for line in open('mcEdges.txt', 'r'):
|
|
line = line.strip().split()
|
|
if line[0] not in adjacents: adjacents[line[0]] = [line[1]]
|
|
else: adjacents[line[0]].append(line[1])
|
|
|
|
if line[1] not in adjacents: adjacents[line[1]] = [line[0]]
|
|
else: adjacents[line[1]].append(line[0])
|
|
|
|
|
|
# Set graphics -- no additional code for this part
|
|
frame = GraphWin('Map', 300, 300)
|
|
frame.setCoords(0, 0, 299, 299)
|
|
shapes = read_shape("mcPoints.txt")
|
|
for s, points in shapes.items():
|
|
draw_shape(points, frame, 'white')
|
|
|
|
# solve the map coloring problem by using backtracking_search -- no additional code for this part
|
|
solution = backtracking_search(vars, adjacents, shapes, frame)
|
|
print (solution)
|
|
|
|
mainloop()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
''' Sample output:
|
|
{'WA': 'red', 'NT': 'green', 'SA': 'blue', 'Q': 'red', 'NSW': 'green', 'V': 'red', 'T': 'red'}
|
|
By using graphics functions, visualize the map.
|
|
''' |