- •Пояснительная записка
- •Задание на курсовую работу
- •2015 Реферат
- •Введение
- •1 Описание предметной области
- •1.1 Сведения из теории
- •1.2 Алгоритм Дейкстры
- •1.3 Область применения
- •1.4 Алгоритм решения
- •1.5 Макет приложения
- •1.6 Описание программы
- •2Руководство пользователя
- •2.1 Результат работы программ
- •2.2Руководство пользователя
- •Заключение
- •Список использованных источников
- •Приложения
Заключение
В ходе выполнения курсовой работы были выполнены все поставленные задачи, а так же был получен дополнительный опыт разработки приложений на языке C# с применением алгоритма Дейкстры.
Результатом выполнения является работоспособная программа,способная задавать вершины, строить граф и находить кратчайший путь между указанными точками.
Были максимально предусмотрены всевозможные ошибки, которые могут возникнуть при использовании данной программы, однако это не исключает возможность их появления.
Программа не требует больших ресурсных затрат, интерфейс рассчитан на простого пользователя.
Список использованных источников
Герберт Шилдт. «Полный справочник по C#» [Текст] / Герберт Шилдт. – ООО «И.Д. Вильямс», 2010. – 780 с.
CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#. 4-е изд.[Текст] / Дж.Рихтер – Москва: Дом Книги, 2011.
Бьёрн Страуструп «Язык программирования C#». [Текст] / Бьёрн Страуструп – Специальное издание. Москва: Бином-Пресс, 2010. — 1104 с.
Язык программирования C#. Классика ComputersScience. 4-е изд.[Текст] / А. Хейлсерберг, М. Торгерсен— БХВ-Петербург, 2011. — С. 336.
Изучаем C#. 3-е изд.[Текст] / Э. Стиллмен— М.: ДМК Пресс, 2011. — С. 304.
Приложения
Приложение 1.
Кодпрограммы«Алгоритм Дейкстры для поиска кратчайшего пути»
КодForm1.cs
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
namespacedeikstra
{
public partial class Form1 : Form
{
/// <summary>
/// Матрица смежености, по которой буде строиться граф
/// </summary>
privateint[,] matrixAdjacency = new int[,]
{
//1 2 3 4 5 6 7 8 9 10 11
{0, 6, 3, 2, 8, 0, 0, 0, 0, 0, 0},
{6, 0, 2, 0, 0, 0, 7, 8, 0, 0, 0},
{3, 2, 0, 0, 0, 6, 0, 12, 0, 0, 0},
{2, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0},
{8, 0, 0, 5, 0, 14, 0, 0, 5, 0, 0},
{0, 0, 6, 0, 14, 0, 11, 6, 10, 0, 9},
{0, 0, 0, 0, 0, 11, 0, 0, 4, 12, 7},
{0, 8, 12, 0, 0, 6, 0, 0, 0, 0, 3},
{0, 0, 0, 3, 5, 10, 4, 0, 0, 2, 0},
{0, 0, 0, 0, 0, 0, 12, 0, 2, 0, 5},
{0, 0, 0, 0, 0, 9, 7, 3, 0, 5, 0}
};
/// <summary>
/// Списоквершинграфа
/// </summary>
private List<EdgeGraph>listEdgeG = new List<EdgeGraph>();
/// <summary>
/// Списокреберграфа
/// </summary>
private List<NodeGraph>listNodeG = new List<NodeGraph>();
privateintcnt = 1;
/// <summary>
/// Индексначальнойвершины
/// </summary>
privateintsrc_index;
/// <summary>
/// Индексконечнойвершины
/// </summary>
privateintdest_index;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
for (inti = 0; i<matrixAdjacency.GetLength(0); ++i)
{
for (int j = 0; j <matrixAdjacency.GetLength(1); ++j)
{
if (i > j &&matrixAdjacency[i, j] != 0)
{
EdgeGraph edge = new EdgeGraph(listNodeG[i].point, listNodeG[j].point,
matrixAdjacency[i, j].ToString());
edge.draw_edge(pictureBox1.CreateGraphics(), 1);
listEdgeG.Add(edge);
}
}
}
foreach (var x in listNodeG)
{
x.draw_number(pictureBox1.CreateGraphics());
}
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Напоминание: Разместите на форме " + (matrixAdjacency.GetLength(0)) + " вершин...";
}
privateintcheckCnt = 1;
privateint checkCnt1 = 1;
privatebool flag = true;
} /// <summary>
/// рисует вершини и выделяет зеленым цветом начальну и красным конечню вершину
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
//Рисуемсначаланашивершины
if (checkCnt<= matrixAdjacency.GetLength(0))
{
NodeGraphng = new NodeGraph(e.X, e.Y, (cnt++).ToString());
ng.draw_node(pictureBox1.CreateGraphics(), Color.Black); // черныеточки - вершины
listNodeG.Add(ng);
++checkCnt;
}
//фикисруем начальную и конечную вершины
else
{
for (inti = 0; i<listNodeG.Count; ++i)
{
if (checkCnt1 <= 2)
{
if (e.X>= listNodeG[i].point.X - 15 &&e.X<= listNodeG[i].point.X + 15
&&e.Y>= listNodeG[i].point.Y - 15 &&e.Y<= listNodeG[i].point.Y + 15)
{
if (flag == true)
{
src_index = i;
listNodeG[i].draw_node(pictureBox1.CreateGraphics(), Color.Chartreuse); // выделяемначальнуювершину
flag = false;
++checkCnt1;
}
else
{
dest_index = i;
listNodeG[i].draw_node(pictureBox1.CreateGraphics(), Color.Red); // выделяемконечнуювершину
++checkCnt1;
}
}
}
}
}
}
privatevoidbutton2_Click(objectsender, EventArgse) // Ищемивыделяемжирнымкратчайшийпутьотначальнойвершиныдоконечной
{
try
{
var list = GraphMethods.DoDijkstra(matrixAdjacency, src_index, dest_index);
for(inti = 0; i<list.Count - 1; ++i)
{
EdgeGraphedg = new EdgeGraph(listNodeG[list[i]].point, listNodeG[list[i + 1]].point);
edg.draw_edge(pictureBox1.CreateGraphics(), 4);
foreach (var x in listNodeG)
{
x.draw_number(pictureBox1.CreateGraphics());
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button3_Click(object sender, EventArgs e) // вызываемперерисовкуэлементаиперезапускаем
{
pictureBox1.Image = null;
pictureBox1.Invalidate();
Application.Restart();
}
Код Graph.cs
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
using System.Threading.Tasks;
namespacedeikstra
{
/// <summary>
/// Класс "граф"
/// </summary>
class Graph
{
/// <summary>
/// Списокребер
/// </summary>
Dictionary<int, Dictionary<int, int>> vertices = new Dictionary<int, Dictionary<int, int>>();
/// <summary>
/// Метод додавания вершины в список
/// </summary>
/// <param name="name"></param>
/// <param name="edges"></param>
public void add_vertex(int name, Dictionary<int, int> edges)
{
vertices[name] = edges;
}
/// <summary>
/// Нахождениекратчайшегопутимежду start и finish
/// </summary>
/// <param name="start"></param>
/// <param name="finish"></param>
/// <returns></returns>
public List<int>shortest_path(int start, int finish) // кратчайшийпуть
{
var previous = new Dictionary<int, int>();
var distances = new Dictionary<int, int>();
var nodes = new List<int>();
List<int> path = null;
foreach (var vertex in vertices)
{
if (vertex.Key == start)
{
distances[vertex.Key] = 0;
}
else
{
distances[vertex.Key] = int.MaxValue;
}
nodes.Add(vertex.Key);
}
while (nodes.Count != 0)
{
nodes.Sort((x, y) => distances[x] - distances[y]);
var smallest = nodes[0];
nodes.Remove(smallest);
if (smallest == finish)
{
path = new List<int>();
while (previous.ContainsKey(smallest))
{
path.Add(smallest);
smallest = previous[smallest];
}
break;
}
if (distances[smallest] == int.MaxValue)
{
break;
}
foreach (var neighbor in vertices[smallest])
{
var alt = distances[smallest] + neighbor.Value;
if (alt < distances[neighbor.Key])
{
distances[neighbor.Key] = alt;
previous[neighbor.Key] = smallest;
}
}
}
returnpath;
}
}
}
Код GraphMethods.cs
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
using System.Threading.Tasks;
namespacedeikstra
{
/// <summary>
/// Класс "методыграфа"
/// </summary>
internal static class GraphMethods
{
/// <summary>
/// Метод преобразования матрицы смежености в список ребер и поиск кратчайшего пути
/// </summary>
/// <param name="m"></param>
/// <param name="s"></param>
/// <param name="e"></param>
/// <returns></returns>
static public List<int>DoDijkstra(int[,] m, int s, int e)
{
Graph g = new Graph();
for (inti = 0; i<m.GetLength(0); ++i)
{
Dictionary<int, int>buf = new Dictionary<int, int>();
for (int j = 0; j <m.GetLength(1); ++j)
if (m[i, j] != 0)
buf.Add(j, m[i, j]);
g.add_vertex(i, buf);
}
var l = g.shortest_path(s, e);
l.Add(s);
l.Reverse();
return l;
}
}
}
Код NodeGraph.cs
using System;
usingSystem.Collections.Generic;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Security.AccessControl;
using System.Security.Cryptography.X509Certificates;
usingSystem.Text;
usingSystem.Threading.Tasks;
using System.Windows.Forms;
namespacedeikstra
{
/// <summary>
/// Класс "Узелграфа"
/// </summary>
classNodeGraph
{
/// <summary>
/// Описываетузелграфакакточкунапикчербоксе
/// </summary>
public Point point { get; set; }
/// <summary>
/// Текствузле
/// </summary>
public string number { get; set; }
//перегрузкаконструкторов
publicNodeGraph()
{
point = new Point();
}
publicNodeGraph(int _X, int _Y, string _num)
{
point = new Point(_X, _Y);
number = _num;
}
publicNodeGraph(Point _p, string _num)
{
point = _p;
number = _num;
}
/// <summary>
/// Рисует узел по заданум цвету
/// </summary>
/// <param name="g"></param>
/// <param name="color"></param>
public void draw_node(Graphics g, Color color)
{
g.DrawEllipse(new Pen(Color.Black), point.X - 13, point.Y - 12, 30, 30);
g.FillEllipse(new SolidBrush(color), point.X - 13, point.Y - 12, 30, 30);
draw_number(g);
g.Dispose();
}
/// <summary>
/// Рисует текст в узле, в даном случае число
/// </summary>
/// <param name="g"></param>
public void draw_number(Graphics g)
{
Font font = new Font("Times New Roman", 12, FontStyle.Bold);
g.DrawString(number, font, new SolidBrush(Color.Blue), point.X - 4, point.Y - 5);
g.Dispose();
}
}
}
