- •1. Введение
- •Основные разделы курса
- •3. Основная задача линейного программирования. Различные формы записи задачи.
- •6. Алгоритм симплекс-метода.
- •1.3. Реализация симплекс-метода в виде симплексных таблиц.
- •8Транспортная задача. Описание и примеры применения метода потенциалов.
- •29.Метод ветвей и границ. Задача о рюкзаке.
- •Задача о рюкзаке
- •30. Метод ветвей и границ. Задача коммивояжера.
- •28. Методы перебора вариантов. Метод вариаций.
- •31.Задачей целочисленного программирования называется задача линейного программирования, в которой имеется дополнительное условие, требующее, чтобы часть переменных принимала только целые значения.
- •35.Общие принципы дискретного динамического программирования. Уравнение Беллмана.
- •36. Задача распределения ресурсов.
- •38. Построение кратчайшего пути на сети.
- •37. Задача оптимального планирования. Обработка деталей на двух станках.
- •10. Выпуклые множества и выпуклые функции.
- •13.Двойственность в задачах выпуклого программирования
- •14. Квадратичное программирование
- •12. Постановка задачи. Теорема Куна – Таккера.
- •16. Геометрическое программирование
- •11. Свойства выпуклых множеств и выпуклых функций
- •19. Общая задача нелинейного программирования.
- •22.Свойства дифференцируемых функций.
- •24. Дифференцируемость оператора Немыцкого.
- •25. Необходимый признак экстремума в задачах без ограничений первого и второго порядков.
- •27 . Правило множителей Лагранжа для гладких нелинейных задач.
- •41. Простейшая вариационная задача (пвз), исследование необходимых условий экстремума первого порядка.
- •45. Вариационная задача с кусочно-гладкими кривыми.
- •46. Исследование необходимых условий экстремума второго порядка. Условия Лежандра и Якоби.
- •42.. Алгоритм Гюйгенса исследования пвз.
- •48.. Поле экстремалей. Достаточные условия сильного экстремума.
- •Задача Больца.
- •6.9. Изопериметрические задачи.
- •51. Принцип максимума Понтрягина.
38. Построение кратчайшего пути на сети.
Дан неориентированный граф, для каждого ребра которого задана его длина. Вершины графа пронумерованы числами от 1 до N. Требуется найти путь минимальной длины, соединяющий 1-ю вершину с N-й.
Решим эту задачу методом динамического программирования.
I. Инвариантное погружение. Рассмотрим семейство задач P(k), k=1,...,N, где P(k) – задача о нахождении пути минимальной длины, соединяющий 1-ю вершину с k-й. Исходная задача запишется в виде P(N).
II. Функция Беллмана. Пусть B(k) – длина минимального пути в задаче P(k), x*(k) – последовательность дуг оптимального пути в этой задаче.
III. Уравнение Беллмана (связь между решениями задач семейства). Пусть G – множество вершин, для которых задача нахождения минимального пути уже решена. Рассмотрим множество вершин G1, смежных с множеством G, т.е. не входящих в G, но в которые можно попасть из множества G по некоторой дуге графа.
Обозначим l=(x,y) – дуга l начинается в вершине x и заканчивается в вершине y, d(l) – длина дуги l.
Пусть min{d(l)+B(k) | l=(m,k), m∈G1, k∈G} = d(l*)+B(k*), l*=(m*,k*). (3.3.1)
Тогда B(m*) = d(l*)+B(k*), (3.3.2)
причем x*(m*) = (x*(k*), l*). (3.3.3)
IV. Решение семейства задач. Уравнения (3.3.1) – (3.3.3) фактически не надо решать. Они указывают последовательность решения задач нашего семейства. Самые простая задача – найти кратчайший путь из 1-й вершины в эту же вершину, при этом B(1)=0, x*(1) не содержит дуг.
Таким образом, первоначально множество G = {1}, G1 содержит все смежные с 1-й вершины. Уравнения (3.3.1)–(3.3.3) позволяют расширить множество G, вычислив значение B для одной из смежных вершин (для той, на которой достигается минимум в (3.3.1)).
37. Задача оптимального планирования. Обработка деталей на двух станках.
Имеется n деталей, которые необходимо последовательно обработать сначала на одном, а потом на втором станке. Для каждой детали известно время ai обработки на первом станке и bi – на втором станке. Последовательность обработки деталей на обоих станках одинакова.
Необходимо найти оптимальный порядок обработки партии, при котором общее время обработки минимально.
I. Семейство задач. Обозначим через P(i1,..,ik | Y) задачу, в которой детали с номерами i1,..,ik не обрабатываются, а второй станок включается через Y секунд после начала работы (первого станка). Наша исходная задача: P(пустое множество| 0) – все детали обрабатываются, 2-й станок включается сразу.
II. Функция Беллмана. Введем обозначения: B (i1,..,ik | Y) – оптимальное время обработки партии в задаче P(i1,..,ik | Y), x*(i1,..,ik | Y) – оптимальная последовательность обработки деталей.
III. Уравнение Беллмана. Рассмотрим задачу P(i1,..,ik | Y). Возьмём одну из деталей i1,..,ik поставим в очередь первой. Эта деталь (с номером i) будет полностью обработана через время Δt=ai+bi, если Y≤ai (т.е. второй станок успеет включиться), Δt=Y+bi, если Y>ai (т.е. придется ждать включения второго станка).
В итоге Δt =max{Y, ai}+bi = ai + bi + max{Y – ai, 0}.
Мы можем считать, что второй станок для оставшихся деталей включается через bi + max{Y – ai, 0} секунд после обработки i-й детали на первом станке.
Предполагая, что оставшиеся детали обрабатываются оптимальным образом, мы затрачиваем на такую обработку время, равное ai + B (i1,..,ik, i | bi + max{Y – ai, 0}).
Обозначим через Ik множество всех номеров деталей, не совпадающих с номерами i1,..,ik.
Тогда получим уравнение Беллмана
B(i1,..,ik | Y) = min {ai + B (i1,..,ik, i | bi + max{Y – ai, 0}) | i∈Ik}, (3.4.1)
причем
x*(i1,..,ik | Y) = (i*, x*(i1,..,ik, i*| bi* + max{Y – ai*, 0}) ), (3.4.2)
где i* – индекс, на котором достигается минимум в (3.4.1).
Уравнение (3.4.1) позволяет связать между собой значения целевых функций различных задач нашего семейства, (3.4.2) – последовательности обработки деталей в этих задачах. Уравнение Беллмана (3.4.1) показывает, что для решения задач с n необрабатываемыми деталями нужно знать решение задач с n+1 необрабатываемой деталью. Другими словами, задачи следует рассматривать в порядке возрастания количества обрабатываемых деталей.
IV. Решение семейства задач. Простейшими задачами семейства являются задачи семейства, в которых обрабатывается только одна деталь (с номером k): P(I\{k} | Y), где I – множество всех номеров деталей (напомним, что в обозначениях задачи до вертикальной черты указываются номера всех необрабатываемых деталей).
Как мы уже вычисляли,
B(I\{k} | Y) = max{Y, ai}+bi = ai + bi + max{Y – ai, 0}, (3.4.3)
при этом
x*(I\{k} | Y) = (k) (3.4.4)
– вектор с одной координатой.
Уравнение Беллмана (3.4.1)-(3.4.2) позволяет на основании (3.4.3)-(3.4.4) вычислять решения остальных задач семейства.
Решение задачи о двух станках методом вариаций
Рассмотрим две очереди обработки деталей, отличающихся между собой только порядком обработки двух соседних деталей: в одной очереди после детали i идет деталь j, во второй – после j-й идет i-я деталь.
Предположим, что предыдущие детали (перед i-й и j-й) освобождают 2-й станок через Y секунд после момента t0, когда, как они освободили 1-й станок.
1-й станок будет доступен для обработки деталей, следующих за i-й и j-й, в момент t0+ai+aj не зависимо от того, в каком порядке будут обработаны i-я и j-я детали.
Следовательно, чем раньше i-я и j-я детали будут обработаны на 2-м станке, тем быстрее будет обработана оставшаяся очередь.
Итак, отсчитывая от момента t0, i-я деталь может быть обработана на 2-м станке через Δti= bi + max{Y, ai} секунд, а следующая за ней j-я деталь – через Δtij= bj + ai+ max{ (Δti – ai), aj} = bj + max{Δti , aj + ai } секунд.
При смене порядка их обработки эти детали освободят 2-й станок через Δtji= bj + max{Δtj , aj + aj} секунд.
Сравним числа Δtij и Δtji.
Δtij= bj + max{ bi + max{Y, ai}, aj + ai} = bj + bi + max{Y, ai , ai + aj – bi} = bi + bj + Tij,
где Tij = max{Y, ai , ai + aj – bi}.
Аналогично, Δtji = bi + bj + Tji, Tji = max{Y, aj , ai + aj – bj}.
Предположим, что min{ai, aj, bi, bj} = ai. Тогда ai + aj – bi = aj +(ai –bi) ≤ aj и ai ≤ aj, следовательно,
Tij = max{Y, ai , ai + aj – bi} ≤ max{Y, aj} ≤ max{Y, aj , ai + aj – bj} = Tji.
Если min{ai, aj, bi, bj} = bj, то ai + aj – bi ≤ ai + aj – bj, ai ≤ ai + (aj – bj) = ai + aj – bj, поэтому
Tij = max{Y, ai , ai + aj – bi} ≤ max{Y, ai + aj – bj} ≤ max{Y, aj , ai + aj – bj} = Tji.
В итоге мы получаем следующее правило: если i, j – две соседние детали в очереди, найдем минимум из чисел {ai, aj, bi, bj}. Если минимум равен ai, для оптимизации очереди i-я деталь должна идти раньше j-й. Если же минимум равен bi, i-я деталь должна за j-й.
Таким образом, мы получили простое правило, позволяющее сравнить две очереди, отличающиеся одной вариацией. Теперь нетрудно убедиться в справедливости следующего алгоритма решения задачи.
Алгоритм получения оптимальной очереди:
1. Находим min среди чисел ai,bi, i=1,…,N. Если минимум – число ai0, деталь i0 должна быть первой в очереди. Если минимум - число bj0, то деталь j0 должна быть в очереди последней.
2. Находим min среди чисел ai,bi для всех не поставленных в очередь деталей. Если минимум – число ai1, деталь i1 ставим в начало очереди (за уже находящимися в начале очереди), если минимум – число bj1, то деталь j1 ставим в конец очереди (перед уже поставленными в конце).
3. Продолжаем п.2 до тех пор, пока все детали не будут расставлены в очередь.