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

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 до тех пор, пока все детали не будут расставлены в очередь.

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