/// <summary> /// Сохраняет топологию в .xml файл /// </summary> /// <param name="fileName">Путь к файлу</param> /// <param name="net">Сохраняемая топология</param> public void SaveTopology(String fileName, Topology net) { XDocument xDoc = new XDocument(); // Создаем корень документа XElement xRoot = new XElement("Topology"); // Создаем список маршрутизаторов XElement xRouters = new XElement("Routers"); // Создаем список каналов XElement xLinks = new XElement("Links"); xRoot.Add(xRouters); xRoot.Add(xLinks); xDoc.Add(xRoot); /* Запись узлов */ foreach (Router r in net.Routers) { XElement xRouter = new XElement("Router"); XAttribute xName = new XAttribute("name", r.Name); XAttribute xLocationX = new XAttribute("x", r.Location.X.ToString()); XAttribute xLocationY = new XAttribute("y", r.Location.Y.ToString()); xRouter.Add(xName); xRouter.Add(xLocationX); xRouter.Add(xLocationY); xRouters.Add(xRouter); } /* Запись ребер */ foreach (Link l in net.Links) { XElement xLink = new XElement("Link"); XAttribute xMetric = new XAttribute("metric", l.Metric.ToString()); XAttribute xIndexS = new XAttribute("snode", l.NumS.ToString()); XAttribute xIndexE = new XAttribute("enode", l.NumE.ToString()); xLink.Add(xMetric); xLink.Add(xIndexS); xLink.Add(xIndexE); xLinks.Add(xLink); } xDoc.Save(fileName); }
/// <summary> /// Загружает топологию из .xml файла /// </summary> /// <param name="fileName">Путь к файлу</param> /// <param name="net">Сохраняемая топология</param> public void LoadTopology(String fileName, Topology net) { XDocument xDoc = XDocument.Load(fileName); net.Clear(); /* Загрузка узлов */ foreach (XElement r in xDoc.Root.Element("Routers").Elements()) { Router router = new Router(new Point(Int32.Parse(r.Attribute("x").Value), Int32.Parse(r.Attribute("y").Value)), Drawing.RouterImg); router.Name = r.Attribute("name").Value; net.CreateNode(router); } /* Загрузка ребер */ foreach (XElement l in xDoc.Root.Elements("Links").Elements()) { Link link = new Link(Int32.Parse(l.Attribute("snode").Value), Int32.Parse(l.Attribute("enode").Value)); link.Metric = Int32.Parse(l.Attribute("metric").Value); net.CreateEdge(link); } }
/// <summary> /// Вычисляет постоянные пометки вершин с /// помощю классического алгоритма Дейкстры /// в несегментированном графе /// </summary> /// <param name="net">Сетевая топология</param> /// <param name="indexV">Индекс корня</param> public void Process(Topology net, Int32 indRoot) { InitGraph(net); _vertexes[indRoot].Mark = 0; Vertex tmpVertex = _vertexes[indRoot]; /* Просмотр вершин */ for (Int32 i = 0; i < _vertexes.Count; i++) { /* Назначение временных меток соседям */ for (Int32 j = 0; j < tmpVertex.Adjacent.Count; j++) { Int32 newMark = tmpVertex.Mark + tmpVertex.Metric[j]; if (tmpVertex.Adjacent[j].Used == false && newMark < tmpVertex.Adjacent[j].Mark) { tmpVertex.Adjacent[j].Mark = newMark; } } tmpVertex.Used = true; /* Поиск следующей вершины для просмотра */ Int32 min = _INF; for (Int32 j = 0; j < _vertexes.Count; j++) { if (_vertexes[j].Used == false && _vertexes[j].Mark < min) { min = _vertexes[j].Mark; tmpVertex = _vertexes[j]; } } } FormConstMarks(); }
/// <summary> /// Инициализирует граф /// </summary> /// <param name="net">Сетевая топология</param> protected abstract void InitGraph(Topology net);
/// <summary> /// Инициализирует граф /// </summary> /// <param name="net">Сетевая топология</param> protected override void InitGraph(Topology net) { /* Установка исходных данных */ _vertexes = new Vertex[net.Routers.Count]; for (Int32 i = 0; i < _vertexes.Count; i++) { _vertexes[i] = new Vertex(); _vertexes[i].Used = false; _vertexes[i].Mark = _INF; } /* Формирование смежных списков */ foreach (Link l in net.Links) { Int32 sIndex = l.NumS; Int32 eIndex = l.NumE; _vertexes[sIndex].Adjacent.Add(_vertexes[eIndex]); _vertexes[sIndex].Metric.Add(l.Metric); _vertexes[eIndex].Adjacent.Add(_vertexes[sIndex]); _vertexes[eIndex].Metric.Add(l.Metric); } }
/// <summary> /// Конструктор /// </summary> /// <param name="net">Сетевая топология</param> public RoutingTableFiller(Topology net) { _net = net; }
/// <summary> /// Конструктор /// </summary> /// <param name="net">Сетевая топология</param> public RoutingTableFillerForm(Topology net) { InitializeComponent(); _net = net; }
/// <summary> /// Конструктор /// </summary> /// <param name="net">Сетевая топология</param> public DispatchAllForm(Topology net) { InitializeComponent(); _net = net; }
/// <summary> /// Конструктор /// </summary> /// <param name="net">Сетевая топология</param> public AlgDejkstraForm(Topology net) { InitializeComponent(); _net = net; }