Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Решение. Сделаем копию данной последовательности и отсортируем ее по возрастанию
Первый способ Сделаем копию данной последовательности и отсортируем ее по возрастанию. Тогда НВП будет также НВП для отсортированной последовательности. Поэтому достаточно найти наибольшую общую подпоследовательность исходной и отсортированной последовательности. Обратите внимание: на самом деле таким способом мы найдем не возрастающую, а неубывающую подпоследовательность. Чтобы найти возрастающую подпоследовательность, нужно сделать еще один шаг. Сложность этого алгоритма – O(n2). Второй способ Попробуем воспользоваться методом динамического программирования. Пусть мы знаем НВП для последовательности a1, …, ak. Можем ли мы найти НВП для последовательности a1, …, ak+1? Кажется, что это легко сделать: если ak+1 больше, чем последний член ранее найденной НВП, то ak+1 нужно добавить в НВП, в противном случае нужно оставить НВП неизменной. К сожалению, такое решение оказывается неверным. Рассмотрим такой пример: 1 2 3 6 4 5. Для первых пяти членов этой последовательности длина НВП равна 4, но есть две различных НВП: 1 2 3 6 и 1 2 3 4. Пусть мы выбрали первую из них. Тогда на следующем шаге мы не сможем дополнить ее числом 5 и получим более короткую НВП (1 2 3 6) для всей последовательности, чем должны был получить (1 2 3 4 5). Модифицируем предложенный алгоритм. Будем теперь запоминать не произвольную НВП, а ту, которая заканчивается на наименьшую возможную цифру. К сожалению, и этот способ не приведет нас к успеху. Рассмотрим такой пример: 1 4 2 3. Для последовательности из первых двух символов НВП будет иметь длину 2 (1 4). Но при добавлении символов длина НВП не увеличится, поскольку все оставшиеся числа меньше четырех. Для решения задачи нам потребуется более сложная система подзадач. Пусть для последовательности a1, a2, …, ak мы знаем возрастающие последовательности длины 1, 2, 3,... Причем среди всех возрастающих последовательностей данной длины мы будем хранить ту, которая оканчивается на меньшее число. Тогда для последовательности a1, a2, …, ak+1 мы сможем построить аналогичный набор последовательностей. Третий способ Будем постепенно строить возрастающие цепочки и в каждый момент времени для каждого элемента ai хранить длину самой длинной построенной цепочки, заканчивающейся этим элементом. Приведенный алгоритм имеет сложность O(n2). Четвертый способ Будем поочередно обрабатывать члены исходной последовательности. Пусть после обработки k-го элемента нам известно, что возрастающая подпоследовательность длины 1 может оканчиваться числом e[1], ВП длины 2 может оканчиваться числом e[2] и т.д., причем указанные числа e[i] – наименьшие возможные. Заметим, что е[1] < e[2] < e[3] < … Рассмотрим теперь число ak+1. Найдем такое i, что e[i-1] ≤ ak+1 < e[i] (если изначально положить e[0] = -∞, а все остальные члены массива e равными +∞, то такое всегда найдется). Положим e[i]: = ak+1, а остальные элементы массива e[i] оставим без изменений. Заметим, что сложность поиска в упорядоченном массиве есть O(log m), где m – длина НВП, поэтому сложность приведенного алгоритма – О(n log m). Примеры задач, решаемых при помощи динамического программирования. Наикратчайшие пути через сети Пусть имеется N узлов с номерами 1, 2, …, N. Пусть tij> 0 – время прохождения от узла i к узлу j. Пусть N – целевой узел, а ui – минимальное время перехода от узла i к узлу N. Очевидно, что uN=0. По принципу оптимальности получим: ui = minj¹ i(tij + uj), i = 1, 2, …, N-1. Рассмотрим некоторые свойства полученных уравнений. Пусть (u1, u2, …, uN) и (U1, U2, …, UN) – два решения и m – индекс, для которого максимальна разность Uj – uj, j = 1, …, N. Пусть Um = tmn + Un £ tmr + Ur um = tmr + ur Þ Um - um £ Ur - ur Так как m – индекс для которого U – u = max, то получаем знаки равенства. Точно также можно найти s, s¹ m, s¹ r и Um – um = Ur – ur = Us – us Þ UN – uN = 0. Метод итераций. Пусть ui(0) = tiN, tNN = 0, если нет пути от i к N, то положим tiN = ¥. Рассмотрим итерационный процесс: ui(1) = mini¹ j(tij + uj(0)), uN(1) = 0, … Очевидно, что ui(k+1) £ ui(k)). Так как оптимальный путь содержит не более N-2 узла (поскольку нет петель), то ui(N-2) есть решение Þ число итераций не более N-2. Оптимизация метода динамического программирования (на примере задачи нахождения числа сочетаний ) Одна из проблем рекурсивных алгоритмов – длительная работа рекурсии за счет повторяющихся вызовов рекурсивной функции для одного и того же набора параметров. Чтобы не тратить машинное время на вычисление значений рекурсивной функции, которые мы уже когда-то вычислили, можно сохранить эти значения в массиве и вместо рекурсивного вызова функции мы будем брать это значение из массива. В задаче вычисления числа сочетаний создадим двумерный массив B и будем в элементе массива B[n][k] хранить величину C nk. В результате получим следующий массив (по строчкам – значения n, начиная с 0, по столбцам -- значения k, начиная с 0, каждый элемент массива B[n][k] равен сумме двух элементов: стоящего непосредственно над ним B[n-1][k] и стоящего над ним слева B[n-1][k-1]). Полученная числовая таблица, составленная из значений C nk, в которой каждый элемент равен сумме двух элементов, стоящих над ним, называется треугольником Паскаля. Поскольку каждый элемент этого массива равен сумме двух элементов, стоящих в предыдущей строке, то этот массив нужно заполнять по строкам. Соответствующая функция, заполняющая массив и вычисляющая необходимое число сочетаний может быть такой:
Приведенный алгоритм для вычисления C nk требует объем памяти O (n 2) и такая же его временная сложность (для заполнения одного элемента массива требуется O (1) операций, всего же элементов в массиве O (n 2)). Подобный метод решения, когда одна задача сводится к меньшим подзадачам, вычисленные же ответы для меньших подзадач сохраняются в массиве или иной структуре данных, называется динамическим программированием. В рассмотренной задаче вычисления числа сочетаний использование метода динамического программирования вместо рекурсии позволяет существенно уменьшить время выполнения программы за счет некоторого увеличения объема используемой памяти. Тем не менее, приведенный алгоритм тоже имеет небольшие недостатки. Мы вычисляем значения всех элементов последней строки, хотя нам необходим только один из них – B[n][k]. Аналогично, в предпоследней строке нас интересуют только два элемента – B[n-1][k-1] и B[n-1][k], в строке, стоящей над ней – три элемента, и т. д., в то время, как мы вычисляем все элементы во всех строках. Кроме того, мы не используем почти половину созданного массива B[n+1][n+1], а именно все элементы, стоящие выше главной диагонали. От этих недостатков можно избавиться, более того, можно уменьшить объем используемой памяти до O (n). Если же в программе часто возникает необходимость вычисления числа сочетаний C nk для каких-то ограниченных значений n, то лучше всего создать глобальный массив для хранения всевозможных значений C nk для нужных нам значений n, заполнить его в начале программы, а затем сразу же брать значение числа сочетаний из этого массива, не вычисляя его каждый раз заново.
Тема 4. Системы и процессы. План лекции: Системы. Многошаговые процессы. Редукция информации. Реккурентные соотношения. Бесконечные процессы. Процессы с заданными правилами остановки. Нестационарные процессы. Краткое содержание лекции Системы Сначала нас будет интересовать изучение систем (термин, который здесь еще не определен, но интуитивно вполне понятен) и то, как они ведут себя с течением времени. Эта точка зрения позволяет ввести понятие «процесса» простым и естественным способом. Аналитически представим себе систему как вектор состояния х(t) и правило для определения его значения в любой момент времени t. Для простоты будем рассматривать только конечномерные векторы Каждая компонента х(t) определяет различные свойства системы. Число N называется размерностью системы. Классически х(t) может быть задан следующими способами: = g(x(t)) – дифференциальные уравнения, x(t)=g(x(t-t)) – разностное уравнение, = h(x(t), x(t-t)) – дифференциально-разностное уравнение, x(t)=u(t) + ò g(x(s), t)ds – интегральное уравнение, а также в виде различных комбинаций этих способов. Уравнения в частных производных соответствуют бесконечномерным векторам состояния и этим определяют более общие системы. Хотя методы, которыми мы пользуемся, могут быть применены к изучению систем более сложной структуры, ниже ограничимся системами конечной размерности. Важно подчеркнуть, что понятие «состояние системы», не определяется только лишь физическими свойствами подлежащей изучению реальной системы. Поэтому не так уж необходимо углубляться во внутреннюю характеристику системы, тем более, что это сильно задержит нас на весьма частных и зачастую извилистых путях математических описаний. Описание систем и процессы решения зависят от того, что требуется знать о физических процессах, что можно наблюдать или измерить, от точности этих наблюдений и вообще от научного и математического уровня на сегодняшний день. Важно подчеркнуть значение гибкости в применении математических методов в научных исследованиях. Не существует никаких готовых аналитических методов и никаких готовых формулировок. В прошлом большинство аналитических работ по прикладной математике было связано с функциональными уравнениями указанных выше типов. Эти работы содержат важные результаты, и нет сомнений в том, что поставленные в классической формулировке задачи будут продолжать играть основную роль в современной теории управления и в других областях. Однако, как новые задачи, так и новые типы задач показали, что классическая теория имеет существенные ограничения. Новые методы, совместно с развитием и обобщением старых, позволяют дать ответ на новые и более глубокие вопросы современной науки и техники. Многошаговые процессы Введя чисто математическое определение понятия «система», уточним теперь другую интуитивную концепцию – понятие «процесс». Ради общности заменим символ х(t) символом р, считая р точкой множества или пространства R. Во всем последующем изложении R будет множеством точек М -мерного пространства (возможно с некоторой метрикой) или некоторого подмножества. Рассмотрим теперь функцию Т(р) – преобразование, обладающее свойством, что преобразованная точка р1 = Т(р) принадлежит R для всех точек р из R. Можно считать, что р изображает начальное состояние системы, р1 = Т(р) – состояние на одну единицу времени позднее и вообще система векторов [ р, р1, р2, …, рn, … ], где р0 = р, рn+ 1= Т(рn), n =0, 1, 2, …, изображает временную историю системы, наблюдаемую в дискретные моменты времени n =0, 1, 2, …, т.е. последовательные состояния системы. Можно также написать рn=Тn(р), что обозначает n -кратное применение преобразования Т, и иногда будем применять это обозначение. Назовём эту бесконечную последовательность векторов многошаговым процессом, что является определением этого термина. Удобно ввести обозначение [ р, Т(р) ] или просто [ р, Т ]. более точно, это есть многошаговый процесс дискретного детерминированного типа. Так как это единственный многошаговый процесс, который мы указали, то ограничимся пока более простым термином, а при рассмотрении других типов многошаговых процессов отметим их дополнительные особенности. Редукция информации В большинстве случаев многошаговый процесс говорит значительно больше, чем требуется знать, и обычно значительно больше, чем можно проанализировать. Такова природа – чтобы понять, надо отбросить часть информации. Для начала будем рассматривать только часть многошагового процесса, N -шаговый процесс, последовательность векторов [ p, p1, p2, …, pN ], где, как и прежде, рk +1= T(pk), k =0, 1, 2, …, N -1. Рассмотрим свойства различных скалярных функций, зависящих от этого процесса, обозначим их { g(p, p1, …, pN) }. Для получения интересных и полезных результатов, надо надлежащим образом выбрать структуру функции g, или, что эквивалентно, надлежащую структуру многошагового процесса. Заметим еще раз, что такого рода привнесенная структура не обязательно свойственна основной физической структуре. Например, можно рассмотреть функции следующих видов: , … Независимость от прошлого Мы предполагаем, что в начальный момент времени система определяется вектором состояния р, а процесс описывается последовательностью: р 1= Т(р), р 2= Т(р 1 ), … Как следствие этого предположения последующее для k -й точки состояние зависит только от pk, и не зависит от предыдущих состояний. Другой путь введения этих понятий состоит в том, что pN можно рассматривать как N -е состояние на N -м шаге процесса, начавшегося из начального положения p, или (N-k) -e состояние процесса на (N-k) -м шаге процесса, начавшегося из состояния pk в момент времени k. Символически это можно записать в виде уравнения TN = TN-kTk. Это соотношение может рассматриваться как аналитическая формулировка причинной связи, или, другими словами, того факта, что будущее единственным образом определяется настоящим (теорема единственности). Реккурентные соотношения Вернемся теперь к анализу возможности выполнения необходимых вычислений для определения указанных выше функций. Рассмотрим сначала функцию , где h(p) – заданная функция состояния, и заметим, что рассматриваемая функция полностью определена начальным состоянием р и числом шагов N, если задано преобразование Т. Запишем последовательность функций { fN(p) }, определяемых соотношением fN(p) = = h(p) + h(T(p)) + h(T 2 (p)) + … + h(TN(p)), где N =0, 1, 2, … и р принадлежит множеству R. Рассмотрим для N ³ 1 частичную сумму h(T(p)) + h(T 2 (p)) + … + (TN(p)). Эта сумма эквивалентна h(p 1 ) + h(T(p 1 )) + … + h(TN- 1 (p 1 )), а следовательно, и функции fN-1(p1), определяемой последовательностью функций {fN(p)}. Из этого следует, что fN(p) удовлетворяет функциональному (реккурентному) уравнению Аналогично, если обратится к функции , то рассмотрим fN(p) = , и получим функциональное уравнение fN(p) = h(p)fN-1(T(p)). Предоставим читателю вывод соотношения fN(p) = max [ h(p), fN-1(T(p)) ], N ³ 1, для функции fN(p) = , определенной выше под пунктом (с). Таким же образом соотношение fN(p) = h(p, T(p)) + fN-1(T(p)) может быть установлено для функции под пунктом (d). Бесконечные процессы Соотношения, полученные в предыдущем пункте, значительно упрощаются для бесконечных процессов, т.е. процессов, которыми становятся ранее рассмотренные многошаговые процессы при N =¥. Поступим формально и, не рассматривая пока вопросов сходимости, напишем f(p) = . Заметим, что бесконечность числа шагов исключает зависимость от N и таким образом устраняет одну переменную, что весьма существенно. При этом аналогично предыдущему получим f(p) = h(p) + , f(p) = h(p) + f(T(p)). Подобным же образом, если f(p) = , то, учитывая очевидное соотношение max [ x1, x2, …]= max [ x1, max [ x2, …]], получаем f(p) = max [ h(p), f(T(p)) ]. Во многих случаях функция fN(p) не имеет предела при N ® ¥. В этом случае иногда имеет смысл величина вида с асимптотическим соотношением вида ~ g1(p) при N ® ¥ или соотношением вида fN(p) ~ g2(p)Nh(p). Процессы с заданными правилами остановки Во многих важных ситуациях в рассматриваемых конечных процессах число шагов заранее не фиксировано, а зависит от начального состояния, т.е. N = N(p). При этом приходим к соответствующим функциям вида f(p) = . Первым простым примером этого вида процессов является процесс, в котором при затрате ресурсов на каждом шаге приходится учитывать условие, согласно которому процесс остановится, как только иссякнут ресурсы. Аналитически это условие можно выразить посредством ограничения вида £ a. Другой немаловажный пример дает нам исследование траекторных процессов. Объект продолжает движение до тех пор, пока он не окажется на некотором заранее обусловленном расстоянии от другого объекта. Аналитически, вводя метрику в R, обозначая через d(p, q) расстояние между двумя элементами p и q в R, мы ставим условие, что процесс продолжается до тех пор, пока d(TNp, q) £ e, где q и e заданы заранее. Рассмотрим траекторный процесс, который оканчивается, как только d(pN, q) £ e. Если ввести функцию f(p)= , где N = N(p) определяется приведенным выше правилом остановки, то получаем Нестационарные процессы Нестационарные процессы имеют вид: (pm, рm+1, рm+2, …, рn, …), где рn+ 1= Тn(рn), n = m, m+1, m+2, … Выполнив редукцию для величины получаем: fN, m(p) = hm(p) + fN, m+1(Tm(p)) Если N = const, то jm(p) = fN, m(p) и получаем: jm(p) = hm(p) + jm+1(Tm(p)), 0£ m£ N jN(p) = hN(p)
Тема 5. Дискретные и непрерывные задачи. План лекции: Непрерывные процессы. Траекторный процесс. Неоднородная атмосфера. Причинность. Стохастичность и корреляция. Вариационное исчисление. Геометрическая интерпретация. Уравнение эйконала (в R2).
Краткое содержание лекции Непрерывные процессы Рассмотрим дискретный процесс, заданный соотношениями: pi +1 = T (pi) Пусть этим значениям i соответствует значения t = 0, D, 2D, … Тогда в силу непрерывности T(p)» p, а точнее T(p) = p + S(p)D + o(D) Пусть соответствующая целевая функция имеет вид суммы ft(p) = g(p)D + g(T(p))D + g(T2(p))D + … + g(Tn(p))D И предположим, промежуток D достаточно мал. Если обозначим t = nD, то получим ft+D(p) = g(p)D + ft(p + S(p)D + o(D)) Рассмотрим теперь M-мерный случай, получим Тогда уравнение для целевой функции примет вид Если перейдем к пределу при D®0, то получим линейное уравнение в частных производных Формально p¢ (t) = S(p), p(0) = p0 Траекторный процесс Рассмотрим задачу: в пустоте с малой скоростью v брошено вертикально вверх тело. Найти наибольшую высоту подъёма тела. Классическое решение задачи имеет вид: Способ динамического программирования. Пусть f(v) – максимальная высота Последовательно получаем: D ® 0 T(v) = v - gD f(v) = vD + f(v - gD) + o(D) D ® 0 Þ 0 = v - f¢ (v)g, f(0) = 0 Þ Задача (объект А догоняет объект Б). Пусть f(r, d) – время до встречи, g(r, d) – расстояние до точки встречи. Получаем уравнение Если D ® 0, то разложив f в правой части по формуле тейлора, получим уравнение в частных производных для функции f и граничное условие для f: Найти f(r, d); составить уравнение для g(r, d); найти g(r, d) (методом характеристик). Неоднородная атмосфера Пусть теперь задача о теле, брошенном вверх, имеет вид (движение с сопротивлением): x² = h(x, x¢), x(0) = 0, x¢ (0) = v Следовательно нужна дополнительная переменная состояния – высота в начале процесса (b). Пусть f(b, v) – максимальная высота. Последовательно получаем b1 = T1(b, v) = b + vD + o(D) v1 = T2(b, v) = v + h(b, v)D + o(D) f(b, v) – max высота Þ f(b, v) = vD + f(b+vD, v+h(b, v)D) + o(D) D ® 0 Þ , f = -b + j(const), где const – первый интеграл. Самостоятельно рассмотреть конкретный пример h(x, x¢) = -g - kx¢. Причинность Рассмотрим последовательно идущие стадии процесса
В предположении зависимости параметров только от предшествующих состояний получаем f(b, t+t) = f(f(b, t), t) это и есть принцип детерминизма. Например для матрицы A получаем eA(t+t) = eAteAt Если eAt – есть решение уравнения x¢ = Ax, x(0) = E. Самостоятельно рассмотреть случаи sin(t+t) и cos(t+t) Стохастичность Пусть T не полностью известно, тогда (p0, р1, р2, …) – случайный процесс, следовательно получаем систему с описанием pk = T(pk-1, rk), k³ 1, p0 = p, где rk - независимые случайные величины с распределением dG(r). Требуется найти математическое ожидание. M(g(p)) = M(g(p1) + g(p2) + …+g(pN)) Обозначим fN(p) = Mr(pm, рm+1, рm+2, …, рn, …), N³ 1, где математическое ожидание берётся относительно независимых случайных величин r1, r2, …, rN. Тогда получим fN(p) = g(p) + ò fN-1(T(p, r1)dG(r1) f0(p) = g(p) (т.к. fN(p) = Mr(g(p) + fN-1(T(p, r1))) Корреляция Случайные величины rk могут быть зависимы, простейший случай, когда rk зависит только от rk-1. В этом случае известно распределение dG(rk, rk-1). Тогда fN(p, r0) = g(p) + ò fN-1(T(p, r1))dG(r1, r0) Вариационное исчисление Простейшая классическая задача вариационного исчисления имеет вид: найти max J(u), где J(u) = ò 0t0g(u, u¢)dt, u(t) Î C[0, t0], u(0) = c. Обозначим формально f(c, t0) = maxuJ(u) и воспользуемся свойством интеграла ò 0t0 = ò 0D + ò Dt0. Учтя, что ò 0Dg(u, u¢)dt = g(c, v)D + o(D), (где v = u¢ (0)) получим: f(c, t0) = maxv(g(c, v)D + f(c+vD, t0-D)) + o(D) И далее учитывая, что D ® 0 получаем: f¢ t0 = maxv(g(c, v) + vf¢ c), f(c, 0) = 0 Замечание. v = v(c, t) называется функцией стратегии Замечание. В классическом подходе решается уравнение: При этом если, например, дополнительно задано условие |u¢ (t)|£ k, 0£ t£ t0, то в классическом подходе возникают серьёзные трудности, а метод динамического программирования легко даёт уравнение: f¢ t0 = max|v|£ k(g(c, v) + vf¢ c), f(c, 0) = 0 Геометрическая интерпретация Вариационное исчисление: ищем кривую u(t), tÎ [0, T], такую, что J(u) ® max, а u – точка в пространстве функций. Динамическое программирование: для каждой точки ищем направление, которое является оптимальным. Иначе: кривая – геометрическое место точек (В. И.) кривая – огибающая семейства касательных (Д. П.) Уравнение эйконала (в R2) Пусть дано распределение коэффициента преломления среды в виде n(x, y), тогда скорость луча v(x, y) = c/n(x, y). По принципу Ферма путь луча такой, что время ® min. Пусть это время от точки (x0, y0) до точки (x, y) есть t(x, y). Пусть угол наклона q, тогда заменим (x, y) ®(x+Dcosq, y+Dsinq) и Dt = D/v(x, y). Последовательно получаем: t(x, y) = minq(D/v(x, y) + t(x+Dcosq, y+Dsinq) + o(D)) Þ 0 = minq(D/v(x, y) + D t¢ x cosq + D t¢ y sinq + o(D)) Þ -v-1(x, y) = minq(t¢ x cosq + t¢ y sinq) qmin: -t¢ x sinq + t¢ y cosq = 0 Þ tgq = t¢ y/t¢ x Þ Это и есть уравнение эйконала, запишем его в исходных обозначениях Выводы Процедура решения непрерывных задач методом динамического программирования для задач, описываемых в терминах траекторных процессов приводит к уравнению в частных производных. Сравним классический подход и метод ДП по сложности численного решения в одномерном случае (N – число узлов)
Таким образом при решении серии задач метод ДП конкурирует с классическими.
Тема 6. Динамическое программирование и линейное программирование План лекции: Задачи оптимизации производства услуг. Задача оптимального распределения ресурсов. Краткое содержание лекции
Повышение эффективности вычислений при решении определенного класса задач математического программирования может быть достигнуто путем использования методов динамического программирования. Особенностями методов динамического программирования являются использование для их реализации принципов инвариантного погружения и оптимальности. Принцип инвариантного погружения предполагает замену общей задачи на эквивалентную совокупность более простых (пошаговых) задач. Принцип оптимальности определяет возможность получения глобально-оптимальных стратегий (решений) на основе решений пошаговых задач оптимизации. Методы динамического программирования позволяют существенно сократить (по сравнению с полным перебором) число анализируемых вариантов решений в процессе определения глобально-оптимального решения за счет учета априорной информации о решениях, не являющихся допустимыми, и использования информации, полученной на предыдущих шагах оптимизации. Кроме того, достоинством методов динамического программирования является их инвариантность к классу целевой и ограничительных функций. В распределительных задачах с большим числом различных результатов производственной деятельности (i=1, …, n) и видов ресурсов (j=1, …, m) общее решение задачи оптимизации может быть при определенных условиях заменено совокупностью последовательно решаемых менее сложных частных задач оптимизации, например, по каждому из отдельных видов производственной деятельности. При этом важными понятиями ДП являются: последовательность шагов оптимизации, состояние системы распределения ресурсов и варианты решения (области изменения оптимизируемых переменных) Рассмотрим приемы и методы динамического программирования и введенных выше понятий на примере общей задачи линейного программирования: z =c1x1+c2x2+…+cnxn Þ max, a11x1+a12x2+…+a1nxn £ b1, a21x1+a22x2+…+a2nxn £ b2, … am1x1+am2x2+…+amnxn £ bm, x1, …, xn³ 0, где z - целевая функция, подлежащая максимизации; xi - оптимизируемые переменные; i=1, n-номер оптимизируемой переменной; сi - доход от реализации i-го вида производственной деятельности; j=1, m-номер ограничений на значения переменных; аij - коэффициенты уравнений-ограничений; bj - величина j-го ресурса (правая часть ограничений). Здесь каждый вид производственной деятельности i может рассматриваться как отдельный шаг оптимизации; множество возможных значений переменных (допустимая область решений) xi как варианты решений, а количество каждого j-го вида ресурса (Bi1, …, Bij, … Bim), 0£ bj£ Bij, доступного для распределения на текущем и предыдущих (либо текущем и последующих) шагах (по i-м типам деятельности) как состояние модели. Тогда оптимальное значение целевой функции z для шагов i, i+1, …, n при заданных состояниях {Bij} может быть записано в виде следующей рекуррентной функции Беллмана (алгоритма прямой прогонки): fi(Bi1, …, Bim) = max {ci xi + fi-1(Bi1-ai1xi, …, Bim-aimxi)}, i =1, n; j =1, m, где 0£ aijxi£ Bij с начальными условиями f0(B01, …, B0m)=0. Оптимальное значение целевой функции в обратном времени для шагов n, …, i, i-1, …, 1 при заданных состояниях {Bij} может быть записано в виде следующего алгоритма обратной прогонки: fn(Bn1, …, Bnm)=max{cnxn}, 0£ anjxn£ Bnj fi(Bi1, …, Bim)=max {cixi+fi+1(Bi1-ai1xi, …, Bim-aimxi)}, i=1, n; j=1, m, где 0£ aijxi£ Bij 0£ Bij£ bj. Разница между прямым и обратным способами решения задачи заключается в определении состояния модели. В прямой модели Bij - количество ресурса j-го типа, распределяемого от первого шага до i-го, а для обратной модели Bij- количество ресурса, распределяемого на всех шагах от i-го до n-го. Решение первой задачи основывается на двух основополагающих принципах. Принципе инвариантного погружения, определяющем декомпозицию решения общей задачи на пошаговое решение частных (для каждого вида производственной деятельности) задач, объединяемых общим ресурсом. Принципе оптимальности, определяющем независимость решений, получаемых на текущем шаге оптимизации, от решений, полученных на предыдущих (последующих) шагах, а лишь их зависимость от цели оптимизации и состояния ресурсов на i-м шаге. При этом гарантируется оптимальность глобальной стратегии (последовательности решений) при оптимальных локальных (пошаговых) решениях. Процесс решения задачи методом динамического программирования включает два этапа. На первом этапе пошаговые задачи оптимизации приводят к условно-оптимальным по ресурсу (состояниям) решениям и одному (конечному) безусловно-оптимальному решению. На втором этапе формируется окончательная безусловно-оптимальная стратегия (x1опт, …, xiопт, …, xnопт) путем учета полученного на первом этапе конечного решения и затрат ресурсов на его реализацию, а также обратного по шагам анализа множества условно-оптимальных решений и выделения из него оптимальной стратегии. Рассмотрим методику реализации принципа оптимальности на примере задачи оптимизации производства услуг в сети спутниковой связи. Пусть для сети спутниковой связи необходимо оптимизировать производство услуг двух типов: xa и xб по критерию вида max z = 3xa + 2xб, при ограничениях xа + 2xб £ 6, 2xа + xб £ 8, -xа + xб £ 1, xб £ 2, [xа], [xб] ³ 0. Здесь шаги оптимизации определяются порядком оптимизации различных видов услуг связи: на 1ом шаге i=1 оптимизируется число услуг типа а, на втором шаге i=2 оптимизируется число услуг типа б. Вектор состояния (Bi1, Bi2) определяется двумя видами ресурсов: числом телеграфных и телефонных каналов, подлежащих распределению на i-м шаге, т.е.0£ Bi1£ 6 и 0£ Bi2£ 8. Варианты решений определяются допустимой областью определения переменных xi, подлежащих оптимизации. Далее рассмотрим реализацию алгоритма ДП для случая обратного алгоритма. Критерий оптимальности для первого шага (оптимизация производства услуги xб) принимает вид: f2(B21, B22)= max{2xб}, 0 £ 2xб £ B21 0 £ xб £ B22 Далее определяем допустимые границы изменения состояния на первом шаге: Процесс поиска условно оптимальных решений по величине производства услуги xб отобразим в форме таблицы. Таблица
Второй шаг алгоритма оптимизации связан с отысканием безусловного решения по производству услуги xа при ограничениях на состояние ресурсов, выделенных на оба шага оптимизации . Целевая функция на втором шаге имеет следующий вид: f1(B1) = max{R1(xа) + f2(B1 – C2(x*б))}, при 0£ xа£ B11; 0£ 2xа£ B12 Решение задачи второго этапа представлено таблицей. Таблица
Выполнение второго этапа предполагает определение на основе полученного безусловного решения x*а = 4 состояния ресурса, оставшегося только на первый шаг , и отыскание из таблицы 2 второго безусловного решения, удовлетворяющего этому ограничению x*б = 0. Второй вариант аналитического решения этой же задачи на основе использования информации заключенной в ограничениях на множество оптимизируемых переменных представлен ниже. В этом случае решение также реализует алгоритм обратной прогонки. Первый этап. Для оптимизации производства второго вида услуги xб целевая функция на первом шаге имеет следующий вид: f2(B21, B22)= max{2xб} 0£ 2xб£ B21 0£ xб£ B22 Так как из ограничений следует, что xб £ min{B21/2, B22}, а f2(xб|B21, B22) = 2xб, то, подставляя первое во второе и переходя к максимуму целевой функции, получим f2(B21, B22) = max{f2(xб|B21, B22) = 2xб = 2min{B21/2, B22}, откуда x*б = min{B21/2, B22}. Т.е. оптимальное значение числа услуг типа б, получаемое на шаге 1, равно минимальному из двух видов ресурсов (числу телеграфных B21/2 или телефонных каналов B22), распределяемых на первом шаге. Далее для шага 2 имеем: f1(B11, B12) = max {3xa+f2(B11-xa, B12-2xa)}= max {3xa+2min{(B11-xa)/2, B12-2xa}}, 0£ xa£ B11; 0£ 2xa£ B12, где B11=6 и B12=8 для первого шага оптимизации. Подставляя значение ресурсов ТГ и ТФ каналов в ограничения, получим обобщенное ограничение в виде xa £ min(B11, B12/2)=4. Учитывая пропорциональную зависимость значения целевой функции от значения xa последнее неравенство превращается в равенство, а соответствующее решению xa*= 4 оптимальное (максимальное) ее значение f1*(4) = 12. Второй этап. Безусловное решение на первом шаге оптимизации числа предоставляемых услуг xб необходимо проводить для следующего состояния по ресурсам: B21 = B11- xa*=6-4=2; B22 = B12- 2xa* =8-8=0. Откуда из условного решения следует безусловное: xб*= min { B21/2, B22 }= min { 1, 0 }= 0. Таким образом, пошаговое решение задачи линейного программирования методом динамического программирования обеспечило в целом оптимальную стратегию производства услуг в одну единицу времени xa= 4, xб = 0 при максимальном для случая целочисленного решения значении дохода сети спутниковой связи z = 12 у.е./ед.вр. Пример. Задача оптимального распределения ресурсов резервирования в радиорелейной линии связи. Рассмотрим радиорелейную линию, состоящую из n интервалов. В случае независимых технических отказов различных интервалов вероятность безотказной работы всей РРЛ определяется выражением: , где Pi –вероятность безотказной работы i-го интервала. Для повышения надежности данной последовательной системы используется резервирование станций на каждом из отдельных интервалов РРЛ, вероятность безотказной работы которых определяется выражением: , где qi и pi –вероятность отказа и вероятность безотказной работы элемента на i-м интервале соответственно; xi- число резервных станций на i-м интервале; 1+xi –общее число (одна рабочая и xi резервная) станций в i-м интервале. Пусть также введены ограничения на число резервных станций xi £ 2; i=1, n. При этом суммарная стоимость резервных элементов с учетом известных ограничений на число станций в подразделении, развертывающем РРЛ не может превысить величины СS = 1200у.ед. Остальные исходные данные, содержащие сведения о надежности pi(xi) и стоимости резервных средств ci(xi) i-го интервала, даны в таблице.
В указанной таблице значения вероятностей безотказной работы i-х интервалов при использовании в них xi резервных станций определяются из выражения pi(xi) = 1-(1-pi)1+xi, где pi-вероятность безотказной работы интервала при отсутствии резерва. Необходимо определить оптимальное количество резервных станций на каждом интервале xiопт, обеспечивающих максимальную надежность РРЛ, т.е. , при ограничениях Для решения этой нелинейной задачи применим метод динамического программирования и, в частности, алгоритм обратной прогонки. При этом номер шага соответствует номеру интервала, под состоянием si (0£ si£ CS) понимается суммарная стоимость основного и резервного оборудования, задействованного на i-м и последующих интервалах, а под вариантами решения xi понимаем допустимое число резервных элементов в i-м интервале. Рекуррентное соотношение для функции Беллмана в данном случае может быть записано в виде: Fn(sn) = , Fi (si) = , si = CS - , k = 1, i = 1, 2, …, n-1. Из таблицы найдем границы изменения состояния si на каждом шаге: s3min=c3(x3=0)=300у.е., s3max=СS - = CS - [c1(x1 = 0) + c2(x2 = 0)] = 1200 – 300 = 900у.е., s2min=c2(x2 = 0) + c3(x3 = 0) = 200 + 300 = 500у.е., s2max=CS - c1(x1 = 0)=1200 – 100 = 1100у.е., s1=CS = 1200у.е. На первом этапе обратного алгоритма рассматривают шаг 3. Найденные на этом и последующих этапах значения критерия и условно-оптимальные решения для всех допустимых значений si и оптимизируемых переменных xi=0, 1, 2 представлены в нижеследующих таблицах. Шаг 3
Шаг 2
Здесь значения функции Беллмана на втором шаге определяются с учетом ее значения на предыдущем шаге согласно выражению Fi(ci)= pi(xi)Fi+1(CS - ci). Шаг 3
Безусловное оптимальное решение на первом этапе получено лишь для шага 3 (числа резервных станций на первом интервале x1опт=1), поэтому окончательная стратегия относительно необходимых резервных станций в каждом из трех интервалов может быть получена лишь на втором этапе – этапе анализа результатов пошаговой оптимизации. Так как x1опт=1, то величина ресурса, подлежащая распределению на первом и втором шагах будет равно S2 = CS - c(x1) = 1200 - 200 = 1000у.е. Тогда из предпоследней таблицы для S2=1000 получим оптимальное число резервных станций во втором интервале: x2опт=1. Следовательно, состояние S3=CS - ë c(x1опт) + c(x2опт)û = 1200 – (200 + 400) = 600у.е. Наконец, из последней таблицы для S3=600 имеем оптимальное число резервных станций на третьем интервале: x3опт=1. Окончательно, оптимальная стратегия распределения резерва имеет вид: , т.е. на каждом радиорелейном интервале должно находиться по одной резервной радиорелейной станции. Вероятность безотказной работы РРЛ при этом составляет PРРЛ= 0, 5733; суммарные затраты и затраты по интервалам составляют CS=1200; С1=200; С2=400; С3=600у.е. Интервальные вероятности безотказной работы составляют p1(x1=1)=0, 91; p2(x2=1)=0, 84; p3(x3=1)=0, 75.
Тема 7. Задачи поиска оптимальных путей на графах с неотрицательными весами ребер. План лекции: Алгоритм Флойда – Уоршелла. Алгоритм Дейкстры. Краткое содержание лекции Алгоритм Флойда - Уоршелла Алгоритм Флойда - Уоршелла – динамический алгоритм для нахождения кратчайших расстояний между всеми вершинами взвешенного ориентированного графа. Разработан в 1962 году Робертом Флойдом и Стивеном Уоршеллом. Более строгая формулировка этой задачи следующая: есть ориентированный граф G = (V, Е) каждой дуге v –> w этого графа сопоставлена неотрицательная стоимость C[v, w]. Общая задача нахождения кратчайших путей заключается в нахождении для каждой упорядоченной пары вершин (v, w) любого пути от вершины v к вершине w, длина которого минимальна среди всех возможных путей от v к w. Формальное описание. Для определенности положим, что вершины графа последовательно пронумерованы от 1 до n. Алгоритм Флойда использует матрицу А размера n´ n, в которой вычисляются длины кратчайших путей. Вначале A[i, j] = C[i, j] для всех i ≠ j. Если дуга i –> j отсутствует, то C[i, j] = infinity. Каждый диагональный элемент матрицы А равен 0. Над матрицей А выполняется n итераций. После k-й итерации A[i, j] содержит значение наименьшей длины путей из вершины i в вершину у, которые не проходят через вершины с номером, большим k. Другими словами, между концевыми вершинами пути i и j могут находиться только вершины, номера которых меньше или равны k. На k-й итерации для вычисления матрицы А применяется следующая формула: Ak[i, j] = min(Ak-1[i, j], Ak-1[i, k] + Ak-1[k, j]) Нижний индекс k обозначает значение матрицы А после k-й итерации, но это не означает, что существует n различных матриц, этот индекс используется для сокращения записи. Для вычисления Ak[i, j] проводится сравнение величины Ak-i[i, j] (т.е. стоимость пути от вершины i к вершине j без участия вершины k или другой вершины с более высоким номером) с величиной Ak-1[i, k] + Ak-1[k, j] (стоимость пути от вершины i до вершины k плюс стоимость пути от вершины k до вершины j). Если путь через вершину k дешевле, чем Ak-1[i, j], то величина Ak[i, j] изменяется. Оценка сложности. Время выполнения этой программы, очевидно, имеет порядок O(n3), поскольку в ней практически нет ничего, кроме вложенных друг в друга трех циклов. Доказательство правильности работы этого алгоритма также очевидно и выполняется с помощью математической индукции по k, показывая, что на k-й итерации вершина k включается в путь только тогда, когда новый путь короче старого. Пример графа и таблица расстояний для него.
Алгоритм Дейкстры. Алгоритма Дейкстры находит оптимальные маршруты и их длину между одной конкретной вершиной (источником) и всеми остальными вершинами графа. Недостаток данного алгоритма в том, что он будет некорректно работать если граф имеет дуги отрицательного веса. Формальное определение. Дан взвешенный ориентированный граф G (V, E) без петель и дуг отрицательного веса. Найти кратчайшие пути от некоторой вершины a графа G до всех остальных вершин этого графа. Неформальное описание. Каждой вершине из V сопоставим метку – минимальное известное расстояние от этой вершины до a. Алгоритм работает пошагово – на каждом шаге он «посещает» одну вершину и пытается уменьшать метки. Работа алгоритма завершается, когда все вершины посещены. Инициализация. Метка самой вершины a полагается равной 0, метки остальных вершин – бесконечности. Это отражает то, что расстояния от a до других вершин пока неизвестны. Все вершины графа помечаются как непосещённые. Шаг алгоритма. Если все вершины посещены, алгоритм завершается. В противном случае, из ещё не посещённых вершин выбирается вершина u, имеющая минимальную метку. Мы рассматриваем всевозможные маршруты, в которых u является предпоследним пунктом. Вершины, в которые ведут рёбра из u, назовем соседями этой вершины. Для каждого соседа вершины u, кроме отмеченных как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки u и длины ребра, соединяющего u с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину u как посещенную и повторим шаг алгоритма. Рассмотрим алгоритм на примере, возьмем ориентированный граф G: Этот граф можно представить в виде матрицы С: Возьмем в качестве источника вершину 1. Это значит что мы будем искать кратчайшие маршруты из вершины 1 в вершины 2, 3, 4 и 5. Данный алгоритм пошагово перебирает все вершины графа и назначает им метки, которые являются известным минимальным расстоянием от вершины источника до конкретной вершины. Рассмотрим этот алгоритм на примере. Присвоим 1-й вершине метку равную 0, потому как эта вершина – источник. Остальным вершинам присвоим метки равные бесконечности. Далее выберем такую вершину W, которая имеет минимальную метку (сейчас это вершина 1) и рассмотрим все вершины, в которые из вершины W есть путь, не содержащий вершин посредников. Каждой из рассмотренных вершин назначим метку равную сумме метки W и длинны пути из W в рассматриваемую вершину, но только в том случае, если полученная сумма будет меньше предыдущего значения метки. Если же сумма не будет меньше, то оставляем предыдущую метку без изменений. После того как мы рассмотрели все вершины, в которые есть прямой путь из W, вершину W отмечаем как посещённую, и выбираем из ещё не посещенных такую, которая имеет минимальное значение метки, она и будет следующей вершиной W. В данном случае это вершина 2 или 5. Если есть несколько вершин с одинаковыми метками, то не имеет значения какую из них мы выберем как W. Выберем вершину 2. Но из нее нет ни одного исходящего пути, поэтому сразу отмечаем эту вершину как посещенную и переходим к следующей вершине с минимальной меткой. На этот раз только вершина 5 имеет минимальную метку. Рассмотрим все вершины в которые есть прямые пути из 5, но которые ещё не помечены как посещенные. Снова находим сумму метки вершины W и веса ребра из W в текущую вершину, и если эта сумма будет меньше предыдущей метки, то заменяем значение метки на полученную сумму. Исходя из картинки мы можем увидеть, чт
|