Limbo
3.5.4
Toggle main menu visibility
Loading...
Searching...
No Matches
limbo
algorithms
coloring
ChromaticNumber.h
Go to the documentation of this file.
1
7
8
#ifndef LIMBO_ALGORITHMS_COLORING_CHROMATICNUMBER
9
#define LIMBO_ALGORITHMS_COLORING_CHROMATICNUMBER
10
11
#include <iostream>
12
#include <vector>
13
#include <set>
14
#include <boost/graph/graph_concepts.hpp>
15
#include <boost/graph/subgraph.hpp>
16
#include <
limbo/algorithms/MaxIndependentSet.h
>
17
18
using
std::vector;
19
using
std::set;
20
using
std::cout;
21
using
std::endl;
22
24
namespace
limbo
25
{
27
namespace
algorithms
28
{
30
namespace
coloring
31
{
32
51
template
<
typename
GraphType>
52
class
LawlerChromaticNumber
53
{
54
public
:
56
typedef
GraphType graph_type;
57
typedef
boost::subgraph<graph_type> subgraph_type;
58
typedef
typename
boost::graph_traits<graph_type>::vertex_descriptor graph_vertex_type;
60
63
struct
mis_visitor_type
64
{
65
vector<set<graph_vertex_type>
>&
mMisNode
;
66
69
mis_visitor_type
(
vector
<set<graph_vertex_type> >& mMisNode_) :
mMisNode
(mMisNode_) {}
72
mis_visitor_type
(
mis_visitor_type
const
& rhs) :
mMisNode
(rhs.
mMisNode
) {}
73
77
template
<
typename
MisType>
78
void
mis
(MisType
const
& is)
79
{
80
// only record maximal independent sets
81
if
(!
mMisNode
.empty())
82
{
83
if
(
mMisNode
.front().size() < is.size())
84
mMisNode
.clear();
85
else
if
(
mMisNode
.front().size() > is.size())
86
return
;
87
}
88
89
mMisNode
.push_back(set<graph_vertex_type>());
90
for
(
typename
MisType::const_iterator it = is.begin();
91
it != is.end(); ++it)
92
mMisNode
.back().insert(*it);
93
}
94
};
95
98
int
operator()
(subgraph_type g)
const
99
{
100
return
chromatic_number
(g);
101
}
102
103
protected
:
110
int
chromatic_number
(subgraph_type& g)
const
111
{
112
int
cn = boost::num_vertices(g);
// initial chromatic number
113
114
// stop recursion
115
if
(cn <= 1)
return
cn;
116
else
if
(cn == 2)
117
{
118
BGL_FORALL_EDGES_T(e, g, subgraph_type)
119
{
120
// the only two vertices are connected
121
if
(boost::source(e, g) != boost::target(e, g))
122
return
2;
123
}
124
// they are not connected
125
return
1;
126
}
127
128
vector<set<graph_vertex_type>
> mMisNode;
129
limbo::algorithms::max_independent_set
(g,
mis_visitor_type
(mMisNode),
limbo::algorithms::MaxIndependentSetByMaxClique
());
130
131
#ifdef DEBUG_CHROMATICNUMBER
132
#if 0
133
typename
boost::property_map<subgraph_type, boost::vertex_index_t>::type vertex_index_map = boost::get(boost::vertex_index, g);
134
135
for
(
typename
vector
<set<graph_vertex_type> >::const_iterator it1 = mMisNode.begin();
136
it1 != mMisNode.end(); ++it1)
137
{
138
set<graph_vertex_type>
const
& sMisNode = *it1;
139
140
for
(
typename
set<graph_vertex_type>::const_iterator it2 = sMisNode.begin();
141
it2 != sMisNode.end(); ++it2)
142
cout << vertex_index_map[*it2] <<
" "
;
143
cout << endl;
144
}
145
#endif
146
#endif
147
148
for
(
typename
vector
<set<graph_vertex_type> >::const_iterator it1 = mMisNode.begin();
149
it1 != mMisNode.end(); ++it1)
150
{
151
set<graph_vertex_type>
const
& sMisNode = *it1;
152
subgraph_type& g_s = g.create_subgraph();
// subgraph, G \ I
153
154
BGL_FORALL_VERTICES_T(v, g, subgraph_type)
155
{
156
if
(!sMisNode.count(v))
157
boost::add_vertex(v, g_s);
158
}
159
160
#ifdef DEBUG_CHROMATICNUMBER
161
//boost::print_graph(g_s, vertex_index_map);
162
#endif
163
// get chromatic number of complementary MIS graph
164
int
comp_cn =
chromatic_number
(g_s);
165
166
if
(cn > comp_cn) cn = comp_cn;
167
168
// the assumption is that all mis have the same size
169
//
170
// if current graph has more than 1 vertices
171
// and we only need 1 color, that is already smallest number of colors
172
// so we can exit early
173
if
(boost::num_vertices(g_s) == 0
174
|| (boost::num_vertices(g_s) > 0 && cn == 1))
175
break
;
176
}
177
178
return
cn+1;
179
}
180
};
181
182
}
// namespace coloring
183
}
// namespace algorithms
184
}
// namespace limbo
185
186
#endif
MaxIndependentSet.h
solve maximum independent sets with maximum cliques
limbo::algorithms::coloring::LawlerChromaticNumber
Definition
ChromaticNumber.h:53
limbo::algorithms::coloring::LawlerChromaticNumber::operator()
int operator()(subgraph_type g) const
Definition
ChromaticNumber.h:98
limbo::algorithms::coloring::LawlerChromaticNumber::chromatic_number
int chromatic_number(subgraph_type &g) const
Definition
ChromaticNumber.h:110
limbo::algorithms::coloring::vector
limbo::algorithms::coloring
namespace for Limbo.Algorithms.Coloring
Definition
BacktrackColoring.h:22
limbo::algorithms
namespace for Limbo.algorithms
Definition
GraphUtility.h:26
limbo::algorithms::max_independent_set
void max_independent_set(GraphType const &g, VisitorType vis, AlgorithmType const &)
limbo
namespace for Limbo
Definition
GraphUtility.h:23
limbo::algorithms::MaxIndependentSetByMaxClique
Definition
MaxIndependentSet.h:23
limbo::algorithms::coloring::LawlerChromaticNumber::mis_visitor_type
Definition
ChromaticNumber.h:64
limbo::algorithms::coloring::LawlerChromaticNumber::mis_visitor_type::mis
void mis(MisType const &is)
Definition
ChromaticNumber.h:78
limbo::algorithms::coloring::LawlerChromaticNumber::mis_visitor_type::mis_visitor_type
mis_visitor_type(mis_visitor_type const &rhs)
Definition
ChromaticNumber.h:72
limbo::algorithms::coloring::LawlerChromaticNumber::mis_visitor_type::mis_visitor_type
mis_visitor_type(vector< set< graph_vertex_type > > &mMisNode_)
Definition
ChromaticNumber.h:69
limbo::algorithms::coloring::LawlerChromaticNumber::mis_visitor_type::mMisNode
vector< set< graph_vertex_type > > & mMisNode
bind mis nodes
Definition
ChromaticNumber.h:65
Generated on
for Limbo by
1.17.0