Автор работы: Пользователь скрыл имя, 25 Марта 2013 в 18:00, курсовая работа
Целью моего курсового проекта является решение задач методами динамического программирования, нахождение кратчайшего пути.
Для решения задачи о нахождении кратчайшего пути в графе будет использован алгоритм Дейкстры.
Алгоритм Дейкстры разработан для нахождения кротчайшего пути между заданным исходным узлом и любым другим узлом сети. Он широко применяется в программировании и технологиях, например, его использует протокол OSPF для устранения кольцевых маршрутов.
Введение
1.Общая часть
1.1.Постановка задачи
1.1.1.Экономическая постановка задачи
1.1.2.Математическая постановка задачи
1.2.Обзор существующих решений
2.Технологическая часть
2.1. Динамическое программирование
3.Специальная часть
3.1.Описание метода решения.
3.2.Решение задачи теста для написания и отладки программы
3.3.Анализ полученных результатов
3.4.Входные и выходные данные работы программы
3.5.Организация диалога
3.6. Разработка алгоритма
3.7.Обоснование выбора средств разработки
3.8.Описание программных модулей
3.9.Тестирование программы
3.10.Инструкция пользователю
Заключение
После ввода данных, выводится матрица инцедентности. Которая указывается в массиве.
После указания начальной точки пути и конечной, начинается выполнения цикла на поиск минимального расстояния от начального до конечного графа. И затем выводит сумму пути.
3.7. Обоснование выбора средств разработки
Для разработки программы будет использоваться язык С#.
С# или «си шарп» - это язык программирования, который является объектно-ориентированным и применяется для разработки модулей и компонентов для Windows NET платформы.
На данный момент язык программирования C# набирает очень большой темп, и нет столь простого и многофункционального языка, как Си шарп. В нем собраны все достоинства разных языков. Быстродействие выполнения приближается к языку Assembler.
Язык Си шарп имеет 300 000 библиотек разных функций, которые работают с максимальным быстродействием.
C#
относится к семье языков с
C-подобным синтаксисом, из
Переняв многое от своих предшественников — языков C++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддерживает множественное наследование классов (в отличие от C++).
C#
разрабатывался как язык
3.8. Описание программных модулей.
Программа решения задачи написанная на языке программирования C++ содержит в себе 3 вида переменных, цикл для строк и столбцов, команды для вывода результатов на экран.
Int – тип переменной, которая может принимать только целые значения.
Типы данных word и char
For - этот цикл действует различным образом в разных частях кода. Изначально инициализируя часть цикла. Программа вычисляет условие. Заданное условием if. Если это значение истинно, программа выполняет тело цикла. Высчитывает и выводит ответ.
3.9. Тестирование программы.
Для тестирования программы была использована задача из 3.2. Результаты программного решения совпали с результатами самостоятельного решения, значит программа корректна. Скриншоты решения тестовой задачи отображены в Приложении В.
Данный программный продукт является способом решения задач линейного программирования симплекс – метода. Программа не предполагает установки и работает при запуске .exe файла. Программа работает в операционной системе Windows, для запуска требуется двойной клик по исполняемому файлу. Откроется окно командной строки, в котором осуществляется диалог с программой. Ввод данных, происходит по средствам клавиатуры.
В данном курсовом проекте была рассмотрена проблема решения задач методом динамического программирования,нахождения кратчайшего пути. Существует три алгоритма решения такого типа задач: алгоритм Дейкстры, алгорит Флойда, переборные алгоритмы.
Более подробно рассмотрен первый и написан программный продукт на его основе. В качестве языка программирования был выбран С++. Перед написанием программы была самостоятельно решена тестовая задача. Программа была разработана и протестирована.
Данная программа прекрасно войдет в учебный процесс, преподаватели посредством ее смогут проверять решенные задачи учеников, сокращая временные рамки работы. Она может использоваться и в обратно пропорциональном плане, учениками, для проверки соответствия решений.
Таким образом, поставленные задачи выполнены и цель курсового проекта достигнута.
Список литературы
1.Агальцов В.П., Валдайская И.В. Математические методы в программировании: Учебник. – М.: ИД «ФОРУМ»: ИНФРА-М, 2006. – 224 с.: ил. – (Профессиональное образование).
2.Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования: Учебное пособие. - М.: Форум: Инфра-М, 2004
3.Орлов В.В. Технологии разработки программных продуктов. - СПб.: Питер, 2003. - 437 с.
4.Партыка Т.Л., Попов И.И. Математические методы: Учебник. – М.: ФОРУМ: ИНФРА-М, 2005. – 464с.: ил. – ( Профессиональное образование)
Приложение А
Глоссарий понятий
Приложение Б
Текст программы
#include "stdafx.h"
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define word unsigned int
using namespace std;
int i, j, n, p, xn, xk;
int flag[11];
word c[11][11], l[11];
char s[80], path[80][11];
int min(int n)
{
int i, result;
for(i=0;i<n;i++)
if(!(flag[i])) result=i;
for(i=0;i<n;i++)
if((l[result]>l[i])&&(!flag[i]
return result;
}
word minim(word x, word y)
{
if(x<y) return x;
return y;
}
void main()
{
cout<<"Napishite chislo tochek:";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++) c[i][j]=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
cout<<" Zadaite dlinu reber: x"<<i+1<<" do x"<<j+1<<": ";
cin>>c[i][j];
}
cout<<" ";
for(i=0;i<n;i++) cout<<" X"<<i+1;
cout<<endl<<endl;
for(i=0;i<n;i++)
{
printf("X%d",i+1);
for(j=0;j<n;j++)
{
printf("%6d",c[i][j]);
c[j][i]=c[i][j];
}
printf("\n\n");
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(c[i][j]==0) c[i][j]=65535; //nekonecno
cout<<" Zadaite nachalnuy tochku: ";
cin>>xn;
cout<<" Zadaite konechnuy tochku: ";
cin>>xk;
xk--;
xn--;
if(xn==xk)
{
cout<<"Nachalnaya & Konechnaya tochki sovpadaut"<<endl;
getch();
return;
}
for(i=0;i<n;i++)
{
flag[i]=0;
l[i]=65535;
}
l[xn]=0;
flag[xn]=1;
p=xn;
itoa(xn+1,s,10);
for(i=1;i<=n;i++)
{
strcpy(path[i],"X");
strcat(path[i],s);
}
do
{
for(i=0;i<n;i++)
if((c[p][i]!=65535)&&(!flag[i]
{
if(l[i]>l[p]+c[p][i])
{
itoa(i+1,s,10);
strcpy(path[i+1],path[p+1]);
strcat(path[i+1],"-X");
strcat(path[i+1],s);
}
l[i]=minim(l[i],l[p]+c[p][i]);
}
p=min(n);
flag[p]=1;
}
while(p!=xk);
if(l[p]!=65535)
{
cout<<"Put: "<<path[p+1]<<endl;
cout<<"Dlina puti: "<<l[p]<<endl;
}
else
cout<<"Puti net!"<<endl;
getch();
}
Приложение В
Видовые экраны работы программы
Рис. В1- начало работы программы.
Рис.В2- Ввод данных.
Рис.В3.- Получение матрицы.
Рис. В4- Результат решения.
Приложение Г
Алгоритм решения задачи