void CSensorNetwork::callLEMON() { // DIGRAPH_TYPEDEFS((SmartDigraph); ListDigraph myGraph; double euclideanDist = 0.0; CCArray _selectedNodes; CCArray _copySelectedNodes; CCArray _failedNodes; CCArray _dominateeNodes; ListDigraph::Node source = myGraph.addNode(); ListDigraph::Node target = myGraph.addNode(); //Dominatee map to identify if any of the selcted nodes is dominatee ListDigraph::NodeMap isDominatee(myGraph); //Capacity map ListDigraph::ArcMap capacity(myGraph); //Cost maps ListDigraph::ArcMap cost(myGraph); for(int i = 1; i<= noOfFailedNodes; i++) { ListDigraph::Node f = myGraph.addNode(); _failedNodes.Add(f); } for(int i = 1; i<= noOfSelectedNodes; i++) { ListDigraph::Node s = myGraph.addNode(); if(!selectedNodes[i]->GetIsDominator()) { isDominatee[s] = true; } else isDominatee[s] = false; _selectedNodes.Add(s); _copySelectedNodes.Add(s); } for(int i = 1; i<= noOfSelectedDominateeNodes; i++) { ListDigraph::Node d = myGraph.addNode(); _dominateeNodes.Add(d); } //Add Arcs from Source to each node in Dominatees for(int i = 1; i<= noOfSelectedDominateeNodes; i++) { ListDigraph::Arc sourceToDom = myGraph.addArc(source, _dominateeNodes[i]); capacity[sourceToDom] = INFINITE; cost[sourceToDom] = 0; } //Add arcs from each dominatee to each selected node for(int i = 1; i<= noOfSelectedDominateeNodes; i++) { for(int j = 1; j<= noOfSelectedNodes; j++) { if(isDominatee[_selectedNodes[i]] == false) //if it is dominatee, don't make arcs to it { ListDigraph::Arc domToSelected = myGraph.addArc(_dominateeNodes[i], _selectedNodes[j]); capacity[domToSelected] = INFINITE; } } } //Add arc from selected node to its counterpart in copy selected node for(int i = 1; i<= noOfSelectedNodes; i++) { ListDigraph::Arc selectedToCopySelected = myGraph.addArc(_selectedNodes[i], _copySelectedNodes[i]); capacity[selectedToCopySelected] = 1; cost[selectedToCopySelected] = 0; } //Add arcs from each 'copy' selected node to each failed node for(int i = 1; i<= noOfSelectedNodes; i++) { for(int j = 1; j<= noOfFailedNodes; j++) { ListDigraph::Arc copySelectedToFailed = myGraph.addArc(_copySelectedNodes[i], _failedNodes[j]); capacity[copySelectedToFailed] = INFINITE; euclideanDist = CHelperFunctions::Distance(selectedNodes[i]->GetX(), selectedNodes[i]->GetY(),failedNodes[j]->GetX(), failedNodes[j]->GetY()); cost[copySelectedToFailed] = euclideanDist; } } //Add arcs from each failed node to target node for(int j = 1; j<= noOfFailedNodes; j++) { ListDigraph::Arc failedToTarget = myGraph.addArc(_failedNodes[j], target); capacity[failedToTarget] = INFINITE; cost[failedToTarget] = 0; } //lower bound of all arcs is zero ListDigraph::ArcMap lower(myGraph, 0); //Supply map ListDigraph::NodeMap supply(myGraph,0); supply[source] = 100; supply[target] = -100; NetworkSimplex ns(myGraph); ns.lowerMap(lower).upperMap(capacity).costMap(cost).supplyMap(supply).run();