1561. Програмный модуль анализа производительности метода динамического программирования на примере задачи упаковки
Диплом |
25.06.2010, 13:32
Стоимость 3500. Год 2010.
ОГЛАВЛЕНИЕ 2 ВВЕДЕНИЕ 3 ГЛАВА 1. ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ 5 1.1. Анализ производительности алгоритмов 5 1.2. Требования к программному модулю анализа производительности алгоритма 17 1.3. Анализ процессов в проектируемой системе 18 ГЛАВА 2. ПРОЕКТИРОВАНИЕ ПРОГРАММНОГО МОДУЛЯ 22 2.1. Требования к функциональным и рабочим характеристикам объекта разработки 22 2.2.Анализ путей решения задачи 22 2.3. Задача упаковки 24 Математическая постановка задачи 25 2.3.1. Обзор известных методов решения задачи 27 2.3.2. Суть метода динамического программирования 29 2.3.3 Уравнение Беллмана для задачи о рюкзаке 33 2.4. Реализации метода динамического программирования для задачи о рюкзаке 34 2.4.1. Табличная реализация и её сложность 34 2.4.2 Рекурсивная реализация и её сложность 38 2.4.3. Сравнение алгоритмов по сложности 39 2.5. Определение первичных требований к интерфейсу пользователя 41 2.6. Разработка алгоритма работы модуля анализа производительности 44 ГЛАВА 3. РЕАЛИЗАЦИЯ ПРОГРАММНОГО МОДУЛЯ 45 3.1. Выбор инструментальных средств 45 3.2. Реализация алгоритма решения задачи упаковки 46 3.3. Результаты тестирования анализа производительности метода динамического программирования на примере задачи упаковки 51 ГЛАВА 4. БЕЗОПАСНОСТЬ ЖИЗНЕДЕЯТЕЛЬНОСТИ 53 4.1 Анализ условий труда пользователя 55 4.2. Расчет интегральной бальной оценки тяжести труда пользователя 62 4.3. Характеристика отходов использованных ПЭВМ 67 ЗАКЛЮЧЕНИЕ 74 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ 76 Литература 76
Анализируя
алгоритм, можно получить представление о том, сколько времени займет решение
данной задачи при помощи данного алгоритма. Для каждого рассматриваемого
алгоритма мы оценим, насколько быстро решается задача на массиве входных
данных длины N. Например, мы можем оценить, сколько сравнений потребует алгоритм
сортировки при упорядочении списка из Nвеличин по возрастанию, или подсчитать, сколько
арифметических операций нужно для умножения двух матриц размером N х N.
Одну
и ту же задачу можно решить с помощью различных алгоритмов.Анализ алгоритмов дает нам инструмент для
выбора алгоритма.
Различные
характеристики алгоритмов предназначены для сравнения эффективности двух
разных алгоритма, решающих одну задачу. Поэтому мы никогда не будем сравнивать
между собой алгоритм сортировки и алгоритм умножения матриц, а будем
сравнивать друг с другом два разных алгоритма сортировки.
Результат
анализа алгоритмов — не формула для точного количества секунд или компьютерных
циклов, которые потребует конкретный алгоритм. Такая информация бесполезна,
так как в этом случае нужно указывать также тип компьютера, используется ли он
одним пользователем или несколькими, какой у него процессор и тактовая частота,
полный или редуцированный набор команд на чипе процессора и насколько хорошо
компилятор оптимизирует выполняемый код. Эти условия влияют на скорость работы
программы, реализующей алгоритм. Учет этих условий означал бы, что при
переносе программы на более быстрый компьютер алгоритм становится лучше, так
как он работает быстрее. Но это не так, и поэтому анализ алгоритмов не
учитывает особенностейкомпьютера.
В случае небольшой или простои программы количество
выполненных операции как функцию от N
можно посчитать точно. Однако в большинстве случаев в этом нет нужды.
Разница между алгоритмом, который делает N
+ 5 операции, и тем, который делает N + 250 операции, становится незаметной, как только N становится очень большим. Тем не
менее, анализ алгоритмов начинается с подсчета точного количества операций.
В
самой ранней работе по анализу алгоритмов определена вычислимость алгоритма в
машине Тьюринга. При анализе подсчитывается число переходов, необходимое для
решения задачи. Анализ пространственных потребностей алгоритма подразумевает
подсчет числа ячеек в ленте машины Тьюринга, необходимых для решения задачи.
Такого рода анализ разумен, и он позволяет правильно определить относительную
скорость двух алгоритмов, однако его практическое осуществление чрезвычайно
трудно и занимает много времени. Сначала нужно строго описать процесс
выполнения функций перехода в машине Тьюринга, выполняющей алгоритм, а затем
подсчитать время выполнения — весьма утомительная процедура.
Другой,
не менее осмысленный, способ анализа алгоритмов предполагает, что алгоритм
записан на каком-либо языке высокого уровня вроде Pascal, С, C++, Java или достаточно общем псевдокоде.
Особенности псевдокода не играют существенной роли, если он реализует основные
структуры управления, общие для всех алгоритмов. Такие структуры, как циклы
вида for или while, механизм ветвления вида if, case или switch, присутствуют в любом языке программирования, и
любой такой язык подойдет для наших целей. Всякий раз нам предстоит
рассматривать один конкретный алгоритм в нем редко будет задействовано больше
одной функции или фрагмента программы, и поэтому мощность упомянутых выше
языков вообще не играет никакой роли.
Роль
входных данных в анализе алгоритмов также чрезвычайно велика, поскольку
последовательность действий алгоритма определяется не в последнюю очередь
входными данными.
Скажем,
некоторые алгоритмы сортировки могут работать очень быстро, если входной
список уже отсортирован, тогда как другие алгоритмы покажут весьма скромный
результат на таком списке. А вот на случайном списке результат может оказаться
противоположным.
Например,
для того, чтобы найти наибольший элемент в списке из N элементов, можно воспользоваться следующим алгоритмом:
largest = list[l]
for i = 2 to N do
if (list[i]>largest)then largest = list[i]
endifendfor
Ясно, что если список упорядочен в порядке убывания, то перед на