Курсовая по математическому программированию. Пояснительная записка Муравьев. Курсовая работа вариант 14 Рекуррентные соотношения и динамическое программирование Муравьев В. В
![]()
|
Министерство транспорта Российской Федерации Федеральное агентство железнодорожного транспорта Федеральное государственное бюджетное образовательное учреждение высшего образования «Дальневосточный государственный университет путей сообщения» (ДВГУПС) Кафедра «Информационные технологии и системы» Направление подготовки (специальности) 09.03.02 Информационные системы и технологии Дисциплина «Математическое программирование» КУРСОВАЯ РАБОТА Вариант 14 Рекуррентные соотношения и динамическое программирование Выполнил: Муравьев В.В. гр. БО231ИСТ Проверил: Карачанская Е.В. Хабаровск 2021 СодержаниеСодержание 2 Задание на курсовую работу 3 Введение 4 Общая постановка задачи динамического программирования и ее решение. 5 Рекуррентные соотношения. Числа Фибоначчи 8 Программная реализация решения поставленной задачи методом ДП. 10 Заключение 15 Список использованной литературы 16 Задание на курсовую работу«Динамическое программирование» по дисциплине «Математическое программирование» Студент Муравьев Вячеслав Валерьевич БО231ИСТ группы. Тема «Рекуррентные соотношения и динамическое программирование» Дата выдачи задания: 24 февраля 2021 года Срок сдачи: до 1 мая 2021 года – досрочно до 15 мая 2021 года – в срок. Задание на разработку: Изучить постановку задачи динамического программирования (ДП) и ее решение. Составление уравнений Бэллмана. В соответствии с вариантом решить задачу методом ДП (с составлением уравнений Бэллмана) Разработать программный продукт, решающий данный тип задач методом ДП с краткой инструкцией по его использованию. Пояснительная записка должна включать следующие основные разделы: Содержание. Текст задания (этот бланк). Введение (актуальность, цель, задачи) Общая постановка задачи динамического программирования и ее решение. Формулировка конкретной (в соответствии с вариантом) задачи, сведение ее к задаче динамического программирования, ее решение методом ДП. Программная реализация решения поставленной задачи методом ДП. Заключение. Список использованной литературы Компакт-диск с текстом пояснительной записки в формате MS Word и программный продукт с инструкцией пользователя. Рекомендуемая литература. Беллман Р., Дрейфус С. Прикладные задачи динамического программирования.—М.: Наука, 1965.— 458 с. Окулов С.М., Пестов О.А. Динамическое. программирование. 2-е издание (электронное). Москва БИНОМ. Лаборатория знаний 2015. Лежнев А.В. Динамическое программирование в экономических задачах . - М.: Бином. Лаборатория знани . 2010 . - 176 с. Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы_ построение и анализ. 2-е издание. Издательство: Вильямс,. - 2005. - 1293 c. Задание выдал доцент кафедры «Информационные технологии и системы» Карачанская Е.В. 24.02.2021 ВведениеБольшу́ю часть математических задач представляют задачи, требующие нахождения оптимального решения, выбора наилучшего варианта среди множества других, а также принятия рациональных решений. Данный тип задач требует перебора большого количества различных вариантов, что, во-первых, является трудоёмким процессом и занимает много времени, а во-вторых, повышает вероятность допущения ошибок. Метод динамического программирования является одним из наиболее мощных методов оптимизации, использующихся для решения вышеперечисленных задач. Его основной принцип заключается в разделении основной, более трудной задачи на множество мелких, решение которых представляется менее трудоёмким. В данной работе будет рассматриваться задача о рекуррентных соотношениях, а именно – задача о числах Фибоначчи. В основном последовательность Фибоначчи используется в анализе финансовых, товарных и иных рынков, прогнозировании трендовых товаров (волновая теория Эллиота) и архитектуре (золотое сечение). Целью данной работы является разработка программного продукта, позволяющего найти значение искомого элемента последовательности Фибоначчи по его номеру. Задачи курсовой работы: Изучить постановку задачи динамического программирования; Изучить постановку задачи о числах Фибоначчи; Решить конкретную задачу методом динамического программирования и составить уравнения Бэллмана; Разработать программный продукт, решающий данный тип задач методом динамического программирования; Составить краткое руководство пользователя к разработанной программе. Общая постановка задачи динамического программирования и ее решение.Пусть имеется некоторая физическая система ![]() ![]() ![]() ![]() ![]() На каждом шаге необходимо определить два типа переменных: переменную состояния системы ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Рисунок 1 – Граф состояний системы уравнений Предположим, что с процессом связана какая-то наша заинтересованность, выражающаяся целевой функцией ![]() ![]() и является аддитивной, т.е. складывается из полученных решений ![]() Состояние системы ![]() ![]() ![]() ![]() Задача динамического программирования заключается в нахождении такого оптимального управления ![]() При решении задачи динамического программирования используют принцип оптимальности Бэллмана: Каково бы ни было состояние ![]() ![]() Т.е. решение рассматриваемой задачи динамического программирования целесообразно начинать с определения оптимального решения на последнем, ![]() Математической формулировкой данного принципа являются функциональные уравнения Бэллмана, выглядящие следующим образом: ![]() Общая схема решения задач динамического программирования: Выбрать способ деления процесса управления на шаги; Определить параметры состояния ![]() ![]() Записать уравнения состояний; Ввести целевую функцию ![]() Ввести в рассмотрение условные максимумы (минимумы) ![]() ![]() ![]() Записать основные для вычислительной схемы динамического программирования уравнения Беллмана для ![]() ![]() Последовательно решить уравнения Беллмана; Результатом выполнения условной оптимизации является оптимальное решение для конкретного начального состояния ![]() ![]() Рекуррентные соотношения. Числа ФибоначчиГоворят, что последовательность ![]() ![]() Примером рекуррентного соотношения являются числа Фибоначчи. Числа Фибоначчи – последовательность чисел, в которой первые два числа равны 0 и 1, а каждое последующее число равно суме двух предыдущих. Более формально последовательность чисел Фибоначчи задаётся линейным рекуррентным соотношением: ![]() ![]() Формулировка задачи: по заданному номеру элемента ![]() ![]() Сведение к задаче динамического программирования. Очевидно, что данная задача имеет рекурсивное решение благодаря рекуррентной записи для вычисления элемента. Простое рекурсивное решение неэффективно, т.к. приходится многократно вычислять одни и те же значения элементов ряда. Например, из формул ![]() ![]() ![]() ![]() Сведём задачу к задаче динамического программирования. Пусть исходная задача T - это вычисление ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Составим уравнение Бэллмана: ![]() Решение конкретной задачи методом динамического программирования. Пусть ![]() При помощи составленного выше уравнения Бэллмана решим задачу: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вместо того, чтобы на каждом шаге заново вычислять элементы последовательности, мы используем уже полученные на предыдущих шагах данные, уменьшая тем самым время, затрачиваемое на решение задачи. Программная реализация решения поставленной задачи методом ДП.Код программы. Метод F, вычисляющий последовательность Фибоначчи: public ulong[] F(int n) { ulong[] fibonacci = new ulong[n+1]; for (int i = 0; i < fibonacci.Length; i++) { if (i == 0) //Если n=0 { fibonacci[i] = 0; textBoxProcess.Text = textBoxProcess.Text + $"F({i}) = {fibonacci[i]}" + '\r' + '\n'; } else if (i == 1) //Если n=1 { fibonacci[i] = 1; textBoxProcess.Text = textBoxProcess.Text + $"F({i}) = {fibonacci[i]}" + '\r' + '\n'; } else //Если n≥2 { fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]; textBoxProcess.Text = textBoxProcess.Text + $"F({i}) = {fibonacci[i]}" + '\r' + '\n'; } } return fibonacci; } Согласно выше определённому уравнению Бэллмана, данный метод вычисляет и возвращает массив элементов последовательности Фибоначчи. Его входным параметром является номер искомого элемента ![]() Нажатиекнопки «Вычислить»: if (int.TryParse(textBoxInput.Text, out int n) == false) MessageBox.Show("Неправильно заполнено поле с номером элемента! N - положительное натуральное число", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); else if (Convert.ToInt32(textBoxInput.Text) < 0) MessageBox.Show("Номер элемента не может быть отрицательным! Введите правильное значение", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); else textBoxOutput.Text = F(Convert.ToInt32(textBoxInput.Text))[Convert.ToInt32(textBoxInput.Text)].ToString(); После нажатия кнопки происходит проверка данных, введённых пользователем. Не должно быть так, что пользователь ввёл: ненатуральное число, символы алфавита и т.д.; отрицательное число. Если введённые данные соответствуют представленным условиям, то происходит вычисление последовательности Фибоначчи. Событие «Изменение значения поля textBoxInput» textBoxProcess.Clear(); textBoxOutput.Clear(); При изменении значения номера элемента последовательности ![]() Нажатие Enterв поле ввода номера элемента if (e.KeyCode == Keys.Enter) { buttonGO.PerformClick(); } Нажатие Enter выполняет те же функции, что и кнопка «Вычислить». Руководство пользователя Программный продукт, решающий поставленную задачу методом динамического программирования, был написан на языке программирования C# при помощи программного продукта Visual Studio и технологии Windows Forms. Программа состоит из одной главной формы (Рис. Рисунок 2), в которой находятся: - поле для ввода номера искомого элемента ![]() - поле, в котором выводятся вычисления значений предыдущих элементов; - поле, в котором выводится значение искомого элемента ![]() - кнопка «Вычислить», запускающая вычислительный процесс. ![]() Рисунок 2 – Главная форма приложения Для начала работы необходимо ввести номер элемента последовательности Фибоначчи ![]() Начать вычисление можно двумя способами: нажать кнопку «Enter» на клавиатуре, нажать кнопку (4) «Вычислить». После нажатия поля (3) и (4) будут автоматически заполнены. В поле (3) представлен ход решения задачи. Здесь можно увидеть значения всех предыдущих элементов. В поле (4) же можно увидеть значение искомого элемента. Пример работы приложения: ![]() Рисунок 3 – Пример работы приложения При работе с приложением могут возникнуть следующие ошибки: ![]() Данная ошибка появляется, когда пользователь в качестве номера элемента ![]() ![]() ИЛИ ![]() Данная ошибка появляется, когда пользователь в качестве номера элемента ![]() ![]() ЗаключениеВ ходе данной работы был изучен метод оптимизации «Динамическое программирование», постановка его задачи и способ практического применения. После чего данным способом была решена задача на рекуррентные соотношения. Конкретная задача, а именно задача на числа Фибоначчи, была сведена к задаче динамического программирования. После чего было составлено уравнение Бэллмана, на основе которого был разработан программный продукт, позволяющий решить данный вид задачи автоматически. Список использованной литературыВентцель Е. С. Исследование операций. 1972г. 552 с Новиков А.И. Экономико-математические методы и модели. 2017 Окулов С.М., Пестов О.А. Динамическое. программирование. 2-е издание (электронное). Москва БИНОМ. Лаборатория знаний 2015. Интернет-ресурс «Школа программиста». Статья «Динамическое программирование. Числа Фибоначчи» - URL: https://acmp.ru/article.asp?id_sec=1&id_text=1331 |