maxCoursesPerHalfYear = 5; maxCourseSize = 28; minCourseSize = 22; optCourseSize = 24; coursesPerStudent = 4; assignedHalfYear = attribute(Integer, 'Assigned Half Year' ); assignedSport = attribute(String , 'Assigned Sport' ); assignedSportType = attribute(String , 'Assigned Sport Type'); chosenSport = attribute(String , 'Chosen Sport' ); chosenSportType = attribute(String , 'Chosen Sport Type' ); isSecondaryChoice = attribute(Integer, 'Is Secondary Choice'); isSportGraduate = attribute(Integer, 'Is Sport Graduate' ); student = attribute(String , 'Student' ); studentChoices = table('Student Choices', student, isSportGraduate, chosenSport, chosenSportType, isSecondaryChoice); availableCourses = table('Available Courses', assignedSport, assignedSportType); availableHalfYears = table('Available Half Years', assignedHalfYear); courseAssignment = solution('Assignment of Students to Courses', studentChoices, availableCourses); courseAssignment . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(student) . then(hasSize(coursesPerStudent)); courseAssignment . forEach(not(equals(assignedSport, 'Dummy Course'))) . then (equals(chosenSportType, assignedSportType)); courseAssignment . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(equals(assignedSportType, 'Team Sport')) . then(hasMinimumSize(1)); courseAssignment . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(equals(assignedSportType, 'Individual Sport')) . then(hasMinimumSize(1)); courseAssignment . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(assignedSport) . then(hasSize(1)); courseAssignment . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(student) . forEach(not(equals(chosenSport, assignedSport))) . then(hasSize(0)); courseScheduling = solution('Course Scheduling', courseAssignment, availableHalfYears); courseScheduling . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(student, assignedHalfYear) . then(hasSize(1)); courseScheduling . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(assignedSport, assignedHalfYear) . then(hasMinimumSize(minCourseSize)); courseScheduling . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(assignedSport, assignedHalfYear) . then(hasSize(optCourseSize)); courseScheduling . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(assignedSport, assignedHalfYear) . then(hasMaximumSize(maxCourseSize)); courseScheduling . forEach(not(equals(assignedSport, 'Dummy Course'))) . forEach(assignedHalfYear) . then(uniqueValueCountIsAtMost(maxCoursesPerHalfYear, assignedSport));