Автор работы: Пользователь скрыл имя, 05 Декабря 2013 в 04:18, курсовая работа
Большинство методов исследования операций связано в первую очередь с задачами вполне определенного содержания. Классический аппарат математики оказался малопригодным для решения многих задач оптимизации, включающих большое число переменных и/или ограничений в виде неравенств. Несомненна привлекательность идеи разбиения задачи большой размерности на подзадачи меньшей размерности, включающие всего по нескольких переменных, и последующего решения общей задачи по частям.
1 ДИНАМИЧЕСКОЕ ПРОГРАММИРОВАНИЕ1.1 Задача динамического программирования
Большинство методов исследования операций связано в первую очередь с задачами вполне определенного содержания. Классический аппарат математики оказался малопригодным для решения многих задач оптимизации, включающих большое число переменных и/или ограничений в виде неравенств. Несомненна привлекательность идеи разбиения задачи большой размерности на подзадачи меньшей размерности, включающие всего по нескольких переменных, и последующего решения общей задачи по частям. Именно на этой идее основан метод динамического программирования. Динамическое программирование (ДП) представляет собой математический метод, который можно использовать для решения весьма широкого круга задач, включая задачи распределения ресурсов, замены и управления запасами, задачи о загрузке. Характерным для динамического программирования является подход к решению задачи по этапам, с каждым из которых ассоциирована одна управляемая переменная. Набор рекуррентных вычислительных процедур, связывающих различные этапы, обеспечивает получение допустимого оптимального решения задачи в целом при достижении последнего этапа. Происхождение названия динамическое программирование, вероятно, связано с использованием методов ДП в задачах принятия решений через фиксированные промежутки времени (например, в задачах управления запасами). Однако методы ДП успешно применяются также для решения задач, в которых фактор времени не учитывается. По этой причине более удачным представляется термин многоэтапное программирование, отражающий пошаговый характер процесса решения задачи | ||||||
Лист | ||||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
Динамическое программирование позволяет осуществлять оптимальное планирование управляемых процессов. Под «управляемыми» понимаются процессы, на ход которых мы можем в той или другой степени влиять. Динамическое программирование – это поэтапное планирование многошагового процесса, при котором на каждом этапе оптимизируется только один шаг. Управление на каждом шаге должно выбираться с учетом всех его последствий в будущем. | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
1.2 Общая структура динамического программирования
Для реализации такого метода необходимо выяснить все ситуации, в которых может происходить выбор последнего решения. Обычно условия, в которых принимается решение, называют «состоянием» системы. Состояние системы – это описание системы, позволяющее, учитывая будущие решения, предсказать ее поведение. Нет необходимости выяснять, как возникло то ил иное состояние или каковы были предшествующие решения. Это позволяет последовательно выбирать всего по одному решению в каждый момент времени. Независимо от того, отыскивают оптимальные решения с помощью табличного метода и последующего поиска или аналитическим путем, обычно быстрее и выгоднее производить выбор по одному решению в один момент времени, переходя затем к следующему моменту и т.д. К сожалению, таким методом можно исследовать не все процессы принятия решений. Необходимым условием применения
метода динамического програм- | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
Тогда уже не
нужно рассматривать 2 ЗАДАЧА О ЗАГРУЗКЕ2.1 Общие сведения
Задача о загрузке – это задача о рациональной загрузке судна (самолета, автомашины и т.п.), которое имеет ограничения по объему или грузоподъемности. Каждый помещенный на судно груз приносит определенную прибыль. Задача состоит в определении загрузки судна такими грузами, которые приносят наибольшую суммарную прибыль. Рекуррентное уравнение процедуры обратной прогонки выводится для общей задачи загрузки судна грузоподъемностью W предметов (грузов) n наименований. Пусть mi-количество предметов і-го наименования, подлежащих загрузке, ri-прибыль, которую приносит один загруженный предмет і-го наименования, wi-вес одного предмета і-го наименования. Общая задача имеет вид следующей целочисленной задачи линейного программирования. Максимизировать z=r1m1+r2m2+…+rnmn. при условии, что w1m1+w2m2+…+wnmn m1,m2,…,mn
| ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
Три
элемента модели динамического
Задачу о загрузке можно решить несколькими различными способами. | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
2.2 Методы решения задачи о рюкзаке
2.2.1 Метод перебора
Заключается в переборе всех возможных сочетай. Всегда находит оптимальное решение. Минус метода заключается в том, что при большом количестве предметов и огромной массе рюкзака необходимо достаточно много места, чтоб хранить массивы, в которых хранятся предметы и полученная сумма. Также на обработку таких массивов требуется значительное время.
Например, если количество предметов может достигать 1000, а грузоподъемность – 50000 (как в моей задаче), то количество возможных переборов равно 500001000 , а это занимает также много времени. | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
2.2.2 Рекуррентный метод
Для решения задачи этим методом необходимо разделить ее на шаги. На первом шаге загружаем рюкзак только первым грузом. На втором шаге загружаем первый и второй груз. На n-ном шаге загружаем все n грузов. На каждом шаге количество загрузки определять по формуле:
В результате вычислений заполняется две таблицы: одна содержит значения, обозначающие, сколько каждого предмета надо положить в рюкзак на каждом шаге. Во второй таблице хранятся значения функции на каждом шаге для всех предметов. Оптимальное решение получаем на последнем шаге, то есть для этого необходимо заполнить обе таблицы. Минусом метода является то, что при большом количестве предметов и большой грузоподъемности таблицы получаются тоже очень большими, а хранить все в ОЗУ неудобно, так как при этом снижается скорость обработки данных.
2.2.3 Жадный метод
Суть метода заключается в том, что из всех значений стоимости выбираем максимальное. После этого из всех предметов с максимальной стоимостью выбираем тот, который меньше весит. Затем заполняем рюкзак максимально этим предметом. Если остается место, то повторяем алгоритм еще раз. В большинстве случаев решение получается оптимальным. Исключением являются те случаи, когда встречаются предметы, цена которых не на много больше остальных, а вес значительно отличается. Но если взять пример из реальной жизни, то тонна груза не может стоить очень мало.
| ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
Преимуществом метода является также
время его работы. За счет того, что
отсутствует необходимость Для применения на практике этот алгоритм более удобен, так как при загрузке, например судна не всегда есть время, чтобы дождаться решения метода перебора или рекуррентного метода.
ПРИЛОЖЕНИЕ А
Текст программы
procedure TForm13.Button1Click(Sender: TObject); //основной алгоритм begin //Ввод данных n := StrTointDef(Edit1.Text, 0); // запоминаем количество предметов sum := StrTointDef(Edit2.Text, 0); // запоминаем вес ранца
if n = 0 then // проверка введено ли количество предметов begin //если не введено, то выводим сообщение ShowMessage('Не задано количество предметов'); exit end; if sum = 0 then //проверка задан ли вес ранца begin //если не заданвведено, то выводим сообщение ShowMessage('Не задан максимальный вес ранца'); exit end; flag:=true; //если массивы веса и стоимости предметов были заполнены автоматически, значит они уже существуют, иначе необходимо их создать. if flag=true then begin new(a); new(sp); end; | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист | ||
with StringGrid1 do for i := 1 to n do
begin a[i] := StrTointDef(Cells[1,i], 0); // заполнение массива А весами предметов sp[i] := StrTointDef(Cells[2,i], 0); // и массива SP стоимостью предметов end;
memo1.Text:='';//очищаем поле вывода от лишних записей memo1.Text:=memo1.Text+'В рюкзак надо положить:'; ost:=sum; //переменная ost используется в расчетах для определения оставшегося свободного места cena:=0;//переменная служит для вычисления суммарной прибыли загрузки REPEAT max:=0; i:=1; repeat // Для того, чтобы не просматривать предметы, которые уже уложены в рюкзак или которые слишком тяжелы для него, обнуляется значение стоимости. В цикле присваиваем ячейке max первое ненулевое значение. if sp[i]<>0 then max:=sp[i] else i:=i+1 until max<>0; | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
s:=a[nom]; //ячейка s содержит значение веса предмета, который сейчас будет положен в рюкзак kolvo:=ost div s;//количество предметов с максимальной стоимостью и минимальным весом равно целой части от деления общей грузоподъемности рюкзака на вес укладываемого предмета Memo1.Lines.Add(inttostr(nom) cena:=cena+kolvo*sp[nom];// рачсет полученной прибыли ost:=ost-kolvo*a[nom];// расчет оставшегося места for i:=1 to k do //обнуляем стоимость,чтобы больше не просматривать эти значения begin a[num[i]]:=0; sp[num[i]]:=0; end; min:=0; i:=1; repeat //сравниваем минимальное значение веса с остаавшимся if a[i]<>0 then min:=a[i] //проверяем, есть ли предмет,вес которого не равен нулю else i:=i+1 until (min<>0) or (i>n);
dispose(m1);//уничтожение динамических массивов dispose(m2); dispose(num) UNTIL (min>ost) or (min=0);//основной алгоритм завершается, когда минимальное значение веса больше оставшегося места //новый алгоритм Memo1.Lines.Add('Прибыль в Memo1.Text:=memo1.Text+ IntToStr(cena);//вывод результата на экран dispose(sp);// уничтожение динамических массивов dispose(a);
end; | ||||||
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |
|
Лист | |||||
| ||||||
Изм |
Дата |
№ документа |
Подл |
Лист |