void getEdges(undirectedGraph gu, List <int> initialNode, List <int> finalNode) { string str = Properties.Settings.Default.Database1ConnectionString; SqlConnection cnn = new SqlConnection(str); cnn.Open(); SqlCommand cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_camion, Costo_privado" + ", Tiempo_camion, Tiempo_privado, Distancia FROM Arista", cnn); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { initialNode.Add((int)rdr[0]); finalNode.Add((int)rdr[1]); nodePublicCost.Add((int)rdr[2]); nodePrivateCost.Add((int)rdr[3]); nodePublicTime.Add((int)rdr[4]); nodePrivateTime.Add((int)rdr[5]); nodeDistance.Add((int)rdr[6]); numberEdges++; } rdr.Close(); }
void undirectedGraph(List <int> weight, undirectedGraph gu, List <int> nodeNumbers, List <int> initialNode, List <int> finalNode) { for (int i = 0; i < numberNodes; i++) { gu.insertVertex(nodeNumbers[i].ToString()); } for (int i = 0; i < numberEdges; i++) { gu.insertEdge(initialNode[i].ToString(), finalNode[i].ToString(), weight[i]); } }
void getNodes(undirectedGraph gu, List <int> nodeNumbers) { string str = Properties.Settings.Default.Database1ConnectionString; SqlConnection cnn = new SqlConnection(str); cnn.Open(); SqlCommand cmd = new SqlCommand("SELECT IdNodo FROM NODO order by IdNodo", cnn); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { nodeNumbers.Add((int)rdr[0]); numberNodes++; } rdr.Close(); gu.init(numberNodes); }
void alternatePath(undirectedGraph gu, int startingNode, int endingNode) { List <int> alternateRoute = new List <int>(); alternateRoute = gu.findAlternate(startingNode, endingNode); //make a dictionary with Ids and cities Dictionary <string, string> idCities = new Dictionary <string, string>(); string str = Properties.Settings.Default.Database1ConnectionString; SqlConnection cnn = new SqlConnection(str); cnn.Open(); SqlCommand cmd = new SqlCommand("SELECT IdNodo,Ciudad FROM NODO", cnn); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { idCities.Add(rdr[0].ToString(), rdr[1].ToString()); } rdr.Close(); cnn.Close(); List <string> startNode = new List <string>(); List <string> endNode = new List <string>(); //populate the start and end boxes for (int i = 0; i < alternateRoute.Count() - 1; i++) //0 1 2 3 4 { lbx_start.Items.Add(idCities[alternateRoute[i].ToString()]); startNode.Add(alternateRoute[i].ToString()); } for (int i = 1; i < alternateRoute.Count(); i++) { lbx_end.Items.Add(idCities[alternateRoute[i].ToString()]); endNode.Add(alternateRoute[i].ToString()); } //now calculate the cost Dictionary <Tuple <string, string>, string> costPublic = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> costPrivate = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> timePublic = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> timePrivate = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> distance = new Dictionary <Tuple <string, string>, string>(); int totalCostPublic = 0, totalCostPrivate = 0, totalTimePublic = 0, totalTimePrivate = 0, totalDistance = 0; if (rdl_privateCar.Checked) { for (int i = 1; i < alternateRoute.Count; i++) { cnn = new SqlConnection(str); cnn.Open(); cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_privado, " + "Tiempo_privado, Distancia FROM Arista WHERE (IdNodoInicial = " + alternateRoute[i - 1] + " AND " + "IdNodoFinal = " + alternateRoute[i] + ") OR (IdNodoFinal = " + alternateRoute[i - 1] + " AND " + "IdNodoInicial = " + alternateRoute[i] + ")", cnn); rdr = cmd.ExecuteReader(); while (rdr.Read()) { Tuple <string, string> nodesTuple = new Tuple <string, string>(rdr[0].ToString(), rdr[1].ToString()); Tuple <string, string> nodesTuple2 = new Tuple <string, string>(rdr[1].ToString(), rdr[0].ToString()); costPrivate.Add(nodesTuple, rdr[2].ToString()); costPrivate.Add(nodesTuple2, rdr[2].ToString()); totalCostPrivate += (int)rdr[2]; timePrivate.Add(nodesTuple, rdr[3].ToString()); timePrivate.Add(nodesTuple2, rdr[3].ToString()); totalTimePrivate += (int)rdr[3]; distance.Add(nodesTuple, rdr[4].ToString()); distance.Add(nodesTuple2, rdr[4].ToString()); totalDistance += (int)rdr[4]; } rdr.Close(); cnn.Close(); } for (int i = 0; i < alternateRoute.Count - 1; i++) { Tuple <string, string> nodesTuple = new Tuple <string, string>(startNode[i], endNode[i]); lbx_time.Items.Add(timePrivate[nodesTuple]); txt_totalTime.Text = totalTimePrivate.ToString(); lbx_cost.Items.Add(costPrivate[nodesTuple]); txt_totalCost.Text = totalCostPrivate.ToString(); lbx_distance.Items.Add(distance[nodesTuple]); txt_totalDistance.Text = totalDistance.ToString(); } } else if (rdl_publicCar.Checked) { for (int i = 1; i < alternateRoute.Count; i++) { cnn = new SqlConnection(str); cnn.Open(); cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_camion, Tiempo_camion, " + "Distancia FROM Arista WHERE (IdNodoInicial = " + alternateRoute[i - 1] + " AND " + "IdNodoFinal = " + alternateRoute[i] + ") OR (IdNodoFinal = " + alternateRoute[i - 1] + " AND " + "IdNodoInicial = " + alternateRoute[i] + ")", cnn); rdr = cmd.ExecuteReader(); while (rdr.Read()) { Tuple <string, string> nodesTuple = new Tuple <string, string>(rdr[0].ToString(), rdr[1].ToString()); Tuple <string, string> nodesTuple2 = new Tuple <string, string>(rdr[1].ToString(), rdr[0].ToString()); costPublic.Add(nodesTuple, rdr[2].ToString()); costPublic.Add(nodesTuple2, rdr[2].ToString()); totalCostPublic += (int)rdr[2]; timePublic.Add(nodesTuple, rdr[3].ToString()); timePublic.Add(nodesTuple2, rdr[3].ToString()); totalTimePublic += (int)rdr[3]; distance.Add(nodesTuple, rdr[4].ToString()); distance.Add(nodesTuple2, rdr[4].ToString()); totalDistance += (int)rdr[4]; } rdr.Close(); cnn.Close(); } for (int i = 0; i < alternateRoute.Count - 1; i++) { Tuple <string, string> nodesTuple = new Tuple <string, string>(startNode[i], endNode[i]); lbx_time.Items.Add(timePublic[nodesTuple]); txt_totalTime.Text = totalTimePublic.ToString(); lbx_cost.Items.Add(costPublic[nodesTuple]); txt_totalCost.Text = totalCostPublic.ToString(); lbx_distance.Items.Add(distance[nodesTuple]); txt_totalDistance.Text = totalDistance.ToString(); } } }
int runGraph(List <int> choiceWeight, bool alternate) { //create graph and its connections. undirectedGraph gu = new undirectedGraph(); List <int> nodeNumbers = new List <int>(); List <int> initialNode = new List <int>(); List <int> finalNode = new List <int>(); getNodes(gu, nodeNumbers); getEdges(gu, initialNode, finalNode); undirectedGraph(choiceWeight, gu, nodeNumbers, initialNode, finalNode); int startingNode = getIdFromName(cbx_start.Text); int endingNode = getIdFromName(cbx_end.Text); //get the shortest route into the string. string kek = gu.dijkstra(startingNode, endingNode); numberEdges = 0; numberNodes = 0; //split the string, first is TOTAL cost, the rest are nodes. The split is done with ',' char delimeter = ','; string[] costAndNodes = kek.Split(delimeter); if (alternate) { alternatePath(gu, startingNode, endingNode); return(Int32.Parse(costAndNodes[0])); } //make a dictionary with Ids and cities Dictionary <string, string> idCities = new Dictionary <string, string>(); string str = Properties.Settings.Default.Database1ConnectionString; SqlConnection cnn = new SqlConnection(str); cnn.Open(); SqlCommand cmd = new SqlCommand("SELECT IdNodo,Ciudad FROM NODO", cnn); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { idCities.Add(rdr[0].ToString(), rdr[1].ToString()); } rdr.Close(); cnn.Close(); List <string> startNode = new List <string>(); List <string> endNode = new List <string>(); //populate the start and end boxes for (int i = 1; i < costAndNodes.Length - 2; i++) { lbx_start.Items.Add(idCities[costAndNodes[i]]); startNode.Add(costAndNodes[i]); } for (int i = 2; i < costAndNodes.Length - 1; i++) { lbx_end.Items.Add(idCities[costAndNodes[i]]); endNode.Add(costAndNodes[i]); } //now calculate the cost Dictionary <Tuple <string, string>, string> costPublic = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> costPrivate = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> timePublic = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> timePrivate = new Dictionary <Tuple <string, string>, string>(); Dictionary <Tuple <string, string>, string> distance = new Dictionary <Tuple <string, string>, string>(); int totalCostPublic = 0, totalCostPrivate = 0, totalTimePublic = 0, totalTimePrivate = 0, totalDistance = 0; List <int> shortestRoute = new List <int>(); //meter costAndNodes for (int i = 1; i < costAndNodes.Length - 1; i++) { shortestRoute.Add(Int32.Parse(costAndNodes[i])); } if (rdl_privateCar.Checked) { for (int i = 1; i < shortestRoute.Count; i++) { cnn = new SqlConnection(str); cnn.Open(); cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_privado, " + "Tiempo_privado, Distancia FROM Arista WHERE (IdNodoInicial = " + shortestRoute[i - 1] + " AND " + "IdNodoFinal = " + shortestRoute[i] + ") OR (IdNodoFinal = " + shortestRoute[i - 1] + " AND " + "IdNodoInicial = " + shortestRoute[i] + ")", cnn); rdr = cmd.ExecuteReader(); while (rdr.Read()) { Tuple <string, string> nodesTuple = new Tuple <string, string>(rdr[0].ToString(), rdr[1].ToString()); Tuple <string, string> nodesTuple2 = new Tuple <string, string>(rdr[1].ToString(), rdr[0].ToString()); costPrivate.Add(nodesTuple, rdr[2].ToString()); costPrivate.Add(nodesTuple2, rdr[2].ToString()); totalCostPrivate += (int)rdr[2]; timePrivate.Add(nodesTuple, rdr[3].ToString()); timePrivate.Add(nodesTuple2, rdr[3].ToString()); totalTimePrivate += (int)rdr[3]; distance.Add(nodesTuple, rdr[4].ToString()); distance.Add(nodesTuple2, rdr[4].ToString()); totalDistance += (int)rdr[4]; } rdr.Close(); cnn.Close(); } for (int i = 0; i < costAndNodes.Length - 3; i++) { Tuple <string, string> nodesTuple = new Tuple <string, string>(startNode[i], endNode[i]); lbx_time.Items.Add(timePrivate[nodesTuple]); txt_totalTime.Text = totalTimePrivate.ToString(); lbx_cost.Items.Add(costPrivate[nodesTuple]); txt_totalCost.Text = totalCostPrivate.ToString(); lbx_distance.Items.Add(distance[nodesTuple]); txt_totalDistance.Text = totalDistance.ToString(); } } else if (rdl_publicCar.Checked)//camion { for (int i = 1; i < shortestRoute.Count; i++) { cnn = new SqlConnection(str); cnn.Open(); cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_camion, Tiempo_camion, " + "Distancia FROM Arista WHERE (IdNodoInicial = " + shortestRoute[i - 1] + " AND " + "IdNodoFinal = " + shortestRoute[i] + ") OR (IdNodoFinal = " + shortestRoute[i - 1] + " AND " + "IdNodoInicial = " + shortestRoute[i] + ")", cnn); rdr = cmd.ExecuteReader(); while (rdr.Read()) { Tuple <string, string> nodesTuple = new Tuple <string, string>(rdr[0].ToString(), rdr[1].ToString()); Tuple <string, string> nodesTuple2 = new Tuple <string, string>(rdr[1].ToString(), rdr[0].ToString()); costPublic.Add(nodesTuple, rdr[2].ToString()); costPublic.Add(nodesTuple2, rdr[2].ToString()); totalCostPublic += (int)rdr[2]; timePublic.Add(nodesTuple, rdr[3].ToString()); timePublic.Add(nodesTuple2, rdr[3].ToString()); totalTimePublic += (int)rdr[3]; distance.Add(nodesTuple, rdr[4].ToString()); distance.Add(nodesTuple2, rdr[4].ToString()); totalDistance += (int)rdr[4]; } rdr.Close(); cnn.Close(); } for (int i = 0; i < costAndNodes.Length - 3; i++) { Tuple <string, string> nodesTuple = new Tuple <string, string>(startNode[i], endNode[i]); lbx_time.Items.Add(timePublic[nodesTuple]); txt_totalTime.Text = totalTimePublic.ToString(); lbx_cost.Items.Add(costPublic[nodesTuple]); txt_totalCost.Text = totalCostPublic.ToString(); lbx_distance.Items.Add(distance[nodesTuple]); txt_totalDistance.Text = totalDistance.ToString(); } } else { if (costPrivateSelected) { for (int i = 1; i < shortestRoute.Count; i++) { cnn = new SqlConnection(str); cnn.Open(); cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_privado, " + "Tiempo_privado, Distancia FROM Arista WHERE (IdNodoInicial = " + shortestRoute[i - 1] + " AND " + "IdNodoFinal = " + shortestRoute[i] + ") OR (IdNodoFinal = " + shortestRoute[i - 1] + " AND " + "IdNodoInicial = " + shortestRoute[i] + ")", cnn); rdr = cmd.ExecuteReader(); while (rdr.Read()) { Tuple <string, string> nodesTuple = new Tuple <string, string>(rdr[0].ToString(), rdr[1].ToString()); Tuple <string, string> nodesTuple2 = new Tuple <string, string>(rdr[1].ToString(), rdr[0].ToString()); costPrivate.Add(nodesTuple, rdr[2].ToString()); costPrivate.Add(nodesTuple2, rdr[2].ToString()); totalCostPrivate += (int)rdr[2]; timePrivate.Add(nodesTuple, rdr[3].ToString()); timePrivate.Add(nodesTuple2, rdr[3].ToString()); totalTimePrivate += (int)rdr[3]; distance.Add(nodesTuple, rdr[4].ToString()); distance.Add(nodesTuple2, rdr[4].ToString()); totalDistance += (int)rdr[4]; } rdr.Close(); cnn.Close(); } for (int i = 0; i < costAndNodes.Length - 3; i++) { Tuple <string, string> nodesTuple = new Tuple <string, string>(startNode[i], endNode[i]); lbx_time.Items.Add(timePrivate[nodesTuple]); txt_totalTime.Text = totalTimePrivate.ToString(); lbx_cost.Items.Add(costPrivate[nodesTuple]); txt_totalCost.Text = totalCostPrivate.ToString(); lbx_distance.Items.Add(distance[nodesTuple]); txt_totalDistance.Text = totalDistance.ToString(); } } else { for (int i = 1; i < shortestRoute.Count; i++) { cnn = new SqlConnection(str); cnn.Open(); cmd = new SqlCommand("SELECT IdNodoInicial, IdNodoFinal, Costo_camion, Tiempo_camion, " + "Distancia FROM Arista WHERE (IdNodoInicial = " + shortestRoute[i - 1] + " AND " + "IdNodoFinal = " + shortestRoute[i] + ") OR (IdNodoFinal = " + shortestRoute[i - 1] + " AND " + "IdNodoInicial = " + shortestRoute[i] + ")", cnn); rdr = cmd.ExecuteReader(); while (rdr.Read()) { Tuple <string, string> nodesTuple = new Tuple <string, string>(rdr[0].ToString(), rdr[1].ToString()); Tuple <string, string> nodesTuple2 = new Tuple <string, string>(rdr[1].ToString(), rdr[0].ToString()); costPublic.Add(nodesTuple, rdr[2].ToString()); costPublic.Add(nodesTuple2, rdr[2].ToString()); totalCostPublic += (int)rdr[2]; timePublic.Add(nodesTuple, rdr[3].ToString()); timePublic.Add(nodesTuple2, rdr[3].ToString()); totalTimePublic += (int)rdr[3]; distance.Add(nodesTuple, rdr[4].ToString()); distance.Add(nodesTuple2, rdr[4].ToString()); totalDistance += (int)rdr[4]; } rdr.Close(); cnn.Close(); } for (int i = 0; i < costAndNodes.Length - 3; i++) { Tuple <string, string> nodesTuple = new Tuple <string, string>(startNode[i], endNode[i]); lbx_time.Items.Add(timePublic[nodesTuple]); txt_totalTime.Text = totalTimePublic.ToString(); lbx_cost.Items.Add(costPublic[nodesTuple]); txt_totalCost.Text = totalCostPublic.ToString(); lbx_distance.Items.Add(distance[nodesTuple]); txt_totalDistance.Text = totalDistance.ToString(); } } } return(Int32.Parse(costAndNodes[0])); }