Модернизация компьютерной сети предприятия с целью достижения заданной пропускной способности

Автор работы: Пользователь скрыл имя, 04 Февраля 2014 в 22:42, курсовая работа

Краткое описание


Многим сетевым администраторам приходилось сталкиваться с проблемой организации узлов сети, либо оптимизацией работы уже существующей. Возникает вопрос – как грамотно распределить узлы сети и связи между ними, чтобы сеть надежно работала? Грамотный специалист может предложить проверенное на своем опыте решение, и реализовать его, но для расчетов пропускной способности, количества расходных материалов и прочих немаловажных деталей для этого плана может уйти немалое время, не говоря уже о возможности других реализаций.

Содержание


Введение 3
1 Общая часть 5
1.1 Постановка задачи 5
1.2 Способы решения задачи. Преимущества и недостатки 6
1.3 Определение выбора алгоритма 8
1.4 Определение метода и технологий проектирования 8
1.5 Выбор инструментальных средств 9
2 Расчётная часть 11
2.1 Построение математической модели 11
2.2 Организация входной информации и выходных данных 14
2.3 Описание основных модулей программы 16
Заключение 17
Список литературы

Прикрепленные файлы: 6 файлов

Презентация.ppt

— 3.78 Мб (Просмотреть файл, Скачать документ)

Приложение А. ТЗ.doc

— 60.50 Кб (Просмотреть файл, Скачать документ)

Приложение Б. Спецификация.doc

— 44.50 Кб (Просмотреть файл, Скачать документ)

Приложение В. Руководство пользователя.doc

— 83.00 Кб (Просмотреть файл, Скачать документ)

Приложение Г. Код программы.doc

— 41.50 Кб (Скачать документ)

Приложение  Г

ФГБОУ ВПО «Саратовский государственный университет

 имени Н.Г.  Чернышевского»

Колледж радиоэлектроники имени П.Н. Яблочкова

 

643.КРЭ.00001-01 12

 

 

Модернизация  компьютерной сети предприятия с  целью достижения заданной пропускной способности.

 

Текст программы.

 

643.КРЭ.00001-01 12

Листов 7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2012


Листинг программы

Работа программы  базируется на использовании двух основных классов: Dinic.cs и MaxFlowMinCost.cs.

Класс Dinic.cs предназначен для реализации алгоритма Диница, которым находится максимальный поток всей сети. Исходный код класса:

 

public class Dinic

    {

        class Edge

        {

            public int t, rev, cap, f;

 

            public Edge(int t, int rev, int cap)

            {

                this.t = t;

                this.rev = rev;

                this.cap = cap;

            }

        }

 

        private List<Edge>[] graph;

 

        public int maxFlow(int src, int dest)

        {

            int[] ptr = new int[graph.Length];

            int[] Q = new int[graph.Length];

            int[] dist = new int[graph.Length];

            int flow = 0;

            while (dinic_bfs(dist, Q, src, dest))

            {

                Fill<int>(ptr, 0);

                while (true)

                {

                    int df = dinic_dfs(ptr, dist, dest, src, int.MaxValue);

                    if (df == 0)

                        break;

                    flow += df;

                }

            }

            return flow;

        }

 

        public void addEdge(int s, int t, int cap)

        {

            graph[s].Add(new Edge(t, graph[t].Count, cap));

            graph[t].Add(new Edge(t, graph[s].Count - 1, 0));

        }

 

        private bool dinic_bfs(int[] dist, int[] Q, int src, int dest)

        {

            Fill<int>(dist, -1);

            dist[src] = 0;

            int sizeQ = 0;

            Q[sizeQ++] = src;

            for (int i = 0; i < sizeQ; i++)

            {

                int u = Q[i];

                foreach (Edge e in graph[u])

                {

                    if (dist[e.t] < 0 && e.f < e.cap)

                    {

                        dist[e.t] = dist[u] + 1;

                        Q[sizeQ++] = e.t;

                    }

                }

            }

            return dist[dest] >= 0;

        }

 

        private int dinic_dfs(int[] ptr, int[] dist, int dest, int u, int f)

        {

            if (u == dest)

                return f;

            for (; ptr[u] < graph[u].Count; ++ptr[u])

            {

                Edge e = graph[u].ElementAt(ptr[u]);

                if (dist[e.t] == dist[u] + 1 && e.f < e.cap)

                {

                    int df = dinic_dfs(ptr, dist, dest, e.t, Math.Min(f,e.cap - e.f));

                    if (df > 0)

                    {

                        e.f += df;

                        graph[e.t].ElementAt(e.rev).f -= df;

                        return df;

                    }

                }

            }

            return 0;

        }

 

        private void Fill<T>(T[] array, T value)

        {

            if (array == null)

            {

                throw new ArgumentNullException("array");

            }

            for (int i = 0; i < array.Length; i++)

            {

                array[i] = value;

            }

        }

}

 

Вызываемый  метод для получения решения  – MaxFlow() в который в качестве аргументов передаются номера вершин (истока src и  стока dest). За хранение связей отвечает поле graph, в котором хранятся экземпляры локального класса Edge. Однако, доступность  поля помечена идентификатором private, и оно не может изменяться извне. Чтобы добавить ребро объекту класса Dinic.cs, нужно вызвать его метод addEdge() со следующими аргументами:

  1. Число типа int, начало ребра
  2. Число типа int, конец ребра
  3. Число типа int, пропускная способность ребра.

 

 

Класс MaxFlowMinCost.cs предназначен для определения максимального  потока минимальной стоимости, который  рассчитывается тривиальным перебором. Исходный код класса:

 

    public static class MaxFlowMinCost

    {

        private static int findPath(int[,] cap, bool[] vis, int u, int t, int f)

        {

            if (u == t)

            {

                return f;

            }

            vis[u] = true;

            for (int v = 0; v < vis.Length; v++)

            {

                if (!vis[v] && cap[u,v] > 0)

                {

                    int df = findPath(cap, vis, v, t, Math.Min(f, cap[u,v]));

                    if (df > 0)

                    {

                        cap[u,v] -= df;

                        cap[v,u] += df;

                        return df;

                    }

                }

            }

            return 0;

        }

 

        public static int maxFlow(int[,] cap, int s, int t, int n)

        {

            for (int flow = 0; ; )

            {

                int df = findPath(cap, new bool[n], s, t, int.MaxValue);

                if (df == 0)

                {

                    return flow;

                }

                flow += df;

            }

        }

}

 

Здесь, чтобы получить величину максимального потока, необходимо вызвать  статичный метод maxFlow()  с аргументами:

Двумерный массив типа int, размером n строк и n столбцов – матрица  пропускных способностей.

  1. Число типа int, исток.
  2. Число типа int, сток.
  3. Число типа int, количество вершин.

 


Пункт 1. Основная часть.doc

— 252.00 Кб (Просмотреть файл, Скачать документ)

Информация о работе Модернизация компьютерной сети предприятия с целью достижения заданной пропускной способности