00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <cassert>
00022 #include <vector>
00023 #include <set>
00024 #include <algorithm>
00025
00026 #include "conflicts.h"
00027
00028 using namespace Udine;
00029
00030 void Graph::generateConflictGraph(Instance &instance) {
00031 vs.clear();
00032 es.clear();
00033 cliques.clear();
00034
00035 int i;
00036 Vertex fresh;
00037 for (i = 0; i < instance.getCourseCount(); i++)
00038 vs.push_back(fresh);
00039 for (i = 0; i != instance.getCurriculumCount(); i++) {
00040 CourseIds::const_iterator it1 = instance.getCurriculum(i).courseIds.begin();
00041 for (; it1 != instance.getCurriculum(i).courseIds.end(); it1++) {
00042 CourseIds::const_iterator it2 = it1;
00043 std::advance(it2, 1);
00044 for (; it2 != instance.getCurriculum(i).courseIds.end(); it2++) {
00045 Edge e(*it1, *it2);
00046 es.push_back(e);
00047 vs.at(*it1).adj.insert(*it2);
00048 vs.at(*it2).adj.insert(*it1);
00049 }
00050 }
00051 }
00052
00053 std::cout << "Graphs: Generated a conflict graph with " << vs.size();
00054 std::cout << " vertices and " << es.size() << " edges" << std::endl;
00055 }
00056
00057
00058 typedef std::pair< int, std::vector<int> > Candidate;
00059 struct CandidateLess {
00060 bool operator()(const Candidate &x, const Candidate &y ) {
00061 return (x.second.size() > y.second.size());
00062 }
00063 };
00064
00065
00066 void Graph::generateCliques() {
00067 cliques.clear();
00068
00069
00070
00071 int minLimit = 2;
00072
00073
00074 int u = 0;
00075 for (u = 0; u < vs.size(); u++) {
00076
00077 if (vs[u].adj.size() < minLimit) continue;
00078
00079 std::vector<Candidate> cands;
00080 for (std::set<int>::iterator vi = vs[u].adj.begin(); vi != vs[u].adj.end(); vi++) {
00081 std::vector<int> intersection;
00082 std::set_intersection(vs[u].adj.begin(), vs[u].adj.end(),
00083 vs[*vi].adj.begin(), vs[*vi].adj.end(),
00084 std::back_inserter(intersection));
00085 if (u > (*vi) && intersection.size() > minLimit) {
00086 Candidate cand(*vi, intersection);
00087 cands.push_back(cand);
00088 }
00089 }
00090
00091 if (cands.size() < minLimit) continue;
00092
00093 CandidateLess CandidateLessInstance;
00094 std::sort(cands.begin(), cands.end(), CandidateLessInstance);
00095
00096 std::vector<int> clique;
00097 for(int candi = 0; candi < cands.size(); candi++)
00098 if (std::includes(cands[candi].second.begin(), cands[candi].second.end(), clique.begin(), clique.end()))
00099 clique.push_back(cands[candi].first);
00100
00101 if (clique.size() < minLimit) continue;
00102
00103 clique.push_back(u);
00104 cliques.push_back(clique);
00105 }
00106
00107 std::cout << "Graphs: Pre-generated " << cliques.size() << " cliques" << std::endl;
00108 }