Main Page   Class Hierarchy   Compound List   File List   Contact   Download   Symbolic Constraints   Examples  

compute_dmst.cc

00001 #define K 4
00002 using namespace SCIL;
00003 
00004 void ComputeDMST(Graph& G, std::list<edge_descriptor>& T) {
00005 
00006    ILP_Problem IP(Optsense_Min);
00007 
00008    Graph H;
00009 
00010    std::map<vertex_descriptor, vertex_descriptor> GtoH[K];
00011 
00012    var_map<edge_descriptor> VM;
00013    map<edge_descriptor, std::pair<bool, edge_descriptor> > EM;
00014    BGL_FORALL_VERTICES(u, G, Graph) {
00015       for(int i=0; i<K; i++) { 
00016          GtoH[i][u] = add_vertex(H);
00017          if(i != 0) {
00018             edge_descriptor f = (add_edge(GtoH[i-1][u], GtoH[i][u], H)).first;
00019             VM[f] = IP.add_binary_variable(0);
00020             EM[f] = std::pair<bool, edge_descriptor>(0,f);
00021          }
00022       }
00023    }
00024 
00025    BGL_FORALL_EDGES(e, G, Graph) {
00026       for(int i=1; i<K; i++) {
00027          edge_descriptor f = (add_edge(GtoH[i-1][source(e, G)],
00028                                        GtoH[i][target(e, G)], H)).first;
00029          VM[f] = IP.add_binary_variable(G[e].distance);
00030          EM[f] = std::pair<bool, edge_descriptor>(1,e);
00031       }
00032    }
00033 
00034    vertex_descriptor s=GtoH[0][*(vertices(G).first)];
00035    BGL_FORALL_VERTICES(u, G, Graph) {
00036       IP.add_sym_constraint(new PATH<Graph>(H, s, GtoH[K-1][u], VM));
00037    }
00038 
00039    IP.optimize();
00040 
00041    BGL_FORALL_EDGES(e, H, Graph)
00042       if(EM[e].first && (IP.get_solution(VM[e])==1))
00043          T.push_back(EM[e].second);
00044 }
Generated on Mon Mar 28 22:03:47 2011 for SCIL by  doxygen 1.6.3