Приближенные схемы Задачи теории расписаний Полиномиальная приближенная схема (PTAS) Семейство приближенных алгоритмов для задачи Π, {Aε}ε называется полиномиальной приближенной схемой, если алгоритм Aε ― (1+ε)-приближенный алгоритм и время его работы ограничено полиномом от размера входа при фиксированном ε. Вполне полиномиальная приближенная схема (FPTAS) Семейство приближенных алгоритмов для задачи Π, {Aε}ε называется вполне полиномиальной приближенной схемой, если алгоритм Aε ― (1+ε)-приближенный алгоритм и время его работы ограничено полиномом от размера входа и 1/ε. Как построить PTAS Пример I Алгоритм A Решение A(I) • Упрощение примера I. • Разбиение пространства решений. • Структурирование работы алгоритма A. Упрощение примера I. Первая идея превратить трудный пример в более простой в котором легче найти оптимальное решение. Затем мы используем оптимальное решение простого примера для получения приближенного решения для трудного примера. App OPT Вернуться OPT # Решить I Упростить I# P2||Cmax • • • • J={1,..., n} – работы. {M1, M2} – одинаковые машины. j : pj > 0 (i=1,…, n). Каждая работа должна быть выполнена на одной из двух машин. • Минимизировать длину расписания (Cmax). • Прерывания запрещены. • Каждая машина обслуживает не более одной работы одновременно. Нижняя оценка n psum p j j 1 C * max pmax max n j 1 psum L max , pmax 2 pj Как упростить пример? ( I I# ) • Big = { j J| pj ≥ εL} – Новый пример I# содержит все большие работы из I. • Small = { j J| pj < εL} – Пусть X= ΣjSmall pj . – Новый пример I# содержит X/εL работ длины εL. • Маленькие работы, как бы склеиваются вместе и разрезаются на маленькие одинаковые кусочки. Оценка на оптимум • Лемма 5.1 OPT(I#) (1+ ε)OPT(I). Доказательство • Xi – размер всех маленьких работ, выполняемых на машине Mi в оптимальном расписании для I. • Оставим все большие работы на тех машинах, где они были в оптимальном расписании. • Заменим все маленькие работы на машине Mi на Xi /εL работ длины εL. • X1 /εL + X2 /εL X1 /εL + X2 /εL = X/εL • Xi /εLεL – Xi (Xi /εL + 1) εL – Xi εL • OPT(I#) OPT + εL (1+ ε)OPT(I) Как решить упрощенный пример? • • • • • • • Как много работ в I#? pj ≥ εL для всех работ в I#. Общая длина всех работ в I# psum 2L. Число работ в I# 2L/εL= 2/ε. Число работ в I# не зависит от n! Найдем все возможные расписания. Число различных расписаний 22/ε ! Как вернуться к исходной задаче? • • • • • Пусть σ# – оптимальное расписание для I#. Li# – нагрузка машины Mi в σ#. Bi# – общая длина больших работ на Mi в σ#. Xi#– размер всех маленьких работ на Mi в σ#. Li# = Bi# + Xi#. X X X L X L L # 1 # 2 Процедура ( σ#(I#) σ(I) ) • Большие работы выполняются на той же машине, что и в σ#. • Выделим интервал длины X1# + 2εL на машине M1 и X2# на машине M2. • Будем последовательно упаковывать маленькие работы в выделенный интервал на M1, пока не встретим работу, которая туда не поместится. • Оставшиеся маленькие работы упакуем в выделенный интервал на M2. Оценка качества psum OPT L max , pmax 2 L OPT # i # 1 OPT L 5.1 Li B X 2L L 2L # i # i # i 1 OPT 2OPT 1 3 OPT Алгоритм PTAS-1 Input ( J={1,..., n}, p: J → Z+) 1) Определим Big = { j J| pj ≥ εL} и Small = { j J| pj < εL} 2) Заменим все маленькие работы на машине Mi на X /εL работ длины εL. 3) Найдем оптимальное расписание σ# в новом примере I#, перебрав все допустимые назначения работ по машинам. 4) По расписанию σ# построим допустимое расписание σ исходной задачи, используя описанную выше процедуру ( σ#(I#) σ(I) ). Output (σ ) Точность алгоритма PTAS-1 • Теорема 5.2 Алгоритма PTAS-1 – (1+ε)-приближенный алгоритм для задачи P2||Cmax. Разбиение пространства решений Вторая идея разбить пространство решений на несколько меньших областей, в которых проще найти хорошее приближенное решение. Решив задачу отдельно для каждой маленькой области и взяв среди них лучшее есть шанс получить хорошее приближенное решение. * * * * ○* * * * * * * Общая схема 1. Разбиение на области. 2. Выбор «хорошего» представителя в каждой области. 3. Выбор из множества хороших представителей наилучшего. P2||Cmax • • • • J={1,..., n} – работы. {M1, M2} – одинаковые машины. j : pj > 0 (i=1,…, n). Каждая работа должна быть выполнена на одной из двух машин. • Минимизировать длину расписания (Cmax). • Прерывания запрещены. • Каждая машина обслуживает не более одной работы одновременно. Как разбить на области • • • • • Big = { j J| pj ≥ εL} Small = { j J| pj < εL} Φ – множество допустимых расписаний Расписание σΦ – назначение работ на машины. Определим области Φ(1), Φ(2),…согласно назначению больших работ: σ1 и σ2 лежат в одной области тогда и только тогда, когда каждая большая работа выполняется в σ1 на той же машине, что и в σ2. Сколько получилось областей? • Число больших работ 2L/εL= 2/ε. • Число способов разместить большие работы по двум машинам 22/ε. • Число различных областей 22/ε ! • Число различных областей зависит от ε и не зависит от размера входа! Как выбрать «хорошего» представителя? • • • • • • Назначение больших работ зафиксировано в Φ(l). OPT(l) – длина оптимального расписания в Φ(l). Bi(l) – общая длина больших работ на Mi. T := max{Bi(1), Bi(2)} OPT(l) Пусть Bi(l) начальная загрузка машины Mi. Назначим маленькие работы одну за другой по следующему правилу: каждый раз работа назначается на машину с меньшей нагрузкой на этот момент. • Полученное расписание σ(l) длины A(l) выберем представителем от Φ(l). А хорош ли представитель? 1. Если A(l) =T, то A(l) = OPT(l). 2. Пусть A(l) >T. • • • • Рассмотрим машину с большей загрузкой в σ(l). Последняя назначенная на нее работа маленькая и ее длина меньше εL. В момент назначения этой работы загрузка этой машины не превышала psum / 2. A(l) (psum / 2) + εL (1 + ε)OPT (1 + ε)OPT(l) Алгоритм PTAS-2 Input ( J={1,..., n}, p: J → Z+) 1) Определим Big = { j J| pj ≥ εL} и Small = { j J| pj < εL} 2) Определим области Φ(1), Φ(2),…, Φ(h) согласно назначению больших работ по машинам. 3) Сформируем задачи I(1), I(2),…, I(h) , в которых назначение больших работ по машинам фиксировано и задано на входе. 4) Решим каждую из задач I(k) , k = 1,…,h, назначая маленькие работы одну за другой на машину с меньшей нагрузкой на текущий момент. 5) Пусть σ* - лучшее из полученных расписаний на шаге 4. Output (σ* ) Точность алгоритма PTAS-2 • Теорема 5.3 Алгоритма PTAS-2 – (1+ε)-приближенный алгоритм для задачи P2||Cmax. Структурирование работы алгоритма • Основная идея рассмотреть точный, но медленный алгоритм. • Если алгоритм получает и перерабатывает огромное количество различных значений, то мы можем отбросить часть из них и ускорить работу алгоритма. P2||Cmax • • • • J={1,..., n} – работы. {M1, M2} – одинаковые машины. j : pj > 0 (i=1,…, n). Каждая работа должна быть выполнена на одной из двух машин. • Минимизировать длину расписания (Cmax). • Прерывания запрещены. • Каждая машина обслуживает не более одной работы одновременно. Краткая запись решения • Обозначим через σk допустимое расписание k первых работ {1,..., k}. • Закодируем расписание σk с нагрузками машин L1 и L2 двумерным вектором [L1, L2]. • Пусть Vk обозначает множество векторов, соответствующих допустимым расписаниям k первых работ {1,..., k}. Алгоритм «Динамическое программирование» Input ( J={1,..., n}, p: J → Z+) 1) Положим V0={[0,0]}, i=0. 2) While i n do: для каждого вектора [x,y] Vi добавить вектора [x + pi ,y] и [x,y + pi ] в Vi+1; i:= i +1; Найти [x*,y*] Vn , который минимизирует величину max [x,y]Vn{x,y} Output ([x*,y*]) 3) Трудоемкость алгоритма • Координаты всех векторов целые числа от 0 до psum. • Число различных векторов в Vi ограничено (psum)2. • Общее количество векторов, вычисляемых алгоритмом не превосходит n(psum)2. • Трудоемкость алгоритма O(n(psum)2). • Размер входа |I| ограничен O(log(psum))=O(ln(psum)) или O(n log pmax). • Трудоемкость алгоритма не ограничена полиномом от размера входа! Как упростить множество векторов? • Все вектора соответствуют точкам плоскости в квадрате [0, psum]×[0, psum]. • Разделим этот квадрат вертикальными и горизонтальными линиями на клетки (квадратики). • В обоих направлениях линии имеют координаты Δi, где Δ = 1+ (ε/2n), i = 1, 2, …, K. • K = logΔ(psum)= ln(psum)/ln Δ= ((1+2n )/ε) ln(psum) Отсев векторов • Пусть два вектора [x1,y1] и [x2,y2] попали в одну клетку. • x1/Δ x2 x1Δ и y1/Δ y2 y1Δ . • Из каждой клетки, имеющей непустое пересечение с Vi , выберем один вектор и добавим его в «урезанное» множество векторов Vi#. Алгоритм FPTAS Input ( J={1,..., n}, p: J → Z+) 1) Положим V0#={[0,0]}, i=0. 2) While i n do: для каждого вектора [x,y] Vi# добавить вектора [x + pi ,y] и [x,y + pi ] в Vi+1; i:= i +1; Преобразовать Vi в Vi#. 3) Найти [x*,y*]Vn# , который минимизирует величину max [x,y]Vn#{x,y} Output ([x*,y*]) Трудоемкость алгоритма FPTAS • Множество векторов в Vi# содержит не более одного вектора из каждой клетки. • Всего клеток K2. • Трудоемкость алгоритма FPTAS O(nK2). 2 2 • nK = n((1+2n )/ε) ln(psum) • Алгоритм FPTAS – полиномиален от размера входа и 1/ε. Оценка на вектора в Vi и Vi# • Лемма 5.4 Для каждого вектора [x,y] Vi существует вектор [x#,y#] Vi# , такой что x# Δix и y# Δiy. Точность алгоритма FPTAS • Теорема 5.5 Алгоритма FPTAS – (1+ε)-приближенный алгоритм для задачи P2||Cmax. Доказательство max x # , y # max n x, n y n max x, y nOPT L 5.4 n 1 z 1 2 z 0 z 1 n nOPT 1 OPT 1 OPT 2n n