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

steiner_arborescence.cc

00001 #include<scil/scil.h>
00002 #include<scil/constraints/SteinerArborescence.h>
00003 #include <boost/graph/adjacency_list.hpp>
00004 #include <boost/graph/iteration_macros.hpp>
00005 
00006 using namespace std;
00007 using namespace SCIL;
00008 using namespace boost;
00009 
00010 
00011 typedef boost::adjacency_list<vecS,vecS,bidirectionalS> Graph;
00012 typedef boost::graph_traits<Graph>::vertex_descriptor vertex_descriptor;
00013 typedef boost::graph_traits<Graph>::edge_descriptor edge_descriptor;
00014 
00015 
00016 void read_network(char* file_name, Graph& G, map<edge_descriptor, double>& edge_weights, map<vertex_descriptor, pair<int, int> >& vertexmap)
00017 {
00018    ifstream file;
00019    file.open(file_name);
00020 
00021    int number_of_vertices;
00022 
00023    file >> number_of_vertices;
00024    double x,y;
00025    vertex_descriptor v,w;
00026 
00027    for(int i = 0; i<number_of_vertices; i++){
00028       file >> x >> y;
00029       vertexmap[add_vertex(G)] = make_pair(x,y);
00030    }
00031 
00032    file.close();
00033 
00034    BGL_FORALL_VERTICES(v, G, Graph){
00035       BGL_FORALL_VERTICES(w, G, Graph){
00036          if(v != w){
00037             edge_descriptor e = add_edge(v,w,G).first;
00038             double dist = sqrt(((vertexmap[w].second - vertexmap[v].second) * (vertexmap[w].second - vertexmap[v].second) ) + ((vertexmap[w].first - vertexmap[v].first) * (vertexmap[w].first - vertexmap[v].first)));
00039             edge_weights[e] = dist;
00040          }
00041       }
00042    }
00043 }
00044 
00045 
00046 int main(int argc, char** argv){
00047    
00048    Graph G;
00049    map<edge_descriptor, double> edge_weights;
00050    map<vertex_descriptor, pair<int, int> > vertexmap;
00051    var_map<edge_descriptor> VM;
00052 
00053    read_network(argv[1], G, edge_weights, vertexmap);
00054    
00055    vertex_descriptor root = *(vertices(G).first);
00056    list<vertex_descriptor> terminals;
00057    int num_terminals = atoi(argv[2]);
00058 
00059    int i = 0;
00060    BGL_FORALL_VERTICES(v, G, Graph){
00061       if(v != root && (i < num_terminals || num_terminals == 0)){
00062          terminals.push_back(v);
00063          i++;
00064       }
00065    }
00066 
00067    ILP_Problem IP(Optsense_Min);
00068 
00069    BGL_FORALL_EDGES(e, G, Graph)
00070       VM[e] = IP.add_binary_variable(edge_weights[e]);
00071 
00072    IP.add_sym_constraint(new SteinerArborescence<Graph>(G, root, terminals, VM));
00073 
00074    IP.optimize();
00075 
00076    cout<<"Optimum: "<<IP.get_optimum()<<endl;
00077    BGL_FORALL_EDGES(e, G, Graph){
00078       if(IP.get_solution(VM[e]) == 1)
00079          cout<<e<<endl;
00080    }
00081 }
00082 
Generated on Mon Mar 28 22:03:50 2011 for SCIL by  doxygen 1.6.3