Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora.doc
Скачиваний:
22
Добавлен:
28.10.2018
Размер:
543.74 Кб
Скачать

31.Задачей целочисленного программирования называется задача линейного программирования, в которой имеется дополнительное условие, требующее, чтобы часть переменных принимала только целые значения.

z=cTx→max Ax =b,  (2.4.1)x ≥ 0, xi∈Z, i∈I.

Примером такой задачи может служить задача о рюкзаке, в которой все переменные должны быть целыми и имеется одно ограничение-равенство.

Для решения задачи (2.4.1) можно применять метод ветвей и границ.

1. Способ вычисления оценок. Для вычисления оценки в задаче (2.4.1) уберем условия целочисленности переменных (получится обычная задача линейного программирования). Поскольку число допустимых планов увеличится, следовательно, оптимальное значение целевой функции в полученной задаче будет оценкой сверху для целевой функции в задаче (2.4.1). Если при этом решение x* новой задачи будет иметь целочисленные координаты x*i, i∈I, то этот же вектор будет и решением (2.4.1).

2. Способ ветвления. Пусть координата x*J не является целой, C=[x*J]≠x*J. Все допустимые планы в задаче (2.4.1) можно разбить на две части по следующему признаку: одни планы удовлетворяют условию

xJ≤ С,      (2.4.2)

другие – условию xJ≥ С+1(2.4.3)

Для получения оценок мы также будем решать задачи линейного программирования. При этом найденное на предыдущем шаге решение x* не является допустимым планом ни для одной из этих задач. Однако в каждой из них возможно применение двойственного симплекс-метода.

35.Общие принципы дискретного динамического программирования. Уравнение Беллмана.

Динамическое программирование – это метод решения задач оптимизации, характеризующийся наличием следующих этапов:

1. Инвариантное погружение. Исходная задача P оптимизации помещается в семейство аналогичных задач P(t), t∈T, каждая из которых состоит в нахождении оптимального элемента x∈X с учетом некоторых ограничений (P = P(t0), t0∈T).

2. Уравнение Беллмана. Пусть x*(t) – решение задачи оптимизации P(t), t∈T, B(t) – оптимальное значение целевой функции в этой задаче.

Функция B(t) называется функцией Беллмана. Уравнением Беллмана называется уравнение, в которое входят функции B(t) и x*(t) для различных значений параметра t.

3. Решение семейства задач. Среди задач семейства Т есть более простые, решить которые не представляет большого труда. Подставляя найденные значения функций B(t) и x*(t) для этих задач в уравнение Беллмана, мы получаем возможность найти эти функции и для других задач  семейства. Постепенно расширяя круг решенных задач семейства, мы стремимся найти решение исходной задачи, также являющейся элементом семейства.

Применение метода динамического программирования фактически состоит в удачном составлении уравнения Беллмана.

Реализация идеологии динамического программирования для конкретной задачи – это скорее искусство, чем наука. Научиться этому можно, рассмотрев достаточное количество примеров. Ниже мы рассмотрим примеры использования динамического программирования в комбинаторных задачах. Позже, при изучении теории оптимального управления, мы рассмотрим исторически первый пример динамического программирования, предложенный Р.Беллманом.

36. Задача распределения ресурсов.

Имеется С единиц некоторого ресурса и n производственных процессов. При использовании в i-ом производственном процессе x единиц ресурса, прибыль составляет fi(x).

Необходимо найти оптимальное распределение ресурсов по производственным процессам, дающее максимальную прибыль.

Формально задачу можно записать в виде

f1(x1)+…+ fn(xn) → max

x1+…+ xn ≤ C,                                                                                  (3.2.1)

x1,…, xn ≥ 0 – целые.

Задача похожа на задачу целочисленного программирования, только целевая функция у нее не является линейной. Функции fk часто задаются не формулой, а таблицей значений.

Решение задачи методом динамического программирования

I. Инвариантное погружение. Рассмотрим семейство задач P(k;Y), k=1..n, Y∈[0;C], где P(k;Y) – задача об оптимальном распределении Y единиц продукции между первыми k производственными процессами. Исходная задача запишется в виде P(n;C).

II. Функция Беллмана. Пусть B(k;Y) – оптимальная прибыль в задаче P(k;Y), x*(k;Y) оптимальное распределение ресурсов в этой задаче. Тогда

B(k;y) = max { f1(x1)+…+ fk(xk) | x1+…+ xk ≤ Y, x1,…, xk,≥ 0 – целые},

x*(k;Y) = (x*1(k;Y), …, x*k(k;Y)) – k-мерный вектор.

III. Уравнение Беллмана (связь между решениями задач семейства). Рассмотрим задачу P(k+1;Y), считая, что решение задач вида P(k;Y) мы уже знаем. Распределяя ресурсы между (k+1) процессами, выделим отдельно Z ресурсов на первые k и оставшиеся Y–Z на последний, k+1-й. Первую часть мы умеем распределять оптимально, поэтому

B(k+1,Y) = max{B(k,Z)+fk+1(Y–Z) | 0 ≤ Z ≤ Y},                            (3.2.2)

причем если Z* - точка максимума, то

x*(k+1;Y) = (x*(k; Z*); Y–Z*),                                                       (3.2.3)

т.е. для нахождения вектора x*(k+1;Y) нужно дополнить вектор (x*(k; Z*) еще одной координатой – элементом Y–Z*.

IV. Решение семейства задач. 1) Решаем самые простые задачи, которые связаны только с первым производственным процессом P(1;Y) (k=1) для всех Y∈[0;C].

B(1;Y) =max {f1(Z) | 0 ≤ Z ≤ Y} = f1(Z*),    x*1(1;Y) = Z*.                       (3.2.4)

2) Зная решение задач P(k;Y) при всех Y∈[0;C], мы по уравнению Беллмана (3.2.2) – (3.2.3) находим решение задачи P(k+1;Y) для всех же Y.

Повторяем 2) до тех пор, пока не дойдём до номера k=n и Y=C.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]