Димитрина Златкова, 61610
Извличане на знания от данни, 2015
SAT = Boolean satisfiability problem = задача за удовлетворяване на булеви ограничения
променливи
ограничения
(клаузи)
= True
?
Lesson
Mon..Fri
1..7
A..F
Maths
English
History
Sport
...
Mon, 1, Group A, Maths
Mon, 1, Group A, English
Mon, 1, Group B, Maths
Mon, 1, Group B, English
Mon, 2, Group A, Maths
Tue, 1, Group A, Maths
...
5 x
7 x
6 x
13
2730
Един учител води най-много един учебен час в даден времеви интервал.
Една група от ученици присъства в най-много един учебен час в даден времеви интервал.
Всяка група от ученици има занятия по даден предмет толкова пъти през седмицата, колкото е предвидено в програмата ѝ.
Даден учител иска да води занятия само през сутрешните/обедните часове.
Даден учител иска да води всичките си занятия в конкретен ден/дни от седмицата.
Даден учител не иска да води повече от N занятия на ден.
1. Избира променлива и я определя като True/False.
2. Разпространява булевото ограничение.
Строи граф на импликациите.
3. При намерен конфликт добавя клауза за него.
4. Връща се до подходящо ниво на решение (non-chronological backtracking).
Lesson
String
for (Day day : Day.values()) {
for (int number = 1; number <= lessonsADay; number++) {
for (Subject subject : Subject.values()) {
Lesson[] groups = lessonCombinations
.stream()
.filter(l ->
l.getDay().equals(day)
&& l.getNumber() == number
&& l.getSubject().equals(subject))
.toArray(Lesson[]::new);
helper.atMost(
"One teacher teaches to maximum 1 group at a given time.", 1,
groups);
}
}
}
Lesson[] lessons = lessonCombinations
.stream()
.filter(l ->
(l.getNumber() < 4 || l.getDay().equals(Day.Mon))
&& l.getSubject().equals(Subject.Physics))
.toArray(Lesson[]::new);
for (Lesson lesson : lessons) {
helper.setFalse(lesson,
"Physics teacher doesn't have morning classes
and doesn't have classes on Monday.");
}