/// <summary> /// creates graph by creating only one node /// </summary> /// <param name="parameter">not required for implementation</param> private void _CreateNewGraph(object parameter) { Graph = new NetGraph(true); // _existingVertices.GetOrAdd(new NetVertex(1)); _VList.Add(1); Graph.AddVertex(new NetVertex(1)); NotifyPropertyChanged("Graph"); _IDCount = 1; }
private void _OpenDefaultGraph() { string[] lines = null; // Create an open file dialog box and only show *.grf files. try { OpenFileDialog openDlg = new OpenFileDialog(); openDlg.Filter = "Graph File |*.grf"; //read all lines of file if (true == openDlg.ShowDialog()) { lines = File.ReadAllLines(openDlg.FileName); _openedFileName = openDlg.FileName; Graph = new NetGraph(true); //following block of code try to read the file and create graph // to fully understant this code please read the graph file in notepad string[] IDs = lines[0].Split(','); foreach (string id in IDs) { int currID = int.Parse(id); _VList.Add(currID); Graph.AddVertex(new NetVertex(currID)); } _IDCount = _VList.Count; string[] edges = lines[1].Split(','); string[] temp; int idTo, idFrom; int from = 0, to = 0; int count = Graph.VertexCount; foreach (string part in edges) { temp = part.Split('-'); idFrom = int.Parse(temp[0]); idTo = int.Parse(temp[1]); for (int i = 0; i < count; i++) { if (Graph.Vertices.ElementAt(i).ID == idFrom) { from = i; } if (Graph.Vertices.ElementAt(i).ID == idTo) { to = i; } } // _AddNewGraphEdge(_existingVertices[--idTo], _existingVertices[--idFrom]); _AddNewGraphEdge(Graph.Vertices.ElementAt(from), Graph.Vertices.ElementAt(to)); } string[] commodities = lines[2].Split(','); if (commodities.Length > 0) { CommodityList.RemoveAt(0); } foreach (string part in commodities) { temp = part.Split('-'); from = int.Parse(temp[0]); to = int.Parse(temp[1]); if (from != to) { CommoditiesEntryViewModel cvm = new CommoditiesEntryViewModel(); cvm.OriginID = from; cvm.DestinationID = to; cvm.DemandVal = int.Parse(temp[2]); cvm.CombList = _VList; cvm.ParentList = CommodityList; CommodityList.Add(cvm); } } NotifyPropertyChanged("Graph"); } } catch (IOException e) { ExceptionMessage.Show("Could Not Open File\n" + e.ToString()); Graph = null; } catch (Exception ex) { ExceptionMessage.Show("Something wrong with the Data in the File\n" + ex.ToString()); Graph = null; } }
/// <summary> /// This method takes graph file data for networkx graph and /// creates vertexes, edges. It also creates random commodities with /// valid paths. /// </summary> /// <param name="lines">graph file text</param> private void _DrawGraphWithCommodities(string [] lines) { int CommodityNum = this._NumberOfCommoditiesVal; int MinComm = this._MinimumDemandVal; int MaxComm = this._MaximumDemandVal + 1; int nodeID = 0; bool CommoditySet = false; List <int> Origins = new List <int>(); List <int> Destinations = new List <int>(); List <float> Demands = new List <float>(); int OriginID = 0, DestID = 0; float demand = 0; SortedSet <int> nodeList = new SortedSet <int>(); // HashSet<int> nodeList = new HashSet<int>(); HashSet <int> edgeOutNodes = new HashSet <int>(); Random random = new Random(); Dictionary <int, LinkedList <int> > EdgeMap = new Dictionary <int, LinkedList <int> >(); Graph = new NetGraph(true); try { foreach (string line in lines) //create and add vertex to the graph { string[] IDs = line.Split(' '); if (int.TryParse(IDs[0], out nodeID)) { foreach (string id in IDs) { int currID = int.Parse(id); if (nodeList.Add(currID)) { // _VList.Add(currID); Graph.AddVertex(new NetVertex(currID)); } } } } for (int i = 0; i < nodeList.Count; i++) { _VList.Add(nodeList.ElementAt(i)); } this._IDCount = this._VList.Count(); int from = 0, to = 0, curID = 0; int count = Graph.VertexCount; bool valid = true; //create edges, and keep record of vertex with edges going out for each valid vertex foreach (string line in lines) { string[] IDs = line.Split(' '); if (int.TryParse(IDs[0], out nodeID)) { EdgeMap.Add(nodeID, new LinkedList <int>()); for (int j = 1; j < IDs.Length; j++) { curID = int.Parse(IDs[j]); valid = true; if (EdgeMap.ContainsKey(curID)) { foreach (int id in EdgeMap[curID]) { if (id == nodeID) { valid = false; } } } if (valid) { edgeOutNodes.Add(nodeID); EdgeMap[nodeID].AddLast(curID); for (int i = 0; i < count; i++) { if (Graph.Vertices.ElementAt(i).ID == nodeID) { from = i; } if (Graph.Vertices.ElementAt(i).ID == curID) { to = i; } } this._AddNewGraphEdge(Graph.Vertices.ElementAt(from), Graph.Vertices.ElementAt(to)); } } } } //commodity is choosed at random, if that commodity does not already exist //check if it has valid path. if it exists then just add demand to it. for (int i = 0; i < _NumberOfCommoditiesVal; i++) { CommoditySet = false; while (!CommoditySet) { OriginID = random.Next(0, edgeOutNodes.Count); OriginID = edgeOutNodes.ElementAt(OriginID); DestID = random.Next(0, nodeList.Count); DestID = nodeList.ElementAt(DestID); demand = random.Next(MinComm, MaxComm); for (int j = 0; j < Origins.Count; j++) { if (Origins[j] == OriginID && Destinations[j] == DestID) { CommoditySet = true; Demands[j] += demand; break; } } if (CommoditySet) { break; } this._path = null; if (this._HasPath(OriginID, DestID, nodeList.Count, EdgeMap)) { // this._GetSimulationEdges(OriginID, DestID); Origins.Add(OriginID); Destinations.Add(DestID); Demands.Add(demand); CommoditySet = true; } } } if (Origins.Count > 0) { CommodityList.Remove(CommodityList.ElementAt(0)); } for (int i = 0; i < Origins.Count; i++) { CommoditiesEntryViewModel cvm = new CommoditiesEntryViewModel(); cvm.OriginID = Origins[i]; cvm.DestinationID = Destinations[i]; cvm.DemandVal = Demands[i]; cvm.CombList = _VList; cvm.ParentList = CommodityList; CommodityList.Add(cvm); } NotifyPropertyChanged("Graph"); } catch (Exception ex) { ExceptionMessage.Show("Something wrong with the Data in the File\n" + ex.ToString()); Graph = null; } }