Example #1
0
void MatchingSolver::createTeamConstraints()
{
	// Ensure that teams are matched together.
	// The team members seat group indices are the same.
	m_teamVars.clear();
	for (int i = 0; i < m_teams.size(); ++i) {
		int beginnersInTeam = 0;
		if (m_teams[i]->getSpeakers()->size() > 0) {
			IntVar *teamSeatGroupValue = m_solver.MakeIntVar(0, m_currentSeatGroupIndex - 1, "team");
			Team* team = m_teams[i];
			const QList<SpeakerModel*> *speakers = team->getSpeakers();
			for (int j = 0; j < speakers->size(); ++j) {
				if (speakers->at(j)->isBeginner())
					beginnersInTeam++;
				int speakerId = m_speakers.indexOf(speakers->at(j));
				Constraint *c = m_solver.MakeElementEquality(m_speakerToGroupMapping,
										m_speakerVars[speakerId], teamSeatGroupValue);
				m_solver.AddConstraint(c);
			}
			m_teamVars.push_back(teamSeatGroupValue);
		}
		m_beginnersInTeam.push_back(beginnersInTeam);
	}
}