-
Notifications
You must be signed in to change notification settings - Fork 0
/
course_planner_csp.py
111 lines (98 loc) · 3.05 KB
/
course_planner_csp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from cspbase import *
from course_database import *
course_vars = []
def course_planner_csp(courses, summer, years, times, in_dat):
'''
'''
cdat = in_dat.copy()
# Create variables for each course and add it to the CSP
for course in courses:
dom = cdat[course][2]
if len(dom) == 0:
return None
course_vars.append(Variable(course, dom))
course_planner_csp = CSP("course-planner", course_vars)
# Add constraint for # of course per semester
cons = Constraint("5 Courses per Semester", course_vars)
cons.change_func(1)
course_planner_csp.add_constraint(cons)
# Add constraint for time conlflicts
cons = Constraint("No time conflict", course_vars)
cons.change_func(2)
course_planner_csp.add_constraint(cons)
# Add constraints for the total number of years
for var in course_vars:
cons = Constraint("Max Years in School", [var])
dom = cdat[var.name][2]
valid_vals = []
for element in dom:
if element[0][0] <= years * 3:
valid_vals.append((element,))
cons.add_satisfying_tuples(valid_vals)
course_planner_csp.add_constraint(cons)
# Add constraints if no summer courses allowed
if not summer:
for var in course_vars:
cons = Constraint("No Summer", [var])
dom = cdat[var.name][2]
valid_vals = []
for element in dom:
if element[0][0] % 3 != 0:
valid_vals.append((element,))
cons.add_satisfying_tuples(valid_vals)
course_planner_csp.add_constraint(cons)
# Add constraints for prereqs, co-reqs
for course in courses:
prereqs = cdat[course][0]
coreqs = cdat[course][1]
dom = cdat[course][2]
c_var = find_var(course)
if len(prereqs) > 0:
for prereq in prereqs:
if not prereq in courses:
print("You need to take " + prereq + " in order to take " + course)
exit()
p_var = find_var(prereq)
cons = Constraint("PreReq", [c_var, p_var])
######
valid_vals = []
for element in dom:
for section in cdat[prereq][2]:
if element[0][0] > section[0][0]:
valid_vals.append((element, section))
cons.add_satisfying_tuples(valid_vals)
######
course_planner_csp.add_constraint(cons)
if len(coreqs) > 0:
for coreq in coreqs:
if not coreq in courses:
print("You need to take " + coreq + " with " + course)
exit()
co_var = find_var(coreq)
cons = Constraint("CoReq", [c_var, co_var])
######
valid_vals = []
for element in dom:
for section in cdat[coreq][2]:
if element[0][0] == section[0][0]:
valid_vals.append((element, section))
cons.add_satisfying_tuples(valid_vals)
######
course_planner_csp.add_constraint(cons)
# Add time constraints
for time in times:
for var in course_vars:
cons = Constraint("Custom", [var])
dom = cdat[var.name][2]
valid_vals = []
for element in dom:
if element[0][1] != time[0] or element[0][2] != time[1]:
valid_vals.append((element,))
cons.add_satisfying_tuples(valid_vals)
course_planner_csp.add_constraint(cons)
return course_planner_csp, course_vars
def find_var(course):
for var in course_vars:
if var.name == course:
return var
return -1