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

compute_dmst.c

00001 #define K 4
00002 
00003 void ComputeDMST(graph& G, edge_array<double>& Cost, list<edge>& T) {
00004 
00005   ILP_Problem IP(Optsense_Min);
00006 
00007   graph H;
00008 
00009   node_array<node> GtoH[K];
00010   for(int i=0; i<K; i++) GtoH[i].init(G);
00011 
00012   edge e,f;
00013   var_map<edge> VM;
00014   edge_map<edge> EM(H);
00015   node u;
00016   forall_nodes(u, G) {
00017     for(int i=0; i<K; i++) { 
00018       GtoH[i][u]=H.new_node();
00019       if(i!=0) {
00020         f=H.new_edge(GtoH[i-1][u],GtoH[i][u]);
00021         VM[f]=IP.add_variable(0,0,1,Vartype_Integer);
00022         EM[f]=nil;
00023       };
00024     };
00025   };
00026 
00027   cout<<"NODES\n";
00028 
00029   forall_edges(e, G) {
00030     for(int i=1; i<K; i++) {
00031       f=H.new_edge(GtoH[i-1][source(e)],GtoH[i][target(e)]);
00032       VM[f]=IP.add_variable(Cost[e],0,1,Vartype_Integer);
00033       EM[f]=e;
00034     }
00035   }
00036 
00037   cout<<"EDGES\n";
00038  
00039   node s=GtoH[0][G.first_node()];
00040   forall_nodes(u,G) {
00041     IP.add_sym_constraint(new PATH(H, s, GtoH[K-1][u], VM));
00042   }
00043 
00044   cout<<"CONSTR\n";
00045 
00046   IP.optimize();
00047 
00048   cout<<"OPT\n";
00049 
00050   forall_edges(e, H) if((EM[e]!=nil) && (IP.get_solution(VM[e])==1))
00051     T.append(EM[e]);
00052 };

Generated on Tue Nov 16 15:18:14 2004 for SCIL by doxygen1.2.16