added STAYS_IN_SYNC relation between 2 intervals

This commit is contained in:
lperron@google.com
2011-08-11 01:17:17 +00:00
parent 69cf04d4b4
commit 44a341f063
4 changed files with 22 additions and 6 deletions

View File

@@ -402,7 +402,8 @@ class Solver {
STARTS_AFTER_END,
STARTS_AFTER_START,
STARTS_AT_END,
STARTS_AT_START
STARTS_AT_START,
STAYS_IN_SYNC
};
enum UnaryIntervalRelation {

View File

@@ -808,6 +808,12 @@ namespace operations_research {
operations_research::Solver::STARTS_AT_START,
other);
}
Constraint* StaysInSync(IntervalVar* other) {
return self->solver()->MakeIntervalVarRelation(self,
operations_research::Solver::STAYS_IN_SYNC,
other);
}
}
%extend Sequence {

View File

@@ -41,7 +41,8 @@ const char* kBinaryNames[] = {
"STARTS_AFTER_END",
"STARTS_AFTER_START",
"STARTS_AT_END",
"STARTS_AT_START"
"STARTS_AT_START",
"STAYS_IN_SYNC"
};
} // namespace
@@ -238,6 +239,16 @@ void IntervalBinaryRelation::InitialPropagate() {
t2_->SetStartRange(t1_->StartMin(), t1_->StartMax());
}
break;
case Solver::STAYS_IN_SYNC:
if (t2_->MustBePerformed() && t1_->MayBePerformed()) {
t1_->SetStartRange(t2_->StartMin(), t2_->StartMax());
t1_->SetEndRange(t2_->EndMin(), t2_->EndMax());
}
if (t1_->MustBePerformed() && t2_->MayBePerformed()) {
t2_->SetStartRange(t1_->StartMin(), t1_->StartMax());
t2_->SetEndRange(t1_->EndMin(), t1_->EndMax());
}
break;
}
}

View File

@@ -146,12 +146,10 @@ def main(unused_argv):
# All copies are in sync with the original meeting.
for p in all_people:
solver.Add(meeting.StartsAtStart(people_meeting_copies[p]))
solver.Add(meeting.EndsAtEnd(people_meeting_copies[p]))
solver.Add(meeting.StaysInSync(people_meeting_copies[p]))
for r in all_rooms:
solver.Add(meeting.StartsAtStart(room_meeting_copies[r]))
solver.Add(meeting.EndsAtEnd(room_meeting_copies[r]))
solver.Add(meeting.StaysInSync(room_meeting_copies[r]))
# Synchronize persons_presence and meetings.
for p in all_people: