Текст
                    и. в. романовский
АЛГОРИТМЫ
РЕШЕНИЯ
ЭКСТРЕМАЛЬНЫХ
ЗАДАЧ
ИЗДАТЕЛЬСТВО «НАУКА»
^/|| ГЛАВНАЯ РЕДАКЦИЯ
ФИЗИКО-МАТЕМАТИЧЕСКОЙ ЛИТЕРАТУРЫ
Москва 1977


518 Р 69 УДК 519.9 Алгоритмы решения экстремальных задач. И. В. Романов- Романовский. Главная редакция физико-математической литературы изд-ва «Наука», М., 1977. В книге излагаются теория и численные методы решения важ- важных классов экстремальных задач: общей задачи линейного програм- программирования, транспортной задачи и задач, ей родственных, комбина- комбинаторных задач-на графах, ряда дискретных задач динамического про- программирования. Изложение численных методов сопровождается разбором алго- алгоритмов, записанных на алгоритмических языках алгол-60 и алгол-68; при этом особое внимание уделено вопросам представления данных при эффективной организации вычислительного процесса. Книга рассчитана на студентов-старшекурсников и аспирантов математических факультетов, специализирующихся в приложениях, а также на сотрудников научно-исследовательских учреждений и вычислительных центров, связанных с разработкой численных мето- методов решения экстремальных задач. Илл. 73, табл. 37, библ. 233 назв. Иосиф Владимирович Романовский АЛГОРИТМЫ РЕШЕНИЯ ЭКСТРЕМАЛЬНЫХ ЗАДАЧ М., 1977 г., 352 стр. с илл. Редакторы Н. П. Рябенькая, Г. Я. Пирогова Техн. редактор //. В. Кошеле<ш Корректор В. В. Сидоркина Сдано в набор 5. 11. 1976 г. Подписано к печати 20. 04. 1977 г. Формат 84Х108'/з2, тип. .\« 3. Физ. неч. л. 11. Условн. печ. л. 18,48. Уч.-изд. л. 19,05. Тираж 10 000 экз. Т-08427. Цена книги 1 р. 44 к. Заказ As 919. Издательство «Наука» Главная редакция физико-математической литературы 117071, Москва, В-71, Ленинский проспект, 15 Ордена Трудового Красного Знамени Ленинградское производственно-техниче- производственно-техническое объединение «Печатный Двор» имени А. М. Горького Союзполиграфпрома при Государственном комитете Совета Министров СССР по делам издательств, полиграфин и книжной торговли, 197136, Ленинград, П-136, Гатчинская ул., 26. 20204—069 ,о __ © Главная редакция Р ~ 48-77 физико-математической литературы 053 @2-J77 издательства «Наука», 1977 •
ОГЛАВЛЕНИЕ Предисловие 5 Глава 1. Подготовительные сведения 9 § 1. Принятые обозначения 9 § 2. Описания алгоритмов 14 § 3. Представление данных в вычислительной машине ... 22 § 4. Списки 35 Глава 2. Некоторые общие сведения о линейном программи- программировании ' 46 § 1. Введение 46 § 2 Постановка задачи линейного программирования ... 47 § 3. Теория двойственности 52 § 4. Базисные решения Метод последовательных улучшений 59 § 5. Устранение зацикливания и сходимость метода последо- последовательных улучшений 70 § 6. Некоторые реализации метода последовательных улуч- улучшений 72 Г л а в а 3. Транспортная задача 95 § 1. Основные определения теории графов 95 § 2. Способы задания графа 97 § 3. Связность 100 § 4. Деревья 106 § 5. Постановка транспортной задачи 109 § 6. Решение систем с матрицей инциденций 112 § 7. Метод потенциалов . 115 § 8. Алгоритмическая реализация метода потенциалов ... 124 § 9. Варианты транспортной задачи 137 Глава 4. Задачи, родственные транспортной 148 § 1. Упорядочения 148 § 2. Матрица кратчайших расстояний 151 § 3. Дерево кратчайших путей 155 § 4. Критический путь 163 § 5. Кратчайшее дерево 173 § 6. Максимальный поток через сеть 180 § 7. Распределение ресурсов в сетевом графике 185 § 8. Покрытие графа путями 189
* ОГЛАВЛЕНИЕ § 9. Паросочетания в простых графах 192 § 10. Венгерский метод для задачи о назначениях 195 § 11. Матрицы из нулей и единиц 202 Глава 5. Многоэкстремальные задачи на графах 206 § 1. Характеристические числа графа 206 § 2. Эйлеровы и гамильтоновы пути и циклы 208 § 3. Метод петвей и границ 211 § 4. Размыкание контуров в графе 224 § 5. Кратчайшее частичное дерево 227 § 6. Задача об оптимальном раскрое 228 § 7. Задачи с бивалентными переменными " 231 § 8. Задача размещения производства 243 § 9. Выбор наилучшего разбиения 247 Глава 6. Рекуррентные методы (модели динамического про- программирования) 252 § 1. Линейная задача раскроя 252 § 2. Детерминированная задача управления запасами . . . 259 § 3. Общая схема динамического программирования. Де- Детерминированный случай 263 § 4. Достаточные условия разрешимости уравнения Белл- мана 268 § 5. Асимптотическое поведение последовательных прибли- приближений 272 § 6. Задача замены оборудования 276 § 7. Задачи оптимального резервирования и надежности 278 § 8. Поиск неисправности 282 § 9. Плоская задача раскроя 287 § 10. Связь динамического программирования и улучшенного перебора 293 § 11. Схема исключения Вертеле — Бриоши 295 Глава 7. Марковские процессы решения 299 § 1. Некоторые сведения о марковских цепях 299 § 2. Марковские цепи и потенциалы 308 § 3. Пример управляемого случайного процесса: стохастиче- стохастическая задача управления запасами 312 § 4. Марковские и полумарковские процессы решения . . 315 § 5. Функциональные уравнения и рекуррентные соотноше- соотношения Беллмана для марковских процессов решения . . 319 § 6. Асимптотика рекуррентных соотношений 325 § 7. Методы нахождения оптимальной стационарной поли- политики 330 Библиографические указания 334 Литература 340 Предметный указатель 350
ПРЕДИСЛОВИЕ В этой книге излагаются в различных аспектах — от теоретического исследования до программы — методы реше- решения экстремальных задач, главным образом дискретных. Серьезные экстремальные задачи решаются на вычисли- вычислительных машинах, и это обстоятельство, несомненно, должно влиять на разработку, изучение и изложение методов решения экстремальных задач. Речь должна идти об эффек- эффективной организации вычислительного процесса, при раз- разработке которой следует учитывать многие «технические» и кажущиеся несущественными детали — структуру вычис- вычислительной машины, формы представления данных, особен- особенности используемых алгоритмических языков и соответст- соответствие нх грамматических конструкций машинным возмож-_ ностям. Имеется широкий круг практически важных задач, в которых «вычислительная» в традиционном понимании часть действий оказывается очень скромной, и основные сложности лежат в логической структуре алгоритма и в вопросах представления исходной и вспомогательной информации. В таких задачах (а размеры и время счета в них часто бывают значительными) обычно особенно существенно правильно организовать вычисления. Цель этой книги — показать в действии некоторые способы организации вычислений, используемые в совре- современных методах решения экстремальных задач. Однако нельзя достичь хорошего понимания этих вопросов, если формализация задачи отделена от выбора метода реше- решения, метод решения —от возможностей алгоритмического языка, запись алгоритма —от понимания особенностей вычислительной машины и класса решаемых задач.
D ПРЕДИСЛОВИЕ Очевидно, что задача влияет на метод, метод на алгоритм, алгоритм на ход вычислений. Важно отметить, что хоро- хороший алгоритм должен учитывать специфику вычислитель- вычислительного процесса, хороший метод вычислений — конструкции алгоритмического языка, хорошая постановка задачи — понятия, характерные для предполагаемого численного метода. Таким образом, деление изложения на «теоретическую», «алгоритмическую» и «чисто программистскую» части представляется не только неестественным, но даже и вред- вредным, и было сделано все возможное, чтобы соединить эти части в единое целое и по возможности облегчить переходы. С этой целью была выбрана система обозна- обозначений, в которой такие переходы не вызывают затрудне- затруднений. Для демонстрации готовых алгоритмов и отдельных конструкций используются два языка: алгол-60 и алгол-68, и такой выбор требует некоторых пояснений. Было бы достаточно алгола-68, который очень хорошо подходит для всех приводимых в книге алгоритмов. Этот язык лаконичен и нагляден, имеет гибкие способы работы со структурами, четкую и осмысленную грамма- грамматику. Поэтому в качестве языка публикации он предпо- предпочтительнее, чем, скажем, ПЛ/1. Опыт показывает, что переписать программу с алгола-68 на ПЛ/1 совсем не- несложно, и такая программа может гораздо4 лучше исполь- использовать особенности вычислительной машины (например, Единой системы ЭВМ) чем программа на фортране или алголе-60. Языка алгол-60 для поставленных целей недостаточно. Тем не менее записи на языке в книге оставлены с уче- учетом его широкой известности, наличием трансляторов на большинстве вычислительных машин, а также для сопоставления различных форм описания алгоритмов и представления информации. Некоторые вводные сведения о характерных приемах представления данных и описания алгоритмов излагают- излагаются в гл. 1. Здесь же. вводится упомянутая система обозначений и, поскольку алгол-68 распространен еще не очень широко, разъясняются некоторые характерные его конструкции. Хотя основной нашей целью являются дискретные экстремальные задачи, линейное программирование может
ПРЕДИСЛОВИЕ ' рассматриваться как естественное начало. Поэтому в гл. 2 в лаконичной форме приведены основные факты теории ли- линейного программирования, постановки задач, метод после- последовательного улучшения допустимого базисного решения и различные подходы к его вычислительной реализации. В гл. 3 вводятся определения теории графов, которые затем интенсивно используются во всем дальнейшем изложении, после чего начинается изучение задач, связан- связанных с транспортными потоками. Эти задачи интересны не только своими непосредственными практическими при- приложениями, по и неожиданными и интересными связями с различными разделами математики, в частности с комби- комбинаторикой. Эти комбинаторные следствия из теории пото- потоков и родственные им задачи собраны в гл. 4. Далее, в гл. 5 появляются более сложные комбинаторные задачи, для которых, как правило, нет хороших методов реше- решения и в качестве основного вычислительного средства рассматривается метод улучшенного перебора. Последние две главы посвящены специфическим зада- задачам (задачам динамического программирования), которые можно решать рекуррентно, сводя задачу к такой же задаче меньших размеров. В гл. 6 рассматриваются комбинаторные задачи этого тина, а в гл. 7 —близкие по духу к материалу остальной книги вероятностные задачи, связанные с управляемыми марковскими цепями (марковские процессы решения). Читателю, знакомому с литературой, бросится в глаза отсутствие многих традиционных разделов математиче- математического программирования. Это естественно — задача пред- предлагаемой книги в том, чтобы пополнить литературу изложением вопросов, которые слабее в ней представлены, а нуждаются в не меньшем внимании. В библиографи- библиографических указаниях в конце книги приводятся ссылки на «традиционную» литературу. К сожалению, даже в тех вопросах, которые включены в книгу, изложение может показаться односторонним, и для такого впечатления есть основания. Единство стиля как в теоретических, так и в вычислительных вопросах требовало серьезной переработки каждой используемой работы, часто существенно изменяющей первоначальные идеи ее. По возможности неполнота текста компенси- компенсируется библиографическими указаниями.
о ПРЕДИСЛОВИЕ Эта книга появилась в результате моей преподава- преподавательской деятельности на математико-механическом фа- факультете Ленинградского государственного университета. Ее можно использовать как пособие для спецкурсов по методам дискретной оптимизации, читаемых на мате- математических факультетах университетов и технических вузов. При работе над книгой большую помощь мне оказали заведующий кафедрой исследования операций проф. М. К. Гавурин и сотрудники кафедры и лабора- лаборатории исследования операций ЛГУ. Приношу им искрен- искреннюю благодарность. Автор
ГЛАВА 1 ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ § 1. Принятые обозначения Так как основная часть этой книги посвящена вычис- вычислительным аспектам оптимального программирования, нам пришлось во многих случаях углубляться в такие детали организации вычислений, которые могут пока- показаться чисто техническими и лишними для понимания существа проблем. Между тем в том круге задач, который мы здесь рассматриваем, часто именно эти детали являются наи- наиболее существенными. Поэтому мы вынуждены приводить алгоритмы и структуру данных в них и ожидаем, что читатель не будет делить текст на теоремы и алгоритмы. Для того чтобы в этих алгоритмах было проще раз- разбираться, были предприняты некоторые специальные усилия. Прежде всего, все алгоритмы написаны так, чтобы у читателя вырабатывались некоторые полезные стереотипы их восприятия, —одни и те же (или сход- сходные) обозначения используются для индексов, похожих переменных, процедур и массивов. Например, число итераций, как правило, обозначается iter, малое число eps (от «епсилон»), очень большое число мы привыкли обоз- обозначать gz (от немецкого grope Zahl) и т. д. Названия меток, как правило, начинаются с mk. Некоторые приемы программирования описываются в следующих параграфах этой главы на простых задачах. Не все из этих задач встретятся в дальнейшем тексте буквально, — некоторые нужны лишь для описания новых конструкций и для выработки соответствующих стереоти- стереотипов. В § 2 мы дадим рекомендации по чтению алгорит- алгоритмов, в § 3 опишем некоторые ргспространенные струк- структуры данных, а в последнем параграфе специально более подробно остановимся на операциях со списками.
'О ГЛ. 1. ПОДГОТОВИТЕЛЬНЫ!;. СВЕДЕНИЯ Наконец, для того чтобы алгоритмы не выделялись из общего текста, нам пришлось несколько изменить систему векторно-матричных обозначений, сближая ее с той, которая представляется естественной в описаниях алгоритмов. Используемая нами система обозначений описана в этом параграфе. Нам будет удобно в обозначении вектора иметь мно- множество индексов его компонент. Таким образом, вектор будет рассматриваться как функция, заданная на конечном множестве, которое не обязательно будет множеством целых чисел от 1 до какого-то п. Вектор *={*,-}, где i пробегает множество М, будет обозначаться через х[М]. Аналогично матрица будет рассматриваться как функция, заданная на прямом произведении двух конечных мно- множеств. Разумеется можно само это произведение считать множеством — при этом наша матрица будет рассматри- рассматриваться как вектор на этом множестве. Матрицу Z = ,J2/;-j', /еМ, / е N, мы обозначим через г [М, N]. Преимущество этой системы обозначений видно в тех случаях, когда требуется выделить какую-то часть («вырезку») вектора или матрицы, соответствующую некоторому подмножеству множества индексов. Если КсМ, то соответствующий К «кусок» вектора х естест- естественно обозначить через х[К]. Компонента вектора, имею- имеющая индекс i, естественно обозначается через x\i],— различие между компонентой вектора и однокомпонент- ным вектором определяется обычным различием между элементом множества и одноэлементным множеством: х\i] — компонента, x[{i}] —однокомпонентный вектор. Для матриц мы получаем больше возможностей: г, /] — элемент z;j, г i, NJ — i-я строка матрицы z[M, N] (вектор), z M, /| — /-й столбец той же матрицы (тоже вектор), г [К, L] — подматрица матрицы z [M, N], в которой множе- множеством строк является К.с:М, а множеством столбцов LclV. Мы не различаем векторов-строк и векторов-столбцов. Для превращения вектора у [К] в матрицу необходимо ввести еще одно множество индексов — какое-либо одноэле- одноэлементное множество R. Матрица у [К, R) будет соответствую- соответствующей у\К\ одностолбцовой матрицей, а у [R, К] — одно- однострочной.
§ 1. ПРИНЯТЫЕ ОБОЗНАЧЕНИЯ " Существенно, что однотипность векторов и матриц определяется не совпадением числа компонент, а совпа- совпадением множества индексов. Этой условности должны подчиняться и действия над ними. Так, сложить или скалярно перемножить два вектора х[М] и y[N] можно лишь в том случае, если M — N. Для скалярного произ- произведения векторов и для произведений матрицы на век- вектор и матрицы на матрицу мы будем всегда использо- использовать знак х (при умножении скаляров мы также будем ставить знак- умножения, чтобы иметь возможность вводить для переменных многобуквенные обозначения). Естественно, что матрицу а[М, N] можно умножить справа на матрицу b[K, L] только в том случае, если N = /С Их произведение будет обозначаться с\М, L] = a[M, N]xb[N, I]. Особого упоминания заслуживают нулевой вектор 0[/V] (векторный нуль), все компоненты которого равны 0, и векторная единица 1 [N] — вектор, все компоненты кото- которого равны 1. Аналогично оп-ределяются матричный нуль и матричная единица. Для векторов (и матриц), в отличие от вещественных чисел, имеется три вида неравенств1): x[N]>y[N] (x[N] строго больше y[N\), если x[i]^>y[i], i e /V, x[N}l5sy[N] (x[N] не меньше y[N]), если x[i]^y[i], ieaN, x[Nj>y[N] (х[Щ больше у[Щ), если x[N]lS2:y[N], х[Щфу[М]. Разность x[N] — y[N] называется в этих случаях соответственно строго положительной, неотрицательной или положительной. Векторную единицу удобно использовать для сумми- суммирования компонент вектора: J) Часто используется знак ?2 для отношения «не меньше» и Зг для «больше». Примятая нами здесь система обозначение введена польскими математиками. Она удобнее тем, что в ней сохраняется существующая условность неравенств для скаляров, а отношение «больше» для векторов используется чрезвычайно редко.
12 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ Неотрицательный вектор x[N], сумма компонент кото- которого равна 1, т. е. l[N]xx[N]=l, x[N\^0[N], называется вероятностным вектором. Компоненты этого вектора могут рассматриваться как вероятности событий в некоторой вероятностной схеме с множеством исходов N. Совокупность всех вероятностных векторов с множеством индексов N называется основным симплексом и будет обозначаться через 5Л'. Для задания матриц или их подматриц в памяти вычислительной машины в качестве множества индексов должны использоваться отрезки множества целых чисел. Множество целых чисел от k до / будет обозначаться через k : /. Если нам понадобится записать матрицу или вектор с каким-либо иным множеством индексов, это множество придется отобразить в отрезок множества целых чисел. Таким образом, нам необходимо преду- предусмотреть возможности задания отображений одного мно- множества в другое. В связи с этим нам понадобятся еще несколько обозначений. Введем процедуру-функцию б от условия (логической переменной) а, принимающую значение 1, когда а истинно, и 0, когда а ложно. Ыа алголе-60 эта процедура описы- описывается так: integer procedure б (a); value a; boolean a; б: = if a then I else О Ее можно использовать, например, вместо символа Кро- некера, так как б,;- в обычном понимании здесь запи- запишется б(г = /). Функция Хевисайда с помощью нашей процедуры примет вид б(х>0I). Пусть задано отображение T:M-*~N. Матрица Д[М, N], где А[(, /] = б(/ = 77) называется матрицей ото- отображения Т. Если отображение Т взаимно однозначное, Д называется назначающей матрицей, а если, кроме того, ') В языке алгол-68, который мы также будем иногда использо- использовать, эта процедура реализована одной из операций, описанных в так называемом стандартном вступлении вместе с другими стандарт- стандартными средствами, именно операцией abs. Таким образом, мы можем написать соответственно abs a, abs ((' = /), abs (x > 0).
4 1. ПРИНЯТЫЕ ОБОЗНАЧЕНИЯ № М.= N —переставляющей матрицей. Переставляющая мат- матрица Л[М, М], соответствующая тождественному отобра- отображению li — i, называется единичной и обозначается через Е [М, М]. Теперь предположим, что в памяти машины требуется записать, например, матрицу Ь[М, 1:п]. В этом случае нужно задать отображение Т: M-*-l: m, где т ='М\ — число элементов множества М, после чего можно будет работать с матрицей Ь'[\ : т, 1 : я], в которой b'[Ti, 1 :/?] = & ft, 1 :н]. Связь матриц Ь' и Ь можно описать с помощью матрицы А отображения Т b[M, l:n] = A[M, l:m]xb'[\:m, 1 : п]. Отображение Т: M-+-N может быть задано также и непо- непосредственно вектором t[M], значения компонент которого суть элементы из N. Используя такое обозначение, мы можем описать связь b и Ь' еще проще: Ь[М, 1 :n] = b'[t[M], I :n]. Векторное задание отображений удобно и при рассмотре- рассмотрении суперпозиций отображений: если t\M\ задает отобра- отображение T:M-+N, a s [Л/] —отображение S'.N-^R, то отображение ST:M-+R будет задаваться вектором s[t[M]]. В заключение этого параграфа введем несколько обозначений, связанных с понятиями линейной алгебры. Пусть . М : = ЛГ. Матрица b~[N, M\ называется обрат- обратной к матрице b[M, N], если br[N, M]xb[M, N] = E[N, N]. Известно, что для существования обратной матрицы необходимо и достаточно, чтобы строки матрицы b[M, N] были линейно независимы, т. е. из равенства y[M]xb[M, ЛГ| = О[ЛГ| следовало, что у[М] = 0[М]. При этом Ь[М, N]xb-[N, M] = E[M, M],
14 ГЛ. I. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ и если y[N] есть решение системы Ь[М, N]xy[N] = d[M], то y[N] = b~[N, M]xd[M]. Ранг матрицы а[М, N] мы будем обозначать через rank (a[M, N]), а определитель — через det(a[M, Л/]). Для вычисления определителя необходимо, чтобы М = N или чтобы было задано взаимно однозначное отображе- отображение Т: М —*¦ N. От задания этого отображения зависит знак определителя. Мы будем пренебрегать этим требова- требованием, когда речь будет идти просто о невырожденности матрицы, т. е. об условии det (a[M, N\)=?0. Наконец, часто нам придется изменять множество, добавляя к нему один элемент или удаляя из него один элемент. Вместо громоздких обозначений N\){j} и N\{j} мы будем в этом случае писать N + j и N — /. Надеемся, у читателя не вызовет затруднений и смысл выражения ЛГ + /О-/1. § 2. Описания алгоритмов Как уже отмечалось, нам придется описывать, анали- анализировать и конструировать алгоритмы. По сути дела этому посвящена основная часть текста, так как в рас- рассматриваемых нами комбинаторных задачах формулы встречаются очень редко и играют подчиненную роль — они служат для подготовки и обоснования вычислитель- вычислительного процесса. В связи с этим можно вспомнить о происхождении формул. Они появились в математике как способ описа- описания вычислительного процесса. В рассматриваемых нами задачах формульное описание вычислений становится мало удобным по нескольким причинам. Прежде всего, те процессы, о которых будет идти речь, имеют очень сложную лог-ическую структуру и с помощью формул
§ 2. ОПИСАНИЯ АЛГОРИТМОВ 15 описываются плохо. Далее, эти процессы, как правило, итеративны, и для их описания требуется индукция в переходе от комплекта информации одного шага к комплекту другого шага. Наконец, если мы описываем вычислительный процесс, предназначенный для вычисли- вычислительной машины, то очень важной частью этого процесса является способ представления вычислительной инфор- информации. Поэтому сейчас принято описывать вычислительный процесс именно как процесс. Чтобы задать процесс, нужно сказать, что представляет собой состояние про- процесса—комплект информации, каково начальное состоя- состояние — значение этой информации в начале процесса — и каковы правила перехода от текущего состояния к сле- следующему. Эти правила описываются в виде последова- последовательности пунктов с указанием условий перехода от одного пункта к другому. (По традиции, если не сказано, к какому пункту следует переходить дальше, то нужно перейти просто к следующему пункту.) Рассмотрим небольшой пример, в котором исполь- используется такое описание вычислительного процесса. Пусть требуется перебрать все подмножества 1 : п, т. е. множе- множества целых чисел от 1 до п. Каждое такое множество А можно задать его характеристическим вектором chi[\ : п], где c/i[[i] = 6(iGi4). В свою очередь каждый такой век- вектор можно рассматривать как двоичную запись некото- некоторого натурального числа, и перебрать все такие векторы можно, перебрав все числа от 0 до 2п— 1 (т. е. все эле- элементы множества 0:2"—1). Организация перебора чисел из отрезка натурального ряда труда не представляет — следует взять первое из чисел и последовательно при- прибавлять к нему по единице нужное число раз. Теперь можно описать наш алгоритм. Состоянием вычислительного процесса будет вектор chi[\ : п]. Началь- Начальное его значение chi[\ :и] = 0[1 : п]. Правила преобразования состояния таковы (это пра- правила прибавления единицы к числу, представленному в двоичной системе счисления): 1. Использовать имеющийся вектор chl (перебор характеристических векторов ведется с какой-то целью, поэтому в вычислительном процессе перебора должно быть зарезервировано место для реализации этой цели).
16 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ 2. Найти минимальное i е 1 : я, для которого chi[i] = O. Если такого i нет, т. е. если chi [1 :«]= 1 [1:«], перейти к п. 4. 3. Положить chi[k] — Q для k<ii, положить с/и[/]=1, остальные компоненты вектора оставить без изменений и перейти к п. 1. 4. Завершить вычисления. Кое-какие детали в этом вычислительном процессе опи- описаны, однако, неудовлетворительно. Пункты 2 и 3 нашего алгоритма на самом деле выполняются вместе, и более точное описание алгоритма выглядит так: 1. Использовать имеющийся вектор ehi. 2. Положить целое число k равным 1. 3. Если k>n, то перейти к п. 6. 4. Если chi[k] = 0, то положить chi [k] равным 1 и перейти к п. 1. 5. Положить chi [k] равным 0, увеличить k на 1 и пе- перейти к п. 3. 6. Завершить вычисления. Здесь появляется и часто используется действие «поло- «положить равным». В алгоритмических языках типа алгола для этого действия имеется специальное обозначение*: =», ко- которым мы будем широко пользоваться в описаниях алгорит- алгоритмов. Но часто проще прямо описывать алгоритм на алгорит- алгоритмическом языке. Мы будем пользоваться для этой цели языком алгол-60, а в дальнейшем, когда нам потребуется язык с большими возможностями, — языком алгол-68. Чита- Читателю следует разбирать приводимые описания алгоритмов и выполнять на небольших примерах действия, которые в них описываются. Например, разобранный только что алгоритм описы- описывается на алголе-60 следующей процедурой: procedure subsets (п, use); value n; integer n; procedure use; begin integer i; integer array chi[l:n]; for t: = 1 step 1 until n do chi[i] : = 0; mk: use {chi); for i: = 1 step 1 until n do if chi[i]=l then chi[i]: = O else begin chi [i]: = 1; go to mk end end
§ 2. ОПИСАНИЯ АЛГОРИТМОВ 17 Посмотрим, как будет выполняться оператор subsets D, печать), т. е. как будет действовать процедура в слу- случае п = 4, когда действием, выполняемым над вектором chi, является его печать. Прежде всего будет отведено место для параметра п и на это место будет записано число 4. Дальше будет отведено место для числа i и массива (вектора) с/и [1:4] п i chi После первого выхода на метку mk получаем п i chi 0 0 0 0 Дальше действие передается процедуре печать, которая выводит (выписывает отдельно) вектор chi = @, 0, 0, 0), после чего начинает выполняться оператор цикла. При z = l, поскольку chi[l] = 0, полагаем chi[Y\: = \ и воз- возвращаемся к mk. Следует вывод вектора A, 0, 0, 0) (нуме- (нумерация компонент вектора идет слева направо, а разрядов в позиционной записи числа —справа налево, поэтому за- запись двоичного представления числа 1 выглядит необычно). При i=\ заменяем с/ц'[1] на 0, a chi[2] полагаем равным 1. Таким образом, после третьего выхода к mk процесс вычислений приходит в следующее состояние: Результат печати п 4 Рабочая информация t 2 chi 0 1 0 0 0 0 0 0 10 0 0 @) A) После девятого выхода к mk состояние вычисленийтаково: Вывод п 4 Рабочая I 1 1 шформация chi 1 0 0 1 0 0 0 0 10 0 0 0 10 0 110 0 0 0 10 10 10 0 110 1110 0 0 0 1 @) A) B) C) D) E) F) G) (8)
18 ГЛ. I. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ Простые алгоритмы достаточно понятны и по алголь- ской записи без всяких пояснений. Приведем в качестве примера несколько простых действий над теоретико-мно- теоретико-множественными объектами. Попутно будет введено еще несколько важных определений. По-видимому, никаких трудностей в понимании не должно вызывать у читателя вычисление пересечения двух подмножеств множества 1 :п, представляемых их харак- характеристическими векторами а[1:п] и Ь[\:п], for i: = 1 step 1 until n do c[i]: —a[i]xb[i] Аналогично записывается и вычисление объединения for i: — 1 step 1 until n do c[i]: = a[i] + b[i] — a[i]xb[i] Вот чуть более сложный пример: вектор ^[1:л] задает взаимно однозначное отображение Т: 1: п->-1:п, тре- требуется построить обратное отображение S, также задав его вектором s[l:n]. Этот вектор строится одним просмот- просмотром множества индексов \:п for i: = 1 step 1 until n do s[/ [i]] : — i Если T: \:n-*-\:k и S: l:k-*-l:l, то суперпозиция ST этих отображений, заданных соответственно векторами f[l:ra] и s[l:^], получается оператором цикла for i: — 1 step 1 until и do st[i\: =s[t[i]] Несколько сложнее описываются действия, в которых участвуют разбиения множеств. Напомним, что набор подмножеств Nk, k e К, множества N называется раз- разбиением этого множества, если jV— UfeeK^*- и множе- множества Nh попарно дизъюнктны. Разбиение можно задать характеристическим вектором k[N], задающим отображе- отображение N-+K, где x[i] = k для i^Nk. Нам часто придется иметь дело с разбиениями конеч- конечных множеств. Например, в некоторых практически важных задачах появляются матрицы так называемой «блочной структуры». Блочную матрицу а[М, N], изображенную на рис. 1, можно так описать с помощью разбиений: задано разбиение Ш : М = Цкс^кМ/, и разбие- разбиение 91:jV = []keK^ky заданы матрицы a\Mk, Nk], k^K, все остальные элементы матрицы а[М, N] равны 0.
§ 2. ОПИСАНИЯ АЛГОРИТМОВ 19 N, Пусть ?0?:А/= ИкекМк n9?:/V = [jieL^i — два разбие- разбиения одного и того же множества N. Разбиение Ш-.N = = Us<=sRs называется произведением разбиений Ш и 9f, если для каждого sgS найдутся такие keeK и /eL, что /?J = Mftf)Arz- Формально просто построить произве- произведение двух разбиений. Для этого достаточно построить отображение а произведения К X L в новое мно- множество S и в качестве характери- характеристического вектора нового разбие- разбиения принять c\N\, где c[i] = ---- о (a[i], b[i]), a a\N\ и 6[/VJ — соответственно характеристические векторы первого и второго раз- разбиений. В частности, если К И L— Рис- '• Блочная матрица подмножества отрезков натураль- натурального ряда, имеется простой и достаточно стандартный прием построения отображения сг: выбрав d^> max {k\ksK}, следует положить О 0 О 0 О ж a(k, l) = A) Такая нумерация, хотя она и очень проста, неудобна, так как приводит к появлению лакун в нумерации и быстрому росту максимального номера. Если мы хотим, чтобы элементы разбиения были занумерованы подряд, то целесообразно завести «спра- «справочник» номеров, в котором будут регистрироваться соответствия между появляющимися номерами, вычислен- вычисленными по формуле A), и порядковыми номерами спра- справочника. Для каждого очередного i будет вычисляться г = — о (a[i], b[i]) no A), будут просматриваться значения г, уже встретившиеся ранее и занесенные в справочник, и если вновь вычисленное г там найдется, то его поряд- порядковый номер в справочнике и будет занесен в c[i]. Если же г не найдется, то справочник будет расширен на один элемент (г будет приписано в конце), после чего опять-таки в c[i] будет записан номер, под которым значится г. Опишем этот алгоритм на алголе-60, заведя для спра- справочника целочисленный массив ref и храня в kr длину
20 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ справочника (d принято равным п): kr: = 0; for i: = 1 step 1 until n do begin r: = nxb[i]-\-a[i]; for /: = 1 step 1 until kr do if ref [/] = /• then begin c[t]:=;; go to mkf end; kr:=kr+l; ref[kr]: = r, c[i\.=kr, mkf: end Нумерация элементов разбиения, получающаяся в ре- результате работы этого алгоритма, обладает важной осо- особенностью: элемент разбиения Nk получает номер мень- меньший, чем у элемента Nh в том и только в том случае, если наименьшее из чисел, содержащихся в Nk, меньше наименьшего из чисел, содержащихся в Nt. Это условие хорошо записывается в виде формулы /г < / = min {i' i e Nk] < min {i '¦ i e Nt}. B) Такая монотонная нумерация устанавливается по раз- разбиению однозначно. В дальнейшем под характеристиче- характеристическим вектором разбиения мы всегда будем понимать характеристический вектор с монотонной нумерацией. Представляет интерес задача перебора всех разбиений множества \:п. Легко описать те целочисленные векторы, которые являются характеристическими векторами раз- разбиений. Пусть chi[l:n] — неотрицательный целочисленный вектор, chi[l]=l и вектор psi[l:n] определен равенством psi [k] = max {chi [i] iel :k], C) т. e. psi[k] — число элементов разбиения, пересекаю- пересекающихся с множеством 1 :k. Вектор psi может вычисляться так: k: = psi[l]: = U for i: = 2 step 1 until n do begin if chi[i]>k then k: = chi[i]\ psi[i]:=k end Для того чтобы chi\\:ri\ был характеристическим вектором разбиения, необходимо и достаточно1), чтобы для любого ^el:n-l ') Проверку этого условия мы представляем читателю.
§ 2. ОПИСАНИЯ АЛГОРИТМОВ 21 Будем говорить, что вектор а[1:л] лексикографически предшествует вектору 6[1:«], если для наименьшего &(=1:л, для которого a[k]=?b[k], имеет место a[k]<. <Cb[k]. В дальнейшем мы вернемся к этому определе- определению еще раз в ситуации, где термин окажется более естественным, сейчас же нам достаточно такого опреде- определения. Оказывается удобным перебирать характеристические векторы разбиений в порядке их лексикографического возрастания. Отметим, что каждый начальный отрезок clii[\:k], ^el:n, вектора chi[l:n] является, очевидно, характеристическим вектором некоторого разбиения мно- множества \:k и при фиксированном chi[l:k] компонента chi [1:&+1] может принимать любые значения из мно- множества \:psi[k]-{-l. Лексикографическая упорядочен- упорядоченность перебора заставляет нас сохранять неизменным возможно больший начальный отрезок вектора chi[\:n]. Поэтому переход от имеющегося вектора chl[\:n\ к сле- следующему заключается в том, что разыскивается наиболь- наибольшее fee 1:«, для которого chi[k] может быть увеличено, а при i>k значение chi[l] полагается равным 1. Вычис- Вычисления сильно упрощаются, если вместе с вектором chi хранить и перерабатывать вектор psi[l:n], определенный формулой C). Перебор оформлен в виде процедуры, в которой обра- обращение к процедуре use имеет тот же смысл, что и раньше в процедуре subsets: procedure partitions (n, use); value n; integer n; procedure use; begin integer i, /, k; integer array chi, psi[l:n]; for i: = 1 step 1 until n do chi[i\. = psi[i]: = 1; tnk: use {chi); for i:—n step—1 until 2 do if psi [i] — psi [i—I] then begin k: = chi [i]: = chi [i] -f-1; if k > psi [i] then psi [i]: = k; for /: = i -f 1 step 1 until n do psi[j]: = psi[i]; go to tnk end else chi [i]: = 1 end
22 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ В дальнейшем нам встретятся экстремальные задачи, в которых требуется выбрать разбиение некоторого мно- множества, удовлетворяющее дополнительным ограничениям и минимизирующее некоторый функционал на множестве разбиений. § 3. Представление данных в вычислительной машине При разработке алгоритма, который должен быть реализован на вычислительной машине, одной из важ- важнейших составных частей этой работы является выбор способа представления информации, нужной для вычис- вычислений. Здесь переплетаются вопросы различного типа: прежде всего, вопрос о том, какие именно данные будут нужны для вычислений, решается неоднозначно — может оказаться удобным, кроме минимально необходимой информации, хранить некоторую вспомогательную инфор- информацию, очевидным образом восстанавливаемую по необ- необходимой информации, но удобную для пересчета и упро- упрощающую вычисления. Такой удобной дополнительной информацией был в предыдущем параграфе вектор psi в процедуре partitions._ Нужные для вычислений данные могут быть пред- представлены в различной форме — как целые числа, как вещественные числа, как специальные шкалы. Наконец, очень важным является вопрос о том, как расположить в памяти машины (эта память линейна —ее можно рас- рассматривать как последовательность ячеек, которую тре- требуется разделить между массивами информации) необ- необходимую информацию. Рассмотрим некоторые из возни- возникающих здесь проблем. Начнем с простейшего. Часто нам приходится иметь дело с векторами, в которых число ненулевых компонент значительно меньше размерности вектора. В таких слу- случаях становится очень невыгодным представлять этот вектор в виде обычного массива, а хочется выписать лишь нужные нам компоненты. Так, если в векторе х[1:/г] имеется k ненулевых компонент, то А'[1:п] можно задать с помощью вектора х\ [l:k] того же типа, что и х, и целочисленного вектора ind[l:k], указывающего на места ненулевых элементов.
§ 3. ПРЕДСТАВЛЕНИЕ ДАННЫХ 23 Часто k заранее неизвестно. В этом случае прихо- приходится резервировать для ind и для xl массивы доста- достаточного размера (какой размер считается достаточным, зависит разумеется, от конкретных условий): Легко перейти от сокращенной записи к полной: for /: = 1 step I until n do x[i]: = 0; for i: = 1 step 1 until k do x[ind [/]]: = xl [i]\ и от полной записи к сокращенной: &: ; for г: = 1 step I until n do if x[i]=?0 then begin k:=k+\; ind[k]: = i; xl[k]:=x[i] end Нетрудно записать и вычисление скалярного произ- произведения для таких «дырявых» векторов, первый из кото- которых задан векторами х\ и indl и имеет kl ненулевых компонент, а второй —соответственно х2, indl, k2, seal: = 0; for i:.= 1 step 1 until kl do for /: = 1 step 1 until k2 do if indl [i] = ind2 [/] then seal: = seal-{-xl [i]xx2[j] В случае, если компоненты векторов indl и ind2 расположены в порядке возрастания, можно обойтись одним просмотром каждого из векторов: scal: = 0; /:=0; for i: = 1 step 1 until kt do begin for /: = / +1 while j=s^k2 do if ind2[j]^sindl[i] then begin if ind2[j\ = indl[i] then seal: = seal -f xl [i] x x2 [j] else /: = / — 1; go to mkf end; mkf: end Аналогично можно записать и сложение двух векто- векторов. Здесь, однако, приходится вести последовательную
24 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ запись всех ненулевых элементов, которые могут быть трех типов — суммы ненулевых компонент слагаемых (причем только ненулевые- суммы) и ненулевые компо- компоненты из первого или второго вектора, не имеющие «пары» из другого вектора. Слагаемые задаются, как раньше, а результат задан числом компонент k3 и мас- массивами хЗ и ind3: /:=0; &3:=0; for «: = 1 step I until k\ do begin y. — xl\i]; for /: = / + 1 while j ==: k2 do if ind2 [71 = indl [i] then begin у: = у -f x2 [/]; if y = {) then go to mkf else go to mkr end else if ind2\j]<indl\i] then begin ?3: = fe3+l; *3 [kS]: = x2 [/]; ind3[k3]: = ind2\j\ end else begin /: = /'— 1; go to m&r end /; fc3: = ?3 l 3[^3] d3[fe3] end i Обратите внимание на механизм накопления инфор- информации о новом векторе. Такой принцип пополнения — приписывать в конец —встречался нам и раньше, при заполнении справочника индексов разбиения. Его можно расширить, добавив возможность чтения информации с конца с забыванием прочитанной информации. В этом случае говорят о магазинном или стековом хранении информации. Рассмотрим в качестве примера использования мага- магазина уже встречавшуюся нам задачу перебора всех под- подмножеств множества \:п. Теперь будем задавать подмно- подмножество списком его элементов, упорядоченным в порядке возрастания номеров. При переходе к следующему под- подмножеству будем пытаться прежде всего увеличить спи- список. Если.это не будет получаться, то сократим список на один элемент и увеличим на единицу последний эле- элемент получившегося списка. Процедура uselist имеет тот же смысл, что и проце- процедура use, но использует не характеристический вектор, а список элементов множества:
§ 3. ПРЕДСТАВТЕНИЕ ДАННЫХ 25 procedure subsetstack («, uselist); value п; integer п; procedure uselist; begin integer k; integer array list [1:«]; ft:=0; mk: uselist (k, list); If Л = 0 then k:=*list[l]: = l else if list [k] < n then begin k: = k + \; list[k\. = list[k- 1]+ 1 end else begin k:=k — \; if Jfe>0 then /tstf[A]: else go to m&/ end; go to mk; mkf: end sss Здесь k — количество элементов в списке, вначале k = 0 и массив /ts/ фактически не используется. Техника работы с магазинами будет для нас особенно полезна в главе 5. Часто приходится иметь дело и с редко заполнен- заполненными матрицами. Есть много способов задания таких матриц. Один из способов заключается л том, чтобы для каждого ненулевого элемента матрицы хранить два индекса — номер строки и номер столбца. Таким обра- образом, мы получаем три массива, задающих матрицу array al[l:&]; integer array row, col[l:k] Чаще, однако, используется другой способ — массивы а\ и row вводятся так, как было сказано, а вместо того чтобы хранить массив индексов столбцов, упорядочивают информацию так, чтобы элементы шли в порядке неубы- неубывания номеров столбцов и вводят отдельный вектор Ш[\:п] разметки вектора al[l:&]. Здесь lst[j] — номер последнего элемента, относящегося к столбцу /. Заме- Заметим, что работа с этим массивом оказывается более ' удобной, если добавить к нему еще один элемент 1st [0] = 0. Например, матрица 5 2 0 0 0 0 2 0 10 2 10 0 3 0 6 0 0 6 0 0 0 4 0 7 3 9
26 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ будет представлена следующим образом: al: 532164 2 176329 row: 131234 2 243414 1st: 0 2 4 6 7 9 И 13 Читателю рекомендуется в качестве упражнения разо- разобраться в следующих двух процедурах, реализующих умножение матрицы на вектор соответственно слева и справа с записью результата в виде полного вектора: procedure a times х(х, ind, k, a, row, 1st, kl, m, у); value k, kl, m; integer k, kl, m; array x, a, y; integer array ind, row, 1st; begin integer i, j; real xl; for i: = \ step 1 until m do y[i]: = 0; for /: = 1 step 1 until k do begin *1 : = *[/]; for i: = lst[ind[j]—\]+\ step 1 until lst\ind[j]\ do y[row[i]]: = y[row[i]] + x\ xa[i] end end; procedure x times a{x, ind, k, a, row, 1st, kl, m, n, y); value It, kl, m, n; integer k, kl, m, n; array x, a, y; integer array ind, row, 1st; begin integer i, il, /; real xl; /l:=0; for /': = 1 step 1 until n do begin xl: = 0; for i: = 1 step 1 until k do begin for il: — il-\-l while il^tst[j] do if row[il]~Sz ind[j] then begin if row[il] = ind[i] then x\: = x\-\-x[i]xa[i) else iI: = il — 1; go to mkf end; mkf: end; y[j]: = xl end end Во многих алгоритмах, о которых пойдет речь ниже, оказывается удобной именно запись матрицы по столб- столбцам. Разумеется, в тех случаях, когда эта форма пред- представления неудобна, следует предпочесть что-либо другое.
§ 3. ПРЕДСТАВЛЕНИЕ ДАННЫХ 27 В действиях над такими объектами, как редко запол- заполненные матрицы и векторы в рамках алгола-60 заметно некоторое неудобство, проистекающее из неопределенной заранее величины массивов. Другая трудность, более существенная и совсем плохо преодолимая в рамках алгола-60, — это трудность задания множественной инфор- информации. Часто элементы редко заполненной матрицы соответ- соответствуют некоторым реальным объектам, и имеется не одна, а целый набор матриц различных типов, в каждой из которых требуется задавать коэффициенты, стоящие на одних и тех же местах. В алголе-60 мы можем сопоста- сопоставить каждой такой матрице а вектор а\ так, как это мы только что делали, а вектор row имеет один и тот же для всех матриц. В этом отношении «коллективное» задание «дырявых» матриц выглядит даже проще, однако следует иметь в виду, что здесь речь идет о простейшей форме множественной информации. Серьезные проблемы возникают в том случае, если эти разнородные массивы должны храниться во внешней памяти, из которой вся информация, относящаяся к дан- данному объекту, должна поступать одновременно. В этом случае было бы удобно иметь нечто вроде картотеки, в которой для каждого объекта определенного типа заве- заведена соответствующая «карточка», в которой хранятся все необходимые параметры. Во многих современных алгоритмических языках имеются возможностих) для такого представления информации. В частности, есть такие возможности и в языке алгол-68, к которому мы и будем прибегать для описания алгоритмов с «картотеч- «картотечным» хранением информации. В алголе-68 мы можем описать вещественный вектор 2, в котором хранятся лишь' ненулевые компоненты, сле- следующим образом. Вначале мы введем новый вид данных— структуру «пара», составленную из индекса и значения ') Впервые такие возможности появились в коболе, затем в языке симула, предназначенном для машинного моделирования функциони- функционирования сложных систем. Из более современных языков следует на- назвать ПЛ/1, паскаль. »2) В алголе-68 в сравнении с алголом-60 приняты сокращенные варианты написания служебных слов: int вместо integer, boo] вместо boolean и т. д.
28 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ коэффициента, mode pair — struct (int ind, real a) а затем опишем массив, составленный из таких пар, [1 :kl\ pair xl; [1 : Щ pair х2 и т. п. Каждый такой массив заменяет два соответствующих массива в алголе-60, причем информация об г'-м элементе (индекс и значение) расположена в нем вся вместе. Вме- Вместо indl [i] мы должны теперь писать ind of xl [i] и a of x\ [i] вместо х\ [г]. Повторим на алголе-68 описанные выше алгоритмы скалярного произведения и сложения векторов. Сначала сделаем «буквальный перевод» с алгола-60 алгоритма скалярного произведения: seal: = 0; у: = 1; for i to kl do while j^k2 do if ind of x2[j]^sind of xl [i] then if ind of x2 [/] — ind of xl [i] then seal-\-: = а of x2[j]xa of xl [i] else / — : = 1 fi else go to mkf fi; /-j-: = l od; mkf: skip od С нашей стороны было бы слишком смело пытаться мимоходом заменить учебник по алголу-68. Пояснения, которые мы здесь дадим, следует рассматривать лишь как комментарий к написанному тексту. Оператор с-г : = d эквивалентен оператору с : ~c-\-d, и аналогично трактуется с— :—d. Оператор skip —это в данном кон- контексте пустой оператор. Читателю, привыкшему к алголу- 60, сразу заметно отсутствие операторных скобок begin и end. В этом языке в качестве открывающих оператор- операторных скобок фигурируют сами do и if, закрывающими скобками для них являются соответственно od и fi. Оператор цикла в алголе-68 имеет полную форму for k from a by b to с while d do
§ 3. ПРЕДСТАВЛЕНИЕ ДАННЫХ 29 Тривиальные части этой формулы (byI, while true, tooo, froml и даже for k, если k не используется в теле цикла) могут быть опущены. Так же, как в алголе-60, мы могли бы описать вычис- вычисление скалярного произведения в виде процедуры. Про- Процедуры в алголе-68 оформляются несколько иначе; эти отли- отличия мы еще будем обсуждать ниже. Здесь мы предпочтем использовать другую возможность языка — описание опе- операции. Мы введем скалярное произведение как операцию над векторами (массивами пар) scpr *) и будем использо- использовать ее в записях типа х\ scpr х2. Итак, op scpr = (ref [] pair xl, х2) real: begin int k\ :=upb xl, ?2: = upb x2, I: = 1; real seal: = .0; for i to k\ do while j^k2 do if ind of x2[j]^ind of x\\i\ then if ind of x2[j) = ind of x\[i\ then scal-{-: = a of x2[j]xa of xl [i\ else /-: = 1 fi; else go to mkf fi; / + : = 1 od; mkf: skip od; seal end Несколько новинок языка: при описании переменных можно присваивать-им начальные значения. Описывать пере- переменную цикла нельзя (точнее, бесполезно), upbx —верх- —верхняя граница массива х, seal перед end — то вещественное значение, которое вырабатывается операцией. Вид вырабатываемого операцией значения ставится перед телом операции и отделяется двоеточием, а перед указанием вида в скобках ставятся параметры операции— в нашем случае два массива. Что значит в этих пара- параметрах ref, мы обсудим несколько ниже. Теперь уже в виде операции опишем сложение двух векторов. Знаком операции будет -\- (мы доопределяем операцию сложения для нового тина объектов): scpr при этом становится знаком операции.
30 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ ор+ = (ref [] pair xl, х2) ref [] pair: begin int /:=1, &3: = 0, &l: = upb xl, k2: = upb x2; real y; [\\k\-\-k2\ pair x3; for i to ?1 do while /=sS?2 do if 2/id of x2 [/] = md of xl [г] then г/:=а of xl[/]-fa of x2 [/]; if уфО then x3[>3+: = lj: = (md of xl [;'], y); go to m&/ fi elif ind of x2[j]<ind of xl |7] then x[ else jt3[*3 + : = l]:=*l[tj; /-: = go to m&/ fi; / + : = ! od; mfe/: skip od; heap [1 : k3] pair : = x3[l:k3] end Здесь нам встретилось elif —слово, которое заменяет сочетание else if, причем не открывает лишней скобки условия. Кроме того, впервые появилось увеличение индекса в левой части оператора присваивания, присва- присваивание для структур (хЗ [k3\: = xl [i] либо хЗ [k3]: = (г, а)) и для массивов. Однако самая существенная новинка — генерирование новых объектов из «кучи». В алголе-60 вся память, требуемая в программе, определяется описа- описаниями и в границах данного блока не зависит от хода вычислений в этом блоке. Часто трансляторы распреде- распределяют память по магазинному принципу — каждый сле- следующий блок получает память, начиная со свободного места и освобождает ее по окончании. В алголе-68 можно увеличить память, заказывая ее в ходе вычислений, при- причем наряду с «магазинной памятью» используется еще один механизм распределения памяти— «куча», из которой память заказывается с помощью heap (дополнительная память из магазина заказывается с помощью 1ос, п ри выходе из блока эта память теряется). Для того чтобы работать с появляющимися новыми объектами, нужно иметь возможность к ним обращаться. В алголе-60 мы сопоставляем каждому объекту имя — иден- идентификатор. Объекты, появляющиеся в ходе вычислений, снабдить идентификаторами мы уже не сможем. Однако существует другая возможность — ввести такие имена,
§ 3. ПРЕДСТАВЛЕНИЕ ДАННЫХ 31 которые сами рассматривались бы как одна из разновид- разновидностей вычислительной информации и записывались бы в предназначенные для этого места памяти. В алголе-68 и во многих других современных языках программиро- программирования имеется возможность вводить новые виды пере- переменных (и, следовательно, полей в записях) — ссылки, указывающие на конкретные объекты того или иного видах)-. Понятие ссылки очень важно, и на нем . нам следует остановиться. Естественность этого понятия для языков програм- программирования определяется особенностями устройства вычис- вычислительных машин и организации работы машинных прог- программ. Почти каждая элементарная машинная операция— команда имеет в качестве аргументов (операндов) именно ссылки — адреса реальных объектов вычисления. Напри- Например, команда сложения в трехадресной машине выгля- выглядит так: Сл А В С (сложить числа, записанные в поля памяти с адресами А и В, и поместить результат в поле с адресом С.) Вме- Вместе с тем в некоторых случаях операнды указываются в команде непосредственно. Скажем, имеется команда сдвига содержимого ячейки (слова), в которой величина сдвига k указывается непосредственно первым аргумен- аргументом. Например, СдСЛ 7 А В сдвигает содержимое ячейки с адресом А на 7 разрядов влево и помещает результат в ячейку с адресом В. В алголе-60 мы оперируем фактически только со ссыл- ссылками на объекты, которые в тексте программы задаются идентификаторами или непосредственно заданными вели- величинами, а в машинной программе ссылки заменяются адресами. Оператор с\=а-{-Ь эквивалентен машинной команде сложения и будет переведен транслятором в такую команду. Однако есть некоторая разница между этим 1) Используемое при описании ссылок ref (от английского refer- reference— ссылка) в книгах по алголу-68 обычно переводится как имя. Однако в других языках распространен термин «ссылка», и нам .он представляется более отвечающим существу дела.
32 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ оператором и оператором с: = а + 5. В обоих случаях есть места в памяти, отведенные для каждого из слагае- слагаемых. Но в первом случае мы располагаем полем, отве- отведенным под Ь, и можем записать туда то, что требуется. Во втором случае записать что-либо иное в поле, где стоит 5, языком не разрешается. Таким образом, в алголе-60 мы располагаем лишь ссылками на введенные объекты, их и подразумевая под переменными. В алголе-68 при описании переменных мы также порож- порождаем ссылки и работаем со ссылками. Однако этот язык позволяет при описании алгоритма точнее приблизиться к понятиям машинной программы, но требует более отчетли- отчетливой системы представлений и описаний. Здесь можно предусмотреть действия, требующие не адресов, а непос- непосредственно величин (как в команде сдвига). Поэтому при описании операций и процедур требуется задавать аргу- аргументы с точным указанием вида и, следовательно, доба- добавить к описаниям тех объектов, которые мы задаем их адресами, «лишний» ref. Таким образом, если мы захотим описать действия, выполняемые двумя упомянутыми машинными командами, в виде операций, то заголовок операции сложения должен выглядеть так: ор-|- = (ref real a, b) ref real: ... а операции сдвига влево так: op lshift = (ref int a, int k) ref int: ... Если в программе введен (для примера) вид object, то переменная такого вида имеет вид ref object, но описать ее можно так: object а, и мы будем говорить в таких случаях, что а —переменная вида object. Возможность описания объектов вида ref object, ref ref object и т. д. появляется одновременно с возможностью описания объ- объектов вида object, и можно вводить ссылки как пере- переменные вида ref object. Для всех видов определено осо- особое значение ссылок nil —ссылка ни на что. Имеются две операции сравнения ссылок одного вида, вырабаты вающие логические значения: a is Ь — ссылки совпадают и a isnt b — они не совпадают. Время от времени мы будем пользоваться еще одной операцией, вырабатывающей
§ 3. ПРЕДСТАВЛЕНИЕ ДАННЫХ 33 логическое значение «а на что-то ссылается» op Iin = (reT object a) bool: a isnt nil Не описывая эту операцию, в дальнейшем мы будем в случае надобности лишь указывать вид ссылок, для которых она будет определена. Отсылая читателя за дальнейшими подробностями к руководствам по алголу-68, мы будем считать, что высокие требования этого языка к точности в описаниях обойдутся нам главным образом в лишние ref при описа- описаниях процедур и операций, и лишь в случае необходи- необходимости будем комментировать особо такие места встреча- встречающихся алгоритмов. Однако есть еще одно трудное место, о котором следует сказать сразу. Рассмотрим простейший оператор присваивания а: — Ь, где а — переменная вида object или ref object, a b — вели- величина или переменная вида object или ref object. В отли- отличие от алгола-60, здесь наиболее естественной формой оператора присваивания считается такая, в которой в левой части стоит переменная какого-то вида, а в пра- правой—величина того же вида. Переменная указывает па какой-то объект, и в этот объект и будет скопировано значение величины из правой части. Если а — перемен- переменная вида object, а Ъ — величина вида object, то скопи- руется object. Если а —переменная вида ref object, a Ъ — переменная вида object (и, значит, величина вида ref object), скопируется величина вида ref object. При несоответствии уровней ссылок в левой и правой частях автоматически производится их согласование (снятие лиш- лишних ref в правой части) до «естественного» сочетания уровней. Так, если а и b — переменные виды object, в поле, адресуемое ссылкой о, запишется содержимое объекта, адресуемого ссылкой Ь. Если а и Ь — перемен- переменные вида ref object, действие пересылки будет произве- произведено над ссылками, и после его выполнения содержимое а будет ссылаться на тот же объект вида object, что и Ь. Наконец, если а —переменная object, a b — перемен- переменная ref object, то b указывает на поле, в которое записана ссылка на некоторый объект вида object, который и ста- станет значением правой части оператора присваивания. В некоторых случаях, когда автоматическое согласова- согласование уровней дает не тот результат, который требуется^ 2 И. В. Романоиский
34 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ приходится вмешиваться в этот процесс (называемый «разыменованием»). Вот пример такого вмешательства. Пусть мы имеем две переменные вида ref object и хотим переписать в объект object, на который указывает а, содержимое объекта object, на который указывает Ь. Для этого достаточно указать вид требуемого объекта в левой части оператора присваивания, причем подобно парамет- параметрам в процедурах здесь требуется точное указание вида нужного нам объекта, и значит, появляется «лишний» ref. В нашем случае оператор присваивания выглядит так: ref object (a) : = b Попробуем теперь, используя технику ссылок, пред- представить вектор в виде набора элементов, каждый из кото- которых ссылается на следующий. Исключение будет состав- составлять последний элемент вектора, у которого эта ссылка будет не заполнена. Итак, каждой ненулевой компоненте вектора будет сопоставляться элемент вида mode elem = struct (ref elem next, int ind, real a) С помощью ссылки next элемент будет указывать на сле- следующую ненулевую компоненту вектора. Сам вектор может теперь задаваться ссылкой на начальный элемент. Опишем для таких векторов операцию сложения: ор+ = (ref ref elem x\, x2) ref elem: begin ref elem i:=x\, /: = л2, k: = loc elem : = (nil, skip, skip), while lin i do while lin / do if ind of / = ind of i then у : = a of i -f- a of /; if у Ф 0 then /: = next of /: = heap elem : = (nil, ind of i, y); j ; = next of /; go to mkf f i el if ind of j<ind of i then /: = next of /: = heap elem : = i else /: — next of /: = heap elem : = /; go to mkf fi; /: = next of / od; mkf : i: — next of i od; next of /: = nil; next of k e.id
§ 4. СПИСКИ 35 Мы ввели начальный элемент, на который ссылаются k и / для удобства, skip в двух полях этого элемента означает, что значения полей не определяются, 1ос озна- означает, что элемент вводится локально — только в самой операции, a of i — это поле а в той структуре, на кото- которую ссылается i. Построение наборов элементов одной и той же или различной структуры, связанных между собой ссылками,— вычислительный прием, имеющий много полезных при- применений. Некоторые стандартные действия и понятия, связанные с построением и переработкой линейных пос- последовательностей (списков), описаны в следующем параг- параграфе. § 4. Списки Пусть задано некоторое множество N, каждому эле- элементу которого сопоставлен набор целочисленных, вещест- вещественных, логических и текстовых (а возможно, и ссылоч- ссылочных) параметров. По этим параметрам мы можем сравни- сравни\ПаВвл I \ИВан 11 Анна \\ Петр <JО Рис. 2. Физическая очередь. \ПаВел\ J Анна \ хашв\ \ \Шан~1 Очередь f f A3 Z ГЗ * 3 52 3 4 Bf Рис. 3. Именная очередь. вать эти элементы и вводить для них упорядочение, т. е. можем для любых двух элементов /, / е N сказать, какой из них должен предшествовать другому. Имеется несколько способов фиксации этого упоря- упорядочения в вычислительной машине. Зти способы, впрочем, 2*
зь ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ давно знакомы нам по обыденной жизни, где такие упорядочения встречаются в виде очередей. Самый простой и естественный способ построения упорядочения— это способ физической очереди: объекты, составляющие очередь, выстраиваются в порядке, соот- соответствующем упорядочению, и элемент i предшествует элементу / в том и только в том случае, если он в оче- очереди стоит раньше (рис. 2). Однако в случае, если объекты уже расположены Э памяти, занимают там достаточно много места, а упо- упорядочение достаточно часто может изменяться, выстраи- выстраивать их в физическую очередь представляется столь же неестественным, как делать физическую очередь из домов, отобранных для капитального ремонта. Выход заклю- заключается в том, чтобы сделать физическую очередь из ссылок на эти объекты — перечислить ссылки на объекты в порядке, соответствующем упорядочению (рис. 3),— назовем это способом именной очереди. Павел гз * Анна В/ Петр ИВан Б2 Рис. 4. Односторонние локальные ссыл- ссылки назад. Начало очереди А2. ПаВел ГЗ Анна гз Wf Петр Б2 X ИВан Рис. 5. Двусторонние локальные ссыл- ссылки. Начало очереди А2, конец В1. Этот метод очень прост и достаточно удобен в вычис- вычислениях, особенно в тех случаях, когда упорядочение достаточно стабильно, новых объектов не возникает,
§4. СПИСКИ 37 имеющиеся объекты из очереди пе выбывают. Однако для мобильной очереди более удобной оказывается третья форма организации очереди — способ локальных ссылок, в котором каждый из объектов очереди с помощью ссы- ссылок запоминает, за кем он стоит, перед кем он стоит или и то и другое вместе (рис. 4 и 5). В подавляющем большинстве случаев достаточно при организации очереди иметь односторонние ссылки (напри- (например, только назад, на следующего^ такой была ссылка next в последнем варианте операции сложения векторов), однако бывают случаи, когда требуется перемещаться по очереди и вперед и назад, и в этом случае лучше иметь по две ссылки у каждого объекта. Список с односторонними ссылками задается ссылкой на его начало, список с двусторонними ссылками— двумя ссылками: на начало и на конец или на любой из них (в зависимости от условий). Рассмотрим несколько про- простейших действий над списками. Так как речь идет о ссылках, нам естественно прибегнуть к алголу-68. В описаниях этих действий в качестве элементов списков будут использоваться для примера структуры вида mode elem = struct (ref elem next, pre, real a, b, int i) состоящие для определенности из двух вещественных чи- чисел, одного целого и двух ссылок на такие же струк- структуры. Самыми простыми являются операции магазинного списка — включение элемента в магазин и исключение элемента из непустого магазина: op cons = (ref ref elem a, ref elem b) ref ref elem: begin next of b:=a; a: = b end; op head = (ref ref elem a) ref elem: begin ref elem b: = a; a: = next of a; b end Использование этих операций выглядит так: a cons b для присоединения b в качестве первого элемента к списку и b:=head а для отделения первого элемента списка. При переносе элемента из одного списка в другой тре- требуется последовательное применение этих двух операций, соответствующая объединяющая их операция может быть записана так: op rob = (ref ref elem a, b) ref ref elem: a cons head b
38 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ Примером использования списков и введенных опера- операций может служить решение следующей простой задачи. Задано множество N =1 : п, каждому элементу i которого сопоставлены два числа — оценка c[i] и поло- положительный вес d[i). Требуется найти такой элемент ДО и такое разбиение N — Ю на два подмножества N\ и Nit чтобы выполнялись неравенства где oil, w2 — заданные положительные числа и wl+w2^l[N]xd[N]. Эта задача (она' снова встретится нам в главе 5) ре- решается очень просто, если элементы упорядочены по убы- убыванию оценок. Тогда, двигаясь от г = 1, мы сможем набрать нужное число элементов в Nx, ближайший «не помещающийся» элемент будет ДО, а остальные эле- элементы войдут в N2- Однако упорядочение иногда дорого в вычислительном отношении, и' мы здесь обойдемся без него. Выберем какой-либо элемент V и испробуем его в ка- качестве ДО. Для этого будем просматривать элементы N и относить в N[ те элементы, для которых с[г]>с[Г], а в N't те, для которых c[i]<.c[i'] (будем для простоты считать все c[i] различными). Попутно мы будем накап- накапливать суммы весов si и s2 и сравнивать их с грани- границами w\ и ш2. Если мы благополучно доберемся до конца, N[ и M'i и будут искомыми iVx и N2. Если же увеличи- увеличиваемый вес, для определенности si, превзойдет свою гра- границу w\, это будет значить, что г' —слишком низкий разграничитель и следует попытаться взять элемент с большим c[i]. Однако сам элемент V и накопленное множество N'i уже бесспорно должны окончательне войти в N2, так как кандидатов в Nx достаточно и без них. Вот основная идея нашего алгоритма, а дальнейшие де- детали будут видны из описания. Мы опишем структурный вид mode el = struct (ref el next, int c, d) где next будет использовано для цепных списков, ас, d — введенные выше параметры элемента, затем введем муль-
§ 4. СПИСКИ 39 тизначение (массив) [l:n] el el и сделаем начальное присваивание for i to n do <?/[*¦]: = (if i = n then nil else el[i + l] fi, c[i], d[i]) od Дальше алгоритм описывается прямо на алголе-68 с пояс- поясняющими комментариями, которые, как полагается, заклю- заключаются в одинаковые скобки со (это тоже сокращение). Введем ссылки на некоторые элементы: ref el bou со это наш граничный элемент V со, сиг со текущий элемент списка со, fp: = el[l] со начало списка нерассмотренных элемен- элементов со, b\, el со начало и конец списка, описывающего N[ со, Ь2, е2 со аналогично для Л^ со, г 1: = nil, л2: = nil со начала списков для элементов, окончательно включенных в множества. Кроме ссылок, нам понадобятся и некоторые целые числа со; int si, s2 со о них уже говорилось со, cb, db со параметры элемента bou со, се, dc со параметры элемента сиг со, wrl: = 0, wr2:—0 со накопленные веса окончательно включенных элементов со, cr\: =maxin(, cr2: — — maxint со границы оценок окон- окончательно включаемых элементов со; mk: со отсюда начинается попытка построить два списка. Выделяем граничный элемент со ?ou: = head fp; cb: = с of bou; db\ = d of bou; со —готовим начальную информацию о рабочих спи- списках со while lin fp do cur: = head fp; cc:=c of cur, dc: = d of cur; со выделили из списка очередной элемент сиг, сейчас будет решаться его судьба, и это решение начнется срав- сравнением сиг с bou со if cc>cb then if (si + : = dc)>w\ then
40 гл_ , ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ со переполнилось N'u нужно пробовать заново, но сна- сначала увеличим окончательную часть N2 со r2 cons bow, if I in 62 then next of e2: = r2\ r2: = b2 fi; cr2:=cb; dr2: = db + s2; со элементы N't отправим обратно в нерассмотренные элементы со if Hn b\ then next of el:=//r, fp: = 61 cons cur fi; go to mk eiif cc^crl then со случай бесспорной кандидатуры из Л^ со dr\ + : = dc; r\ cons cur eiif lin 61 then 61 cons cur else со случай пустого списка требует особого рассмотре- рассмотрения со b\: = e\:*=cur\ next of cur: = nil fi eiif со симметрично разбирается вторая возможность со (s2 -f- : = dc) > до2 then rl cons 6o«; if lin 61 then лея/ of el: = rl; rl:=bl fi; cr\:=cb\ dr\: = db-\-s\; if lin 62 then nex^ of e2:=/p; /р:=62 cons curfi; go to m? eiif cc<Lcr2 со естественное изменение знака неравенства со then dr2 -\-: = dc; r2 cons cur eiif lin 62 then 62 cons cur else b2: = e2: —cur; next of c«/-: = nil fi Кроме «магазинных» операций, иногда используются операции включения в конец списка и в подходящее место списка, выбираемое в соответствии с некоторым упорядочением элементов. Присоединение элемента к концу списка пишется так: op join = (ref ref elem a, ref elem b) ref ref elem: a: = next of a: = 6
4. СПИСКИ 41 (в ссылочное поле элемента а заносится ссылка на Ь, а затем а начинает адресовать этот элемент). Полезно еще действие присоединения элемента к концу списка с проверкой его непустоты. Такое действие оформляется в виде процедуры. В приводимой процедуре а — ссылка на начало списка, Ь — на конец, с—присоединяемый эле- элемент: proc join = (ref ref elem a, b, ref elem c) ref ref elem: if Sin a then b join с else b:=a:—c fi Пусть теперь имеется операция сравнения объектов: а ргес b эквивалентно «а предшествует Ь». Рассмотрим процедуру включения элемента b в соответствии с упоря- упорядочением ргес в непустой упорядоченный список, начи- начинающийся с а. Последовательность действий в такой про- процедуре ясна, — нужно найти в списке место, на которое требуется поставить новый элемент, т. е. такой элемент с, что с ргес b Д b prec next of с (с предшествует bub предшествует элементу, следую- следующему за с) и вставить новый элемент на это место, т. е. сделать в нем ссылку на следующий элемент такую, как I Иван ~[7 | \Анна Анна Петр Иван Фона Анна Петр] а) Фома и) Фома АннА Рис. 6. Включение в очередь нового элемента. у с, а в next of с вписать ссылку на b (рис. 6). Движе- Движение по списку осуществляется очень просто с помощью одной из уже встречавшихся нам разновидностей опера- оператора цикла. Мы опишем это действие в виде процедуры (здесь про- процедура называется ргос). Описание процедуры похоже на описание операции — в скобках указаны параметры про- процедуры, а после скобок —вид вырабатываемого процеду-
42 ГЛ. 1. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ рой значения. Наша процедура вырабатывает никакой вид. Операция Нп описана для вида ref elem: proc inclel = (ref ref elem a, ref elem b) void: begin ref elem c, d; c: = a; if b prec a then a cons b else while Hn (d: = next of c) do if d prec b then c: = d else go to mkf fi od: mkf: next of b: — d; next of c: = fe fi end Если b предшествует а и, следовательно, должно быть помещено в начале списка, то мы пользуемся магазинной операцией. В противном случае отыскивается место для Ь (между с и d) и после выхода на метку mkf запись фикси- фиксируется на своем месте двумя ссылками. Для списка с двусторонними ссылками важной эле- элементарной операцией является исключение элемента из списка. Грубо говоря, нужно заставить соседей этого элемента ссылаться друг на друга: next of pre of a: = next of a; pre of next of a: = pre of a Некоторые усложнения связаны с эффектами края списка: proc exclel = (rd elem a) void: begin ref elem b:—pre of a, c: — next of a; if lin b then next of b:=c; if lin с then pre of c: = b fi else pre of c: = nil fi end Включение элемента в список естественно требует для двусторонних ссылок больших усилий: нужно изменить две ссылки в месте вставки и заново образовать две ссылки у вставляемого элемента. В остальном процедура не изменяется: proc inclel2 — (rei ref elem a, b) void: begin ref elem c, d\ c: = a; if b prec a then pre of a: = b; a cons b else while lin (d: = next of c) do if d prec b then c: — d else go to mkf fi od; mkf: next of b: = d\ pre of b: = c; пел:/ of c: = pre of d; = b fi end
§ 4. СПИСКИ 43 Включение одного упорядоченного списка в другой может проводиться с использованием описанных проце- процедур. При этом можно иметь в виду, что элемент Ь, вклю- включенный в список, уже указывает на начало оставшейся части списка, в которую должны включаться следующие за ним элементы. Поэтому соответствующая процедура выглядит очень просто: proc inclist = (ref ref elem a, b) ref ref elemt begin ref elem c: = a, d: — b; while lin d do ref elem e: — next of d; inclel (c, d); c:=d; d: = e od; if a prec b then a else b end (в случае двусторонних ссылок нужно, разумеется, заме- заменить inclel на inclel2). Для односторонних списков полезной оказывается опе- операция обращения списка — бывает, что изредка требуется перебрать элементы списка в противоположном порядке, но при этом такая потребность возникает не настолько часто, чтобы заводить специально для нее двусторонние ссылки. Соответствующая процедура выглядит так: proc listinvert — (ref ref elem a) ref ref elem: begin ref elem c:—a, d: — m\\ while lin с do d rob с od; d со начало нового списка со end Понятие списка, рассматриваемого как конечная по- последовательность элементов некоторого множества (кор- (кортеж), возникает в различных областях математики (в ма- математической лингвистике, теории статистических реше- решений, динамическом программировании, о котором у нас еще пойдет речь) в качестве основного изучаемого объекта. Для дальнейшего окажутся полезными еще несколько понятий, связанных с действиями над списками и функ- функциями от списков. Прежде всего отметим, что если отделить от непустого списка его первый элемент {голову), то оставшаяся часть списка (хвост списка) в свою очередь будет списком.
44 ГЛ. I. ПОДГОТОВИТЕЛЬНЫЕ СВЕДЕНИЯ Пусть ф (/) — функция, заданная на множестве списков, элементы которых принадлежат множеству А. Обозначим множество таких списков через List (Л). Обозначим через head (I) начальный элемент списка /, а через tail (/) хвост списка. Назовем функцию ф(/) аддитивной, если найдется такая функция а (а) на А, что для любого непустого / е List (А) имеет место Ф (/) = a (head (/)) + q> (tail (/)). D) Функция ф (/) называется мультипликативной, если найдется такая функция р1 (а) на Л, что для любого не- непустого /е List (А) имеет место Ф (/) = Р (head (/)) х ф (tail (/)). E) Наконец, функция ф (/) называется рекуррентной, если найдутся такие функции а (а) и р (а) на А, что для лю- любого непустого / е List (А) имеет место Ф (/) = a (head (/)) + р (head (/)) х Ф (tail (/)). F) Хороший пример рекуррентной функции — значение целого числа,, представленного в обычной позиционной записи. Если принять в качестве А множество 0:9 (точ- (точнее множество десятичных цифр), считать начальным эле- элементом позиционной записи числа последнюю цифру, а хвостом списка оставшийся список, то значение ф (/) числа, представленного списком /, будет, очевидно, равно Ф (/) = head (/) + 10 х ф (tail (/)). Так, число 1975 представляется последовательностью цифр 5, 7, 9, 1. И мы имеем ФE, 7, 9, 1) = 54-10хфG, 9, 1), ФG, 9, 1) = 7+10хф(9, 1), Ф(9, 1) = 9+10хфA), ФA)=1-И0хф(о), где о —пустой список. Приняв ф(о) = 0, мы получаем ФE, 7, 9, 1) = 5 Важной операцией над списками является их упоря- упорядочение. Среди возможных методов упорядочения особое
§ 4. СПИСКИ 45 место занимает уже упоминавшееся лексикографическое упорядочение. Пусть на множестве А задано некоторое упорядочение. Будем говорить, что список Л лексикографи- лексикографически предшествует списку 12, если Л =о или /1, /2 #ои, либо head (Л) ф/iead A2) и head (Л) предшествует head A2), либо head (Л) — head A2) и список tail (Л) лексикогра- лексикографически предшествует списку tail A2I). Иными словами, /1 лексикографически предшествует /2 в том случае, если Л является началом 12, либо первые несовпадающие элементы этих списков стоят на /е-м месте и k-й элемент списка /1 предшествует k-му элементу списка 12. Название «лексикографическое упорядочение» происхо- происходит от известного всем упорядочения слов в словаре. Слово может рассматриваться как список из букв. На множестве букв (алфавите) задано упорядочение. Слово «чад» предшествует слову «чадра», так как является его началом, слова «чадра» предшествует слову «чардаш», так как первые две буквы у этих слов совпадают, а третья буква в слове «чадра» .предшествует третьей букве в «чар- «чардаш». Процедура subsetstack вырабатывает лексикографически упорядоченные списки элементов множества 1 : п. Вещественный или целочисленный вектор заданной размерности (с заданным упорядочением множества индек- индексов) может также рассматриваться как список фиксиро- фиксированного размера. Легко видеть, что для таких списков определение лексикографической упорядоченности совпа- совпадает с введенным ранее. Мы не будем в дальнейшем злоупотреблять алго- лом-68. Алгол-60 будет единственным языком программи- программирования в следующей главе и основным языком в осталь- остальных главах. Однако некоторые приемы программирова- программирования, встречавшиеся в этой главе, могут быть использо- использованы и будут использоваться и в текстах алгола-60. ') Возвращаясь к алголу-68, мы можем описать лексикографиче- лексикографическое предшествование цепных списков операцией lexprec по операции сравнения элементов ргес следующим образом: op lexprec = (ref ref elem a, b) bool: if I in a then if lin b then if a prec b then true el if b prec a then false else next of a lexprec next of b fi else false fi else true fi
ГЛАВА 2 НЕКОТОРЫЕ ОБЩИЕ СВЕДЕНИЯ О ЛИНЕЙНОМ ПРОГРАММИРОВАНИИ § 1. Введение В задачу этой книги не входит систематическое изло- изложение общей теории и методов решения задач линейного программирования. На эту тему написано уже много подробных руководств, в которых систематически изла- излагается вычислительный, геометрический и прикладной аспект моделей и методов линейного программирования. Нам все это нужно постольку, поскольку часть инте- интересующей нас проблематики может рассматриваться как некоторый специальный класс задач линейного програм- программирования. Для того чтобы облегчить ссылки на встре- встречающиеся нам факты из области линейного программи- программирования и иметь нужные формулировки в том виде, который для нас наиболее удобен, мы и предлагаем чи- читателю настоящую главу. В ней несколько нестандартен § 2, в котором рас- рассматривается вопрос о расширениях экстремальных задач и об эквивалентных задачах. Хотя в основном речь идет там о задачах линейного программирования, сами опре- определения и подход важны и полезны во всех задачах на экстремум. Теория двойственности изложена в § 3 наро- нарочито формально, и читателю, который заинтересуется геометрическими или экономическими трактовками этих красивых теорем, рекомендуется обратиться к библиогра- библиографическим указаниям к этой главе. Для дальнейшего изложения очень важны §§ 4—6. Метод последовательных улучшений допустимого базис- базисного решения, который в них излагается сначала в виде общей принципиальной схемы, а затем в виде нескольких вычислительных реализаций, будет широко использоваться в последующих главах. Однако нам представляется, что для читателя, интересующегося вычислительным аспектом линейного программирования, эти параграфы должны
§ 2. ПОСТАНОВКА ЗАДАЧИ 47 представить и самостоятельный интерес, так как только в очень немногих монографиях по линейному програм- программированию вопросы реализации методов линейного про- программирования на ЭВМ обсуждаются достаточно полно и современно. § 2. Постановка задачи линейного программирования Задачей линейного программирования называется за- задача нахождения максимума (или минимума) линейной функции от переменных, подчиненных линейным ограни- ограничениям. Традиционно выделяют условия неотрицатель- неотрицательности переменных, которые часто встречаются в задачах экономического характера и для соблюдения которых стандартные алгоритмы линейного программирования спе- специальным образом подготовлены. В конечном счете каждая задача линейного програм- программирования может быть приведена к следующему виду. Основная задача линейного программи- программирования ' Пусть заданы два конечных множества М и Л', векторы Ь [М] и c[N], матрица а[М, N]. Пусть заданы также разбиения M = M1-J-M2 и N = Ni-\-N2. Тре- Требуется найти вектор x[N], удовлетворяющий условиям xiNi^OlN,], A) a[Mlt N]xx[N]^b[Ml], B) а[М2, N]xx[N] = b[M^ C) и минимизирующий линейную функцию с [N] хх [N]. D) Случай, когда М = М2 и N = Мъ нас будет интересо- интересовать особо. Такая задача будет называться стандартной задачей линейного программирования. В различных ситуациях оказывается целесообразным менять формулировку экстремальной задачи, переходя к той или иной эквивалентной задаче или даже несколько меняя задачу по существу. Мы дадим формальное опре- определение эквивалентных задач и расширения задач, а затем
48 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ посмотрим, как эти определения могут быть использо- использованы в случае задач линейного программирования. Рассмотрим две экстремальные задачи. Задача А | Минимизировать / (л:) по х е А и Задача Б J Минимизировать g(y) по у ^. В. Все экстремальные задачи имеют стандартные особен-, ности: задается некоторое множество, среди элементов которого можно выбирать. Это множество называется множеством допустимых решений. Задается также функ- функция, минимум или максимум которой требуется найти. Эта функция называется целевой функцией задачи. Не представляет труда перейти от задачи минимизации к за- задаче максимизации— для этого достаточно изменить знак у целевой функции, поэтому мы ограничимся задачами минимизации. Допустимое решение, на котором достигается мини-" мум целевой функции, называется оптимальным решением задачи. Будем говорить, что функции <р (х) и г|) (л:) задают оди- одинаковое упорядочение па множестве А, если для любых х, уев А sign (ф (х) - ф (у)) = sign (ij; (x) -ЦШ- E) Легко видеть, что для целевых функций, задающих оди- одинаковое упорядочение, множества оптимальных решений совпадают. Будем говорить, что задача Б есть расширение за- задачи А, если существует отображение Т: А-*-В такое, что функции f (х) и g(Tx) задают одинаковое упорядо- упорядочение на множестве А. Задачи А и Б называются эквивалентными, если суще- существуют такие отображения Т: А-у В и 5: В-*-А, что f (х) и g(Tx) задают одинаковое упорядочение на A, g(y) и / (Sy) задают одинаковое упорядочение на В и / (STx) — = f(x).
§ 2. ПОСТАНОВКА ЗАДАЧИ 49 Отображения, с помощью которых устанавливаются эти связи между задачами, назовем связующими отобра- отображениями. Полезность введенных определений видна из следую- следующих простых утверждений. Теорема 1. Пусть задачи А и Б эквивалентны и Т: А->~В, S: В->А —связующие отображения. Если х* —оптимальное решение задачи А, то у* = Тх* —опти- —оптимальное решение задачи Б. Доказательство. Действительно, если бы в В существовало у, для которого g(y) <.g(y*), то для него мы имели бы ?(Sg)<F(Sy*)=f(STx*)=f(x*), что противоречит оптимальности х*. А1) Теорема 2. Пусть задача Б является расширением задачи А и Т: А -*¦ В — связующее отображение. Если х* — оптимальное решение задачи А, то min \g(y) • у е В} ^с ^g(Tx*). Если у* —оптимальное решение задачи Б и существует такой элемент х* е А, что Тх* = у*, то х* — оптимальное решение задачи А. Доказательство. Первая часть теоремы очевидна. Предположим, что выполнено условие второй части, но существует ie/I, f (x) <.} (х*). Тогда g (Тх) < g (Тх*), что противоречит оптимальности у*. А Приведем несколько преобразований, оставляющих эквивалентными задачи линейного программирования (свя- (связующие отображения при этом будут, как правило, три- тривиально простыми): 1. Линейное преобразование целевой функции с поло- положительным коэффициентом: 2. Умножение равенств на невырожденную матрицу. Если rank (г[М', М.2])= М.2\, то следующая задача экви- эквивалентна задаче A)—D): Найти вектор x[N], удовлетворяющий A), B) и ИМ', М2]ха\М2, N])xx[N] = r[M', M2]xb[M2] F) и минимизирующий D). •) Этот знак будет ставиться в конце доказательства.
50 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ 3. Замена целевой функции D) любой функцией вида (с[Щ + ЦМг]ха[М2, N])xx[N]. 4. Замена ограничения B) ограничением вида (а[Мъ N] + \i[Mlt M2]xa[M2, Щхх[Щ)^ ^b[M1] + [i[M1, M2]xb[M2]. 5. Введение новых переменных у[М*], М* cz Mi и замена ограничения B) ограничениями у[М*]^0[М*], G) а[М*, N]xx[N]-y[M*] = b[M*], (8) a[Ml\M*, N]xx[N]^b[Mt\M*]. (9) Переменные г/[УИ*] называются дополнительными, так как y[i] дополняет i-e неравенство до равенства. 6. Замена группы уравнений C), соответствующих множеству М* а М2, двумя группами неравенств а[М*, — а[М*. 7. Замена переменной x[j], j(=N2, разностью двух новых неотрицательных переменных x'[j] и x"[j]: x[j] = x'[j]-x"[jl A0) Связь новой задачи со старой в первых шести преоб- преобразованиях достаточно ясна. Покажем, как она устанав- устанавливается в последнем, седьмом преобразовании. Поло- Положим1) x'[j] — (x\j])+, x"[j] = (x [/])-. Для так определен- определенных х' [j], x"[j] выполнение A0) очевидно. Напротив, если задано допустимое решение измененной задачи x[N — j], x'[j], x"[j], то, полагая х[}] = х'[/]-х"[/], получим решение исходной задачи. В целевую функцию и в ограничения B) и C) для новой задачи входит только разность х' [j] — x"[j], поэтому справедливость этих огра- ограничений при таких заменах не нарушится. С помощью описанных эквивалентных преобразований любая основная задача линейного программирования J) Как обычно, (а)+ —положительная часть а, т. е. max {.0, а}, (а)"—отрицательная часть а, т. е. max {0, —а}.
§ 2. ПОСТАНОВКА ЗАДАЧИ 51 может быть приведена к стандартной. Для такого сведе- сведения нужно воспользоваться пятым и седьмым преобразо- преобразованиями. Именно, положим Nzl — N%x{l}, Af22 = jV2>^{2}, N = Nt U Л^! U N22 U Mi и зададим матрицу а[М, 7V] и вектор C[N], как показано на рис. 7. м, "t -E[Mt,Mf] 0 a[M,Nt] a[M,Nz1 -afff,/tg]  Рис. 7. Матрица стандартной задачи, построенной по общей, 0 c[N,] o[Nz] -c[Nz] Введя эти обозначения, мы уже можем выписать стан- стандартную задачу: Найти неотрицательный вектор y[N], удовлетво- удовлетворяющий условиям а[М, N]xy[N] = b[M] и минимизирующий значение c[N]xy[N]. Эта задача эквивалентна основной задаче A)—D). Эквивалентные преобразования будут широко исполь- использоваться при изложении методов решения задач линей- линейного программирования. Среди преобразований, расширяющих задачу линей- линейного программирования, отметим следующие: 1. Ослабление ограничений. Под этим общим назва- названием объединены в частности: а) снятие какого-либо ограничения (любого вида); б) замена уравнения неравенством; в) уменьшение компонент вектора b [Mi].
52 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ 2. Замена ограничения B) ограничением (r[Mr, MxJxafMb N])x где r[M', Mi] — неотрицательная матрица (часто исполь- используется даже умножение на неотрицательный вектор). 3. Умножение ограничений C) на произвольную мат- матрицу r[M', Mi] (без предположений о полноте ранга). 4. Расширение вектора x[N] добавлением новых пе- переменных с любыми коэффициентами в целевой функции и в матрице ограничений. Связь между исходными и расширенными задачами в каждом из этих преобразований очевидна, и мы на ней останавливаться не будем. Отметим, что расширение задачи часто используется в целочисленном программировании для построения при- приближенных методов л для оценки минимума целевой функции. В линейном программировании преобразова- преобразование 4 используется для приведения задачи к виду, более удобному для расчетов. § 3. Теория двойственности Теория двойственности представляет собой самую кра- красивую часть теории экстремума. Она объединяет много- многочисленные отдельные факты и методы, накопленные при анализе различных экстремальных задач,—метод неопре- неопределенных множителей Лагранжа, уравнение Эйлера из вариационного исчисления, геометрическую теорию двой- двойственности выпуклых множеств Минковского. К сожалению, здесь мы не имеем возможности вда- вдаваться в детали, объясняющие смысл и происхождения двойственности. Формально введя некоторую задачу ли- линейного программирования, которая базируется на том же наборе исходных данных, что и уже имеющаяся задача, покажем, что между этими двумя задачами имеется тес- тесная -связь. В теоремах этого параграфа мы установим те связи между задачами, которые понадобятся для дальнейшего. В следующих главах при рассмотрении конкретных задач линейного программирования будет видно, какой смысл можно придать переменным возникающих двойственных задач.
§ 3. ТЕОРИЯ ДВОЙСТВЕННОСТИ 53 Итак, задачей, двойственной к задаче A)—D), назы- называется задача: Максимизировать v[M]xb[M] A1) при условиях 0 TOS* О [ЛМ A2) v[M]xa[M, Л'1]<с[Л/1], A3) v[M]xa[M, N.2} = c[N2]. A4) Отметим, что если выписать задачу, двойственную к A1)—A4), мы снова получим задачу A)—D). Поэтому говорят обычно о паре двойственных задач, и только когда в этой паре выделена основная задача, ее называют пря- прямой задачей, а вторую задачу — двойственной. Если х[ N] — допустимое решение прямой задачи, a v[M] — допустимое решение двойственной, то c[N]xx[N]^v[M]xb[M]. A5) Действительно, так как а[М2, N]xx[N] = b[M2], то v[M2]xa[M2, N]xx[N] = v[M2]xb[M2]. Так как yfMiJSsOfMi] и a[Mlt N]xx[N]^.b[Mi], то и, значит, v[M]xa[M, M]xx[N]^v[M]xb[M]. A6) Аналогично получаем c[N]xx[N]^v[M]xa[M, N]xx[N], A6') что вместе с A6) и дает A5). Из A5) следует, что minc[N]xx[N]^s maxv[N]xb[N], A7) где минимум и максимум берутся по множествам допу- допустимых решений соответственно прямой и двойственной задач.
54 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Оказывается, что в случае, когда и прямая и двой- двойственная задачи имеют допустимые решения, в неравен- неравенстве A7) достигается знак равенства. Чтобы это доказать, нам потребуется один весьма глубокий геометрический факт, получивший название «теорема отделимости». Сле- Следующие ниже определения и рассуждения, как правило, могут легко быть истолкованы геометрически. Вектор у [N] называется выпуклой комбинацией векто- векторов л:0[Л^] и х\ [N], если для некоторого Ае[0, 1] y[N] = XxxO[N] + (l-k)xxl[N]. A8) Множество S называется выпуклым, если оно содержит все выпуклые комбинации из точек 5. В частности, вы- выпукло множество допустимых решений задач линейного программирования. Действительно, если xO[jV] и х\ [N]— два допустимых решения, т. е. если они удовлетворяют условиям a[Mi, N]x а[Мг, N]x то для любого Я е [0, 1] и y[N], определяемого форму- формулой A8), все эти условия также выполняются. Обозначим через Rn пространство всех векторов x[N]. Теорема 3 (отделимости). Пусть S — замкнутое вы- выпуклое множество в Rn и d[N]^S. Существуют такие вектор y[N] и число г, что d[N]xy[N]<z x[N]xy[N]>z для всех л:[Л/]<= S. Доказательство. Пусть p(x[N]) = x[N]xx[N]. A9) Из замкнутости S следует, что строго выпуклая функ- функция pi(x[N]) = p(x[N] — d[N]) достигает минимума на S в однозначно определяемой точке x'[N]. В качестве вектора y[N] примем x'[N] — d[N]. Пусть zo = d[N]xy[N]. Тогда
§ 3. ТЕОРИЯ ДВОЙСТВЕННОСТИ 55 Пусть х [N] — произвольная точка из S. Нам достаточно показать, что x[N]xy[N]^x'[N]xy[N]. B0) Пусть xk[N]~x'[N] + kx(x[N]-x'[N]). При К е= @, 1] вследствие выпуклости S имеем л\[Л^]е S. Так как х' [N] — единственный минимум функции plt то для всех 1е@, 1] Pl (х' [N]) < Pl {xx [N]) = Pl (x' [N]) + +2kx(x'[N]-d[N])x(x[N]— x'[N])+№xp(x[N]—x'[N]). После очевидных преобразований получаем 2x(x'[N)-d[N])x(x[N]-x'[N]) + + Kxp(x[N)-x'[N])>0, и, следовательно, (x'\N)-d[N])x(x[N]-x'[N])^0, что эквивалентно B0). В качестве г можно взять любое число из (z0, Zx). ^ Теперь мы перейдем к доказательству равенства в A7). Теорема 4 (двойственности). Если и прямая и двой- двойственная задачи имеют допустимые решения, то minс[N]хх[Щ = max v[M]xb[M]. B1) Доказательство. Мы докажем эту теорему сна- сначала для более простого случая стандартной задачи. Пусть М± = ф и yV2=0. Предположим, что теорема не- неверна и существует такое а, что mmc[N]xx[N]>a> max v[M]xb[M]. B2) Пополним множество М новым элементом г0. Пусть М = — M-\-i0, b[io] = a, a[i0, N] = c[N]. Рассмотрим систему уравнений а[М, N]xx[N] = b[M]. B3) По предположению эта система не имеет неотрицательных решений (такое неотрицательное решение было бы допу- допустимым решением прямой задачи линейного программиро- программирования со значением целевой функции, равным а). Иными словами, множество W векторов, представимых в виде w[M] = a[M, N]xx[N], где x[N]^0 [N], не
об ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ содержит вектора Ь[М]. Так как это множество выпукло и замкнуто, то в силу теоремы 3 найду_тся такие у[М] и z, что у [М] х Ъ [М] > г и у [М\ х w [M] < г для всех ау[уЙ]е HP, т. е. для всех x[N]^0\N] имеет место нера- неравенство _ у[М]ха[М, N]xx[N]<z. Так как при х [N] = О [N] левая часть неравенства равна О, то 2>0. Далее, поскольку неравенство верно для векторов вида XxE[N, /], ^>0, то у[М]ха[М, j]<z/X для сколь угодно большого К, и, следовательно, у[М]ха[М, N]^0[N] и _ _ y[M]xb[M]>0. Далее доказательство идет различными путями в зави- зависимости от предположений о значении у [/0]- Если у [г0] = = 0, то у[М]ха[М, N]^0[N], y[M]xb [Л1] = х>0. Прибавляя к допустимому решению двойственной задачи v[M] вектор у[М] с любым положительным множителем К, мы снова получим допустимое решение. При этом зна- значение целевой функции будет равно v[M]xb [М] + лхи и за счет выбора л может быть сделано больше а, что противоречит выбору а. При г/[г'0]>0 рассмотрим вектор г/i [M^J = у [M]/y[iQ]. Он удовлетворяет неравенствам У1[М]ха[М, У1[М]хЬ\М]>-а. B4) Пусть х[N] — допустимое решение прямой задачи, т. е. а[М, N]xx[N] = b[M], x[N]>0[N]. Тогда c[N]x Xx[N]^>a. Вместе с тем, умножая неравенства в B4) на x[N], мы получим yi[M]xb[M] + c[N]xx[N]^0 и c[N]xx[N]<ia, что невозможно. Нам осталось рассмотреть случай y[io]<iO. Положим Ух[М] = -у\М]/у[10]. Тогда уг[М]ха[М, N]^c[N], т. е. ^/i[Ai] является допустимым решением двойственной задачи, и yl[M]xb[M]'^>a, что противоречит предполо- предположению о выборе а. Следовательно, предположение B2)
§ 3. ТЕОРИЯ ДВОЙСТВЕННОСТИ 57 не может иметь места, и для стандартной задачи равен- равенство B1) доказано. Как мы показали в § 2, основная задача линейного программирования может быть приведена к эквивалент- эквивалентной стандартной задаче A1) —A4). Задача, двойственная к ней, выглядит так: Найти вектор у[Л1], удовлетворяющий условиям v[M)xa[M, N]^c[N], B5) и максимизирующий величину v[M]xb[M]. B6) Условие B5) можно переписать в виде v[M\xa[M, Nl\<ic[Nl], v[M]xa[M, N2]^c[N2), v[M)x(-a[M, N2])^-c[N2], что равносильно условиям v[M1)^0[Ml], B7) v[M]xa[M, NJ^clNi] B8) v[M)xa[M, N,] = c[N^. B9) Эти условия, которые эквивалентны условию B5), в точ- точности совпадают с условиями задачи, двойственной к основной. Значения целевых функций на соответствующих друг другу решениях эквивалентных задач в данном случае совпадают. Поэтому из доказанного равенства экстремаль- экстремальных значений целевых функций в задаче B5), B6) и стандартной задаче следует равенство для основной за- задачи. ^ Для оптимальных решений в неравенствах A6) и A6'), полученных при выводе неравенства A7), должен дости- достигаться знак равенства. Поэтому справедливы следующие соотношения, получившие название соотношений двойст- двойственности. Если для какого-либо оптимального х* [N\ и для некоторого /еЛ1] имеет место **[/]> 0, го для любого
58 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ оптимального v* [M] v*[M)xa[M, j] = c[j]. Если для какого-либо i e Mi и какого-либо оптималь- оптимального х* [N] справедливо неравенство a[i, N]xx*[N]> >b[i], то u*[t] = O в любом оптимальном v* [M]. Докажем первое из этих утверждений. Пусть для некоторых оптимальных х* [N] и v* [M] нашлось такое / ё Л/ь что одновременно **[/]>0 и v* [М]ха[М, /]<< <c[j]. Тогда v*[M]xa[M, /]хх* [/]<с[/]хх* [/]. По- Поскольку u*[Mjxa[M, N — j]xx*[N— j]^c[N — j]xx*[N — /], то в A6) имеет место строгое неравенство, что невоз- невозможно. Теорема 5 (критерий оптимальности). Для того чтобы допустимое решение x[N] прямой задачи было опти- оптимальным, необходимо и достаточно, чтобы нашлось такое допустимое решение v[M] двойственной задачи, что c[N]xx[N] = v[M]xb[M]. C0) Доказательство. Достаточность очевидна. Необходимость мы будем доказывать только для стандартной задачи. Пусть x\N] — оптимальное решение. При a<.c[N\x> xx[N] система уравнений c[N]xx[N] = a, а[М, не имеет неотрицательных решений. Поэтому найдутся (ср. доказательство теоремы 4) такие у0 и у[М], что у[М]ха[М, N] + yoxc[N]^0[N) C1) y\M]xb[M} + y0 Умножая обе части C1) на x[jV] и производя необходи- необходимые преобразования, получим
§ 4. МЕТОД ПОСЛЕДОВАТЕЛЬНЫХ УЛУЧШЕНИИ 59 откуда следует, что уй<С0. Разделив на у0 в C1) и поло- положив v[M] = — у[М]/у0, мы получим v[M]xa[M, N]^ т. е. двойственная задача имеет допустимое решение, а в этих условиях, согласно теореме 4, для оптимально- оптимальности x[N] необходимо выполнение равенства C0). ^ В основе многих численных методов линейного про- программирования лежит критерий оптимальности допусти- допустимого решения, описанный в этой теореме. Имея некото- некоторое допустимое решение,' мы пытаемся построить реше- решение двойственной задачи, уравнения для которого получаются из соотношений двойственности. Если нам удается построить такое решение, то решение прямой задачи оптимально, если же нет, то нужно искать другое решение. В следующем параграфе будет показано, как решения двойственной задачи могут помочь и в поиске улучшений. § 4. Базисные решения. Метод последовательных улучшений В изучении выпуклых множеств особую роль играют так называемые крайние точки. Точка x[N] из выпуклого множества 5 называется его крайней точкой, если из того, что следует, что x[N] = x'[N] = x"[N]. Иными словами, не существует лежащего в S отрезка положительной длины, серединой которого являлась бы крайняя точка х[ЛГ]. Посмотрим, что представляют собой крайние точки множества допустимых решений стандартной задачи ли- линейного программирования. Найти x[yV], удовлетворяющий условиям x[N]^0[N], C2) а[М, N]xx[N] = b[M] C3) и минимизирующий c[N]xx[N]. C4)
60 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Пусть г = rank (a [M, N]). Будем считать (это необхо- необходимо для разрешимости условий C3)), что добавление к матрице а[М, N] вектора Ь[М] в качестве еще одного столбца не увеличивает ранга матрицы. Пусть множество N' с N такого, что rank (а [М, N']) = = г и \N'\ = r. Вектор х[Щ, удовлетворяющий равен- равенствам а\М, N']xx[N'] = b[M], C5) x[N\N'] = 0[N\N'], C6) называется базисным решением. Множество N' называется базисом. Напомним, что x[N] находится из C5), C6) однозначно. Действительно, достаточно выбрать М' а М таким образом, чтобы \M'\ = r, rank (а[Мг, N']) = r, и положить x[N'] = cr[N', M']xb[M'], где cr[N', M'] — матрица, обратная к а[М', N']. Одно и то же базисное решение может соответствовать различным базисам. Например, в задаче с условиями Хг— х2 + 2 х х3 + 2 х х4 = 2 базисное решение хг = 2, х2 = х3 = х4 = 0 соответствует любому из базисов {1, 2} и {1, 3}. Если x[N']^-0[N'], базисное решение называется допустимым базисным решением. Для простоты мы ограничимся сейчас случаем, когда гапк(а[УИ, #])= М\. Введенные только что допустимые базисные решения и являются крайними точками множества допустимых решений. Именно, справедлива следующая теорема. Теорема 6. Для того чтобы вектор x[N] был край- крайней точкой множества допустимых решений, необходимо и достаточно, чтобы он был допустимым базисным реше- решением. Доказательство. Достаточность. Пусть Х[Щ~допустимое базисное решение, соответствующее базису N'. Предположим, что нашлись такие допустимые решения x'[N]ux"[N], что x[JV] = y Xx'[N] +1 xx"\N]. Обозначим через W множество положительных компонент вектора x"[N]. Очевидно, N"czN' и, по предположению,
§ 4. МЕТОД ПОСЛЕДОВАТЕЛЬНЫХ УЛУЧШЕНИЙ 61 N'\N" Ф 0, откуда следует, что ; N" \ < r = \ M ;. Таким образом, система а[М, N']xx[N'] = имеет, кроме решения x[N'] = a-[N', M]xb[M], еще и решение x"[N'], отличное от x[N'], что невозможно, так как ранг матрицы а[М, N'j равен г. Необходимость. Пусть допустимое решение x[N] не является базисным. Обозначим через N'r множество положительных компонент x[N]. Тогда \ N+ >? = -=rank(o[M, N+]). Действительно, если tN+\ = k, то, рас- расширяя множество А^т до множества N', для которого 'Л/'| = г, rank (a [М, N']) — r, мы, вопреки предположе- предположению, установили бы, что N' является базисом, порож- порождающим базисное решение х[А/]. Выберем М" а М и N" а N так, чтобы ' М"; = N" — = k, det (а[ЛГ, N"]) ф0. Положим y[N"] = a- [N", М"]х xb\M"], где ar[N", M"] — матрица, обратная к а[М", N"], = 0[N\N"]. Для достаточно малого е векторы будут неотрицательными (и допустимыми), и x[N] явля- является их полусуммой, что завершает доказательство для случая у[М"]Ф0[М"]. Добиться . того, чтобы у[№]ф Ф0[М'], очень просто —достаточно включить в М" эле- элемент i, для которого ЬЩФО. Если же Ь[М] = 0[М], то Вектор x[N] называется выпуклой комбинацией векто- вектог/ifMJ, i'eM вектор л [М], что р [] ров г/ifMJ, i'eM, если найдется такой вероятностный р л [М], Множество всех выпуклых комбинаций векторов yi[N\ называется выпуклой оболочкой этих векторов. Теорема 7. Если множество допустимых решений задачи линейного программирования ограничено, оно явля- является выпуклой оболочкой допустимых базисных решений.
62 ГЛ 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Доказательство. Мы покажем, что любое допу- допустимое решение является выпуклой комбинацией допу- допустимых базисных решений. Для допустимого решения x[N] положим N+ = {j]x[j]>0}. Рассмотрим случай, когда | JVt: >rank (a[M, N"]). Это неравенство означает, что найдется такой вектор l[N+]=?Q[N+], что а[М, N+]x xg[A/+] = 0[M]. Можно считать, что по крайней мере одна из компонент вектора ?[N+] строго положительна. Вектор ![N+| не может быть положительным, так как в этом случае любой вектор вида xi[N] = x[N]-\-Xxl[N], где Я>0, ?[yV\W+] = 0[iV\/V+], являлся бы допустимым решением и множество допустимых решений, вопреки предположению, было бы не ограничено (к этому случаю мы позднее еще вернемся). Таким образом, некоторые компоненты вектора хЦМ] уменьшаются с ростом X, и при некотором критическом значении X = X* впервые одна из компонент становится равной 0. Пусть / е N+ и ?[/]<0. Компонента x?\j] обращается в нуль при Я = Я[/] = — *[/]/? [/]>0, а X* есть минимум кз таких Я [у]. Рассмотрим вектор xi[N] — x[N]~~ Xxl[N], анало- аналогично найдем к**, при котором впервые одна из нену- ненулевых компонент вектора x'i[N] становится равной 0. Я** = rain {*[/]/?[/]!/etf+, g[/]>0}. Вектор x[N] можно теперь представить в виде выпук- выпуклой комбинации xt*[N] и xi**[N~\: Множество голожительных элементов каждого из этих двух векторов меньше чем Af+. Если число элементов в них меньше ранга соответствующих матриц, то к х?* и xj.** можно применить ту же процедуру и представить х в виде выпуклой комбинации векторов с еще меньшими множествами положительных элементов. Так как в мат- матрице а[М, N] не может быть нулевых столбцов (соот- (соответствующее x[i] могло бы принимать любые положи- положительные значения вопреки ограниченности множества допустимых решений) и, следовательно, каждая одностолб- одностолбцовая матрица имеет ранг 1, процесс закончится пред- представлением вектора x[N] в виде
§ 4. МЕТОД ПОСЛЕДОВАТЕЛЬНЫХ УЛУЧШЕНИЙ 63 где fx[/?J — вероятностный вектор, a xr[N], re/? —допу- —допустимые решения, обладающие тем свойством, что если то :#;! = rank И/И, N;]). Покажем теперь, что допустимое решение x[N], для которого \N[- = rank (a[M, N']), является базисным решением. Как известно, гапк(а[УИ, N+]) =s: \M '. Так как, по предположению, rank (a [M, N]) = \M\, то найдется такое множество N' zd.N", \N'\ = \Ml, что rank (a [M, ЛГ]) = ;М|. Так как а[М, N-]xx[N^] то а[М, N']xx[N'] = b[M], и, следовательно, х[N] явля- является базисным решением. ^ В случае, если существует такой положительный век- вектор I [N], что а[М, N]x множество таких векторов ?f образует выпуклый однород- однородный конус. Это значит, что оно удовлетворяет условию: если li[N], \%\N\^S, то для любых неотрицательных }Л и Я2 вектор Ъ.хуХ\\Щ + К'х\г\Щ^-'%• Теорема 8. Любое допустимое решение задачи ли- линейного программирования представимо в виде суммы где у[Щ —элемент конуса неотрицательных решений однородной системы линейных ограничений, a xo[N] — выпуклая комбинация базисных решений. Доказательство повторяет доказательство тео- теоремы 7 с той лишь разницей, что при выделении из x[N] слагаемых с меньшим количеством положительных эле- элементов может встретиться какой-либо элемент из конуса. Все такие элементы в сумме и составляют вектор 2/[N]. A Теорема 9. Если в задаче линейного программирова- программирования имеется оптимальное решение, то в ней имеется и оптимальное базисное решение. Доказательство. Пусть x[N] — оптимальное ре- решение. Из теоремы 8 следует, что его можно представить
64 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ к виде где Xi [N] — допустимые базисные решения, к [R] — веро- вероятностный вектор, у [N] — вектор из конуса, однородных решений. Так как х[УУ] — оптимальное решение и при любом К5^0 вектор x[N]-\-).xy[N] является допустимым реше- решением, ТО (иначе значение целевой функции не ограничено), и допустимое решение также является оптимальным. Так как xt[N] — допусти- допустимое решение, то ' а поскольку К[Щ xy[R] = y0, то y[i] = y0 при X[i]>0. Выберем такое /0, чтобы к [i0] > 0. Допустимое базисное решениеxio[N] и будет оптимальным базисным решением. ^ Геометрический смысл этой теоремы прозрачен: минимум линейной функции на выпуклом многограннике всегда достигается на одной из вершин. Из этого не следует, разумеется, что он достигается только на вершинах, и не во всех случаях нахождение оптимальной вершины соответствует постановке задачи. Однако в подавляющем большинстве методов решения задач линейного программирования отыскиваются именно оптимальные базисные решения. Наибольшее распростра- распространение получил метод последовательных улучшений. В осно- основе этого метода лежит способ, по которому, имея неко- некоторое допустимое базисное решение, можно проверить его оптимальность и в случае его неоптимальности построить новое допустимое базисное решение с меньшим значением целевой функции. К рассмотрению этого метода мы сейчас и перейдем. Упомянутая нами проверка оптимальности основывается на критерии оптимальности. Пусть задано допустимое базисное решение x[N\, соответствующее базису N'.
§ 4. МЕТОД ПОСЛЕДОВАТЕЛЬНЫХ УЛУЧШЕНИЙ 65 Таким образом, >N'\ = iM\, det (a[M, Л/'])=^0 и вектор x[N'], являющийся решением системы а[М, N'] xx[N'] = b[M], C7) неотрицателен, т. е. cr[N', M] xb[M]^0[N'], где a' [N', М] — матрица, обратная к а [М, N']. Рассмотрим сначала случай x[N'] >0[ЛГ]. В силу соотношений двойственности, если х [N] — оптимальное решение, то каждое оптимальное решение двойственной задачи должно удовлетворять условию v[M] xa[M, N'] = c[N']. C8) Из этих уравнений находятся значения переменных v [M]: с[ЛГ] х a-[N', M], и нужно только проверить, дают ли они допустимое ре- решение двойственной задачи, т. е. выполняются ли нера- неравенства v[M] х а[М, N]^c[N]. Если неравенства выполняются, то решение x[N] явля- является оптимальным. Предположим теперь, что для некоторого /oeJV v[M]xa[M, /o]>c[/o]. C9) Покажем, что при увеличении компоненты х [/0] (в базисном решении она равна 0, так как /0 не входит в базис, это легко видеть, сравнивая C8) и C9)) и соответствующем изменении л;[Л"] линейная форма убывает. Действительно, пусть x[jo] — e. Условия C3), отбрасывая переменные, которые остаются равными нулю, можно представить в виде а [М, N'] х х [N1] = b [М] - г х а [М, /0]. D0) Найдем х [N'] из этой системы, обозначив его через хг [N'] и полагая хг [/„] = е, хЁ [N\(N' + /„)] = 0 [N\(Nr + /0)]. Мы получим xz[N'] = x[N']-z xa[N', M] X а[М, /„] 3 И. В. Романовский
66 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ И с [N] х хЕ [N] = с [N1] х хг [N'] + с [/„] х е = —с[ЛГ] х ar [N', М] х а [М, /o]) = c[/V] x лг[ЛГ] + + ВХ (с [/о] - о [М] X а [М, /о]) < с [М1] X х [Л/']. Очевидно, что чем больше е, тем меньше значение целевой функции. Однако его увеличение ограничивается требо- требованием допустимости решения xE[iVJ. Уравнения D0) гарантируют выполнение равенств C3). Неотрицательность переменных хе [A/\W] также достигается автоматически (переменная хе [/„] неотрицательна, а остальные равны 0). Таким образом, остается следить за неотрицательностью вектора xE[N'] = x[N']-exa.[N'), D1) где a[N'] = a,-[N', M]xa[M, /0]. При а[/]<;0 величина *[/] —еха[/] не убывает с рос- ростом е, поэтому нам достаточно ограничиться множеством /Va = {/е W, a[/]>0}. Пусть Na непусто. Положим X = min{x[j]/a[j\\Je=Na}. D2) Обозначим через уг индекс, на котором в D2) достигается минимум. При е==?;Я вектор D1) неотрицателен, а при е>Я имеет место х[Д] — г х a [y'J < 0. Таким образом, в качестве максимального е следует взять л. (Если Na пусто, то X, а с ним и целевая функция, неограничены.) Покажем, что допустимый вектор х% [N] является ба- базисным решением, соответствующим базису yV" = /V-J-/0—у\. Так как \N",— N'1,- нам достаточно убедиться в том, что det(a[M, /V"])=^=0. Покажем, что существует матрица a[N", M], обратная к а[М, N"]. Будем искать эту матрицу в виде u[N", M] = d[N", N'] x ar[N', M]. Тогда матрица d[N", N'] должна удовлетворять условиям d[N", N']xal[N', N"] = E[N", N"],
§ 4. МЕТОД ПОСЛЕДОВАТЕЛЬНЫХ УЛУЧШЕНИИ 67 где al[N', N"] = a-[N', M] х a[M, N"]. Положим № = = N"— jo = 'N'—/i- Матрица a\[N', N"] имеет вид a\[N', №] = E[N', №], al[N', jo] = a[N']. D } Зададим матрицу d[N", N'] следующим образом: d[N", /V°] = ?[/V", №], d[№, /0] = -a[^°]/a[/1], d[iu /o]=l/«[/J. ( } Обозначим произведение d[N", N']xal[N', N"] через r[N", N"]. Нам нужно показать, что г [TV", N"] — единичная матрица. Вычислим отдельно: r[N", №] = d[N", №]xal[№,№] + d[N"J1]xal[j1, №], r[№, /i] =d[№, NO] x a\ [N\ jo] + d[N\ j,] x a\ [jlt /0], r[lo, /o] = d[/o> /V«]x«lLiV0, /o] + d[/o, /tjxal[/b /0]. Подставляя выражения из D3) и D4), получим r[N", №] = E[N", №] х Е[№, №] + + d[N", hjxOlU r[№, lo] = E[№, №] x a [#»]-«[/!] X r\h, io] = Таким образом, матрица d[N", N'] является обратной к a\[N', N") и матрица d[N", N'] X a~[N', M] является обратной к а[М, N"]. Очевидно, что с точностью до знака det(a[M, /V"]) = det(a[M, N']) х Итак, по каждому неоптимальному допустимому базис- базисному решению со строго положительной базисной частью л:[ЛГ] можно построить другое допустимое базисное решение с меньшим значением целевой функции. Убывание значений целевой функции гарантирует, что базис, встре- встретившийся однажды, уже не появится при итерациях этой процедуры улучшений. Метод построения улучшений сам по себе не требует строгой положительности x[N']. Однако при x[N']^s О [Л/'] может не произойти уменьшения значения целевой функции и вычислительный процесс может зациклиться: найдется конечный набор допустимых базисных решений, который
68 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ будет повторяться в циклическом порядке. Это вырож- вырождение процесса может быть устранено введением более сложной процедуры выбора индекса /ь на котором дости- достигается минимум в D2). Такую процедуру и доказательство ее работоспособ- работоспособности мы рассмотрим в следующем параграфе. Отметим, однако, что в большинстве практически используемых программ опасность зацикливания игнорируется, так как ни в одной из огромного количества решенных практи- практических задач таких зацикливаний не встретилось. В настоящее время разработано довольно много раз- различных реализаций метода последовательных улучшений. Они отличаются тем, как осуществляется решение систем C7), C8) и системы а[М, N'] X a[N']=*a[M, /„]. D5) Разумеется, возможно непосредственное решение этих систем заново на каждом шаге процесса. Однако этот путь не рационален с точки зрения экономии вычислений. Ниже, в § 6 и далее, мы рассмотрим несколько достаточно экономных реализаций метода последовательных улуч- улучшений. ]Мы рассмотрим один шаг улучшений, который может повторяться многократно. Однако должно быть какое-то допустимое базисное решение, с которого можно было бы начать — начальное допустимое базисное решение. Проще всего такое решение можно получить с помощью так на- называемого метода искусственных переменных. Перепишем равенства C3) так, чтобы получить Ь[М]^ ^0[М], и включим в каждое равенство по одной новой переменной с коэффициентом 1. Считая для простоты, что N (]М = ф, мы можем новые переменные обозначить через л:[Л4]. Добавлением этих переменных мы расширили нашу исходную задачу. Цель этого расширения — упро- упрощение поиска начального базисного решения. Однако нельзя позволять, чтобы эти новые, искусственные, пере- переменные оставались в окончательном решении с положи- положительными значениями. Чтобы предотвратить это, нужно сделать их использо- использование невыгодным. Для этого в целевую функцию их включают с «очень большими» коэффициентами. Вводится число gz, которое считается больше любого встречающегося
§ 4. МЕТОД ПОСЛЕДОВАТЕЛЬНЫХ УЛУЧШЕНИЙ 69 в вычислениях числа. Фактически это означает, что каж- каждое встречающееся нам число представляется в виде а X gz + Р, и число cci x gz + Pi больше числа а2 X gz-\- p2, если <Х!>а2 или «! = а2 и Pi>P2 (т. е. если вектор (аь Pi) лексикографически больше вектора (а2, р2)). Полагая а[М, М] = Е[М, М], c[M] = gzxl N = N U М, мы получим следующую задачу. Задача с искусственным базисом. Найти х[М], удовлетворяющий условиям а[М, N] X и минимизирующий c[N] х В этой задаче начальное допустимое базисное решение всегда имеется и легко находится. Это решение x[N]~ = 0[N], x[M] = b[M]. Дальнейшие вычисления можно проводить двумя путями: сохраняя искусственные пере- переменные до конца (вводя строку коэффициентов при g<: или задавая для конкретных задач достаточно большое реальное gz) или первоначально решив вспомогательную задачу минимизации суммы искусственных переменных. В обоих случаях получение в оптимальном решении положительной искусственной переменной означает, что исходная задача не имеет допустимых решений. Действи- Действительно, пусть л:* [А7] — оптимальное решение задачи с искусственным базисом, а х [W] — какое-либо допустимое решение исходной задачи. Пусть х* [i]>0 для некоторого i'eM. Значение целевой функции на х*[Л7| равно aXg2 4-p, где ass= jc* [г']>0, а значение целевой функ- функции на x[N\ равно c[N]x x[N] = 0 x gz + $\, что по условию меньше. Может случиться, что в базис оптимального решения входит искусственная переменная с нулевым значением. Это означает, что rank (a[M, N])<C\M \. Метод искусственного базиса достаточно прост и уни- универсален. Однако не следует пренебрегать особенностями конкретных задач, позволяющими получить более каче- качественное начальное допустимое базисное решение. Например, если имеем ограничения в форме неравенств а[Ми /V] xxlNj^blM^ D6)
70 гл. 2. линейное программирование и при этом 6[yW!jSiO[yWi], то при сведении этих нера- неравенств к равенствам a[Mlt N]xx[N] + y[Ml] = b[Ml] D7) переменные г/[Мх] можно ввести в базис, и для этих ограничений искусственных переменных уже не требуется. Случай b [i] < 0 несколько сложнее. Кроме таких же дополнительных переменных, как в D7), нужно во все такие ограничения добавить с коэффициентом — 1 одну и ту же искусственную переменную x[j~) так, чтобы ограничения приняли вид a[i, M]x x[M] + y[i]-x[r] = b[i]. D8) Пусть г —индекс, на котором достигается mm b[i]. В качестве базисных переменных, соответствующих огра- ограничениям D8), можно принять у[i] при 1фг и x[j~] для г. Значениями этих базисных переменных будут x[r] = — minb[i], y[i] = b[i] + x[j'], 1фг. Начальная матрица будет лишь одним столбцом (соответ- (соответствующих x[j~]) отличаться от единичной, и построить для нее обратную большого труда не составит. § 5. Устранение зацикливания и сходимость метода последовательных улучшений Идея устранения зацикливания очень проста: нужно так видоизменить задачу, чтобы на каждой итерации целевая функция строго убывала. Для этого к правым частям ограничений C3) добавляются пренебрежимо малые добавки различного порядка так, чтобы устранить возмож- возможность одновременного достижения минимума в D2) на нескольких j^N'. Пусть для простоты М — 1 : т. Пусть eps — «очень малое число» в том же смысле, как «очень большое число» в предыдущем параграфе. Положим х) beps [i] = b [i] + eps', i<=l:m. Все переменные х[ЛГ] и значение целевой функции для каждого допустимого базисного решения будут полиномами Редкий для нас случай: eps1 обозначает eps в степени i.
§ 5. УСТРАНЕНИЕ ЗАЦИКЛИВАНИЯ 71 от eps степени т, причем их свободные члены будут равны значениям соответствующих величин в «невозму- «невозмущенной» задаче. Полиномы, соответствующие в данном базисном решении различным базисным переменным, ока- оказываются при этом различными. Действительно, для того чтобы получить набор коэффициентов такого полинома, как вектор, нужно матрицу cr[N', M] (обратную базис- базисной матрице а[М, N']) умножить на матрицу, составлен- составленную из вектора b [M] и единичной матрицы, что дает матрицу, составленную из вектора (J[jV'] и матрицы a~[N', M). Равенство (и даже пропорциональность) двух полиномов означало бы равенство (пропорциональность) двух строк этой матрицы, что невозможно ввиду ее невы- невырожденности. При нахождении минимума в D2) мы должны найти «наименьший» из полиномов р;- (eps)/а [/]. При этом мы считаем, что полином/0 + /х х eps + ---+!m X epsm меньше, чем полином go + gi X eps-\-. ..-\-gm x epsm, если вектор (/о. /ъ • • • > fm) лексикографически меньше вектора (go, gi, •••> gm). Отметим, что из лексикографической неотрицатель- неотрицательности вектора коэффициентов полинома следует неотри- неотрицательность самого полинома при достаточно малых зна- значениях аргумента. Таким образом, метод последовательных улучшений выглядит теперь так: начальное допустимое базисное решение должно быть выбрано таким образом, чтобы все переменные были строго лексикографически положительны. Если мы начинаем с единичной матрицы и неотрицательных значений базисных переменных, то это условие выполняется автоматически. На каждом шаге метода последовательных улучшений мы также будем иметь набор строго лексикографически положительных значений базисных переменных. Выбрав переменную /0, которую нужно ввести в базис, мы будет искать переменную, выводимую из базиса, и коэффициент Kps таким образом, чтобы %eps (который также является полиномом по eps) был лексикографически максимальным, а все значения xeps[N'] были лексикографически неотри- неотрицательны. Для этого в множестве Щ=Ц; eiV', а[/]>0} выбирается множество jV,1" таких / е Щ, Для которых достигается минимум отношения x[j]/a[j]. Если в N\ больше одного элемента, то выбирается подмножество N%
72 ГЛ. 2j,ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ тех / е NJ", на которых достигается минимум a~[j, l]/a[/], затем определяется N1 как множество тех / е Л/J, на которых достигается минимум a~[j, 2]/a[j] и т. д. Так как среди полиномов нет пропорциональных, на каком-то k-м шаге множество Nj, будет состоять из одного элемента. Его и следует принять за jx. В качестве Xeps примем X eps + ... + lm х epsm, где Я, = гшп{а-[/, i]/ Nt = W при 15э&. Легко видеть, что A.eps лексикографически неотрицателен и что новое значение целевой функции будет равно c[N] х xeps[N] + leps x y. т. е. будет лексикографически строго меньше предыдущего. Поскольку переход от одного базиса к другому сопро- сопровождается уменьшением (хотя бы только лексикографи- лексикографически) целевой функции, возвращение к уже встречавшемуся базису становится невозможным и ввиду ограниченности множества возможных базисов инеративный процесс схо- сходится за конечное число шагов. § 6. Некоторые реализации метода последовательных улучшений В этом параграфе будут изложены в виде процедур на языке алгол-60 несколько наиболее простых реализаций метода последовательных улучшений. Общая схема этого метода описывается следующей процедурой: procedure LP opt basic solution (start, new, work, fin); procedure start, new, work, fin; begin boolean optimum; start; mk\: new (optimum); if optimum then go to mk2; work; go to tnkl; mk2: fin end LP obs
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 73 Здесь start — процедура подготовки данных для вы- вычислений (начальное заполнение массивов, построение начального допустимого базисного решения и др.), new— процедура проверки решения на оптимальность {opti- {optimum == 'решение оптимально') и выработки вводимой в базис переменной при optimum == false, work — про- процедура нахождения выводимой из базиса переменной и изменения записи в соответствии с новым базисом, fin — процедура оформления в нужном виде окончатель- окончательного решения. а) Симплекс-метод. Симплекс-метод —наиболее простая из процедур метода последовательных улучше- улучшений. В нем информация о текущем состоянии вычисли- вычислительного процесса задается перечнем базисных перемен- переменных и их значений, матрицей cr[N', M]xa[M, N], вектором v[M]xa[M, N]-c[N], D9) где и значением c[N']xx[N']. Как правило, в качестве М принимается 1 : т, а в качестве N — множество 1 :п. Таким образом, информацию о вычислительном про- процессе (запись) мы можем представить в виде целочислен- целочисленного вектора base[l:m], задающего одно-однозначное отображение Т: 1 :m-*-N', и матрицы as[0:m, 0:n], где as[\:m, 1 :п] = сг[ТA :т), М]ха[М, 1 : п], as[0,l:n] =с[1 : n]-v[M]xa[M, 1 : п], as[\:m, 0] =х[Т A :m)] = cr[T (I : m), M]xb[M], as[0, 0] =c[N']xx[N']. Для искусственных переменных используется множество индексов п+1 \n-\-m. Соответственно доопределяется и матрица as.
74 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Следующая ниже процедура startl формирует искус- искусственный базис с заданным «большим числом» gz. Счи- Считается, что fe[Al]O[AIJ procedure startl; begin integer i, j; as[0, 0]: = 0; iter:=O; for /: = 1 step 1 until n do as [0, /]: = — c[/]; for j: = 1 step 1 until tn do begin as ft, 0]: — b[i]\ for /: = 1 step 1 until n do begin as[i, j]: = a[i, /]; as[0, /]: = as[0, /] + ^xaf(, /] end; for /: = и+1 step 1 until п-i-m do as [г, /]: = 0; as[i, n + 'J: = l; base[i]: = n + i; as[0, 0]: = as[0, 0] + a[j, OJxgz end i; for /: = /г+1 step 1 until n-fm do as[0, /]:=0 end start Поясним написанное: в основную часть матрицы as[l : tn, I : п] переписана матрица а[\:т, 1 : п], в asx х[1:/п, 0] —вектор й[1:т]. В base[\:m] записаны }юмера базисных переменных (искусственных). Матрица as[N', N'] формируется и должна оставаться единичной. as [0, 1 : т] формируется по формуле D9). Переменная iter, которой присваивается значение 0, является целочисленной переменной, описанной вне процедуры. Она предназначена для счета числа ите- итераций. Перейдем теперь к описаниям других процедур. По- Пояснения будут даваться после описаний: procedure new\ (opt); boolean opt; begin integer /; real max; /0:=0; max: — 0; for /: = 1 step 1 until n do if as[0, j]i>max then begin max: = as[0,/]; jO:=j end; opt: =max = Q end new
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 75 Здесь производится перебор всех /el:n с запоми- запоминанием максимального значения as [0, /] в max, а /, на котором достигается этот максимум, в /0: procedure workl; begin integer i, j, Ю; real min, a\; boolean tin; Her. = iter-\-\\ ыя: = тгие; min: — gz; for i: — 1 step 1 until m do if as[i, /0]>0 then begin a\: — as[i, 0]/as[i, /0]; if un V min>a\ then begin min: = a\; iO: = i; un: — false end end; if un then go to unbo; comment un = true, если целевая функция задачи не ограничена. Условием такой неограниченности является as[l:m, /0]^0[1:тп]. Это условие и проверяется цик- циклом по i. Как только в столбце as[l:m, /0] найдется положительная компонента, ип полагается равным false и больше не меняется. Если оказалось, что линейная форма не ограничена, обычно предусматривается какая- либо специальная печать; base [iO]: = jO; al: = l/as[iO, /0]; for /: = 0 step 1 until n-\-m do as[iO, /]: = as[Ю, j]xal: for /: = 0 step 1 until iO—l, Ю+1 step 1 until m do begin a\: = as[i, /0]; for /: = 0 step 1 until n-\-m do as[i, j]: = as[i, j] — a\xas[i0, j] end end work После нахождения Ю —места выводимой из базиса переменной —происходит пересчет матрицы — умножение ее на матрицу d[N", N']. Для этого строка as[i0, N] делится на as [Ю, /0], а из оставшихся строк вычитается строка as[/0, N] с соответствующим весом. Отметим, что после выполнения этих вычислений в столбце as[M, jO] стоит 1 на пересечении со строкой Ю и 0 в остальных строчках.
76 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Наконец, процедура fin может быть описана так: procedure finl; begin integer /; array res [I : n]; for /: = 1 step 1 until n do x[j]: = 0; for /: = 1 step 1 until m do x[base[j]]: = as[j, 0]; print (x, iter) end fin Эта процедура выдает на печать (процедура выдачи обозначена print) оптимальное решение х[1:л] и число итераций iter. В реально используемых программах при решении задач с большим п такая выдача информации будет нецелесообразной. Обычно на печать выдается список базисных переменных с их значениями. Кроме того, целесообразно вычислять для полученных перемен- переменных значение а[М, N]xx[N] для контрольного сопо- сопоставления его с Ь [М]. В реальных алгоритмах используется также метод порога для выбора вводимой в базис переменной. При большом числе переменных нет смысла перебирать все переменные в поисках максимума as [0, /]. Вместе с тем для уменьшения числа итераций все же желательно, чтобы вводимые в базис переменные имели достаточно высокий показатель as[0, j]. Для этого показатели срав- сравниваются с некоторым порогом. Когда находится пере- переменная, у которой as[0, /] больше этого порога, она вводится в базис. Если такой переменной не находится, то после полного просмотра в базис вводится переменная с максимальным значением as [0, /], а порог уменьшается. В качестве нового значения порога можно принять, например, as[0, /0]/2. Просмотр переменных на следу- следующей итерации продолжается при этом с того места, на котором он оборвался. Условие as[0, N]^0[N] для оптимального решения на практике также претерпевает небольшое изменение. Мы прекратим вычисления, когда max as [0, /] будет меньше наперед заданного малого числа eps. Нужно только во избежание неправильной остановки процесса следить за тем, чтобы порог не становился меньше eps. С учетом всех этих изменений общую программу симплекс-метода для решения задач линейного програм- программирования можно записать следующим образом:
§ 6, НЕКОТОРЫЕ ПРОГРАММЫ 7? procedure LP soil (m, n, gz, eps, a, b, c); integer m, n; real gz, eps; array a, b, c; begin integer Her, jO, j\; real lev; boolean opt; array as [0 : m, 0 : m + я]; integer array base [~1 : m]; procedure start 1; begin integer i, j; as[0, 0]:=0; iter.=0; for /: = 1 step 1 until n do as[Q, /]: = — c[/]; for i: = 1 step 1 until m do begin as[i, 0]: = *[/]; for /: = 1 step 1 until n do begin as [г, j): = a[i, j]; as[0, /]: = as[0, j] + gzxa[i, j] end; for /: = n+l step 1 until n-\-m do as[i, /]: = 0; as[i, « + i]:==l; base[i]: = n + i; asfO, 0]: = as[0, 0] + as[t, O]X?Z end t; for /: = n+l step 1 until n + m do as[0, /]: = 0; end start; procedure workl; begin integer i, j, Ю; real min, a\; boolean un; iter: — iter +1; мя: = true; min: = gz; for г: = 1 step 1 until m do if as[i, /0]>0 then begin al: = as[/, 0]/as[i, /0]; if w« V min^>a\ then begin mm: = al; Ю: = г; im: = false end end; if мл then go to unbo; base[iO]: = jO; al: = l/as[iQ, /0]; fory: = 0 step 1 until n + m do as [Ю, /]: = as[iO, /]xal; for г: = 0 step 1 until Ю—1, Ю+1 step 1 until m do begin a\: =as[i, /0]; for j: — 0 step 1 until /i + m do as[i, j]: = as[i, j] — a\ xas[i0, /] end end work; procedure new2 (opt); boolean opt; begin integer /: real max; /0:=/l; max:—0; for /: = /1 —|— 1 step 1 until n, 1 step 1 until /1 — 1 do if as[0, j]>max then begin max: — as [0, /]; /0:=/; if max > lev then go to mk end;
78 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ lev: = max/2; if lev<Leps then lev: = eps; tnk: opt: = max <L eps; /l: = /0 end пеги; procedure /m2; begin integer i, /; real al; for i: = 1 step 1 until m do begin al:=0; for /: = 1 step 1 until tn do if base [/]«? n then al: = al + a [г, base[/]]xas[/, 0]; рпл/ (ftas<?[/], as G, 0], al, 6[t], as[0, я-MJ ) end end fin; lev:=gz; /1: = 1; 1 (opt); if op^ then go to mk2; workl; go to mkl; mk2: fin2; go to mk3; unbo: print (/0, as[0, /0J); /m2; end LPsol Решим с помощью этой процедуры небольшой числен- численный пример. Пример. Максимизировать 3 х *i + 2 X х2 + х3 (или, что то же, минимизировать —3x*i — 2хлг2 — х3) при условиях Xi + 2 х х2 + х3 =5, — x-i — 2 х a:3 + Ч = 3, X/ S5 0. На рис. 8 изображена форма для информации о со- состоянии вычислительного процесса в LP soil при т = 2 и п = 4, а па рис. 9 выписаны в табличном виде исход- исходные данные примера. Примем ?2=1000 и eps — 0,01. После перехода к LP opt basic solution и действия про- процедуры start 1 состояние процесса примет вид рис. 10. new2 (opt) дает /0 = 2, max = 2002, opt = false. Поэтому переходим к процедуре work 1, в которой получаем Ю= 1 и после необходимых преобразований приходим к за- записи, изображенной на рис. 11 (не изменяющиеся в ходе вычислений величины т., п, gz, eps в дальнейшем опу- опускаются). Возвращаемся к метке mk 1 и, выполняя оператор про- процедуры new2, получаем /0 = 4 и opt == false, процедура
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 79 л iier JP jf ffz eps lev opt 0 iase f г 0 / 2 3 i e as Рис. 8 Рабочая память в симплекс-методе. b 5 3 / -/ L 2 О 7 1 -г 0 ~з i -2 п -/ О Рис. 9. Исходные данные. от п Пег jO jf ffz eps lev opt GO 0 0 П И1 wo° I \W\ [ 'ooo I ? base- s s 8000 5 3 3 f -f 2002 2 0 -999 f _ n №00 0 / 0 ! 0 0 0 / as Рис. 10. Заполнение рабочей памяти после процедуры start. iier jO j/ lev opt 0 [71 G1 ГШ] ПШ г/ J -998 0.S 0 / 0 -2000 0.5 -2 fOOO 0 1 -1001 0.5 0 0 0 1 Рис, 11. Результат первой итерации.
80 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ workl дает Ю = 2 и запись рис. 12. Рис. 13 изображает состояние процесса после третьей итерации. tier JO Jl lev opt @00 WoJ\ \false\ base -5 2.5 3 2 0.5 -/ 0 1 a D 05 -2 0 0 1 -1007 0.5 0 -1000 0 1 as Рис. 12. Результат второй итерации. Her JO Jl lev opt [Л 171 G1 Г71 \false I base 1 -15 5 8 - 0 1 0 -If г г -2 1 0 0 1 -1003 1 1 -mo 0 0 as Рис. 13. Результат третьей итерации. При следующем обращении к new2 мы получим opt == = true и в действие вступает процедура fin2, которая выдает следующую информацию: 15 5 5 3 4 8 3 3 0 15 3 т. е. д- [1] = 5, »[1] = 3, х[4] = 8, о[2] = 0, значение мак- максимизируемой функции равно 15, и решение получено за 3 итерации. При решении серьезных практических задач симплекс- метод используется крайне редко; как правило, он фигу- фигурирует лишь в руководствах по линейному программи- программированию. Обычно в программах используются другие методы представления рабочей информации, два из которых мы рассмотрим ниже. б) Метод обратной матрицы (модифицирован- (модифицированный симплекс-метод). В этом методе запись состоит из неизменного задания исходных данных, задания базиса (например, как раньше, с помощью массива base), вектора
§ б. НЕКОТОРЫЕ ПРОГРАММЫ 81 значений базисных переменных x [Nr], вектора значений двойственных переменных v[\:tn], обратной матрицы а~ [Nr, M] и текущего значения целевой функции. Все эти данные удобно хранить в виде одной матрицы as [0 : т, 0 : т], где = c[N']xx[N'], as as as as [0, [1: [0, [1: 0] m, 1 : m, 0] m] 1 [ = а-[Т(\ :т), 1 :т]. Мы приведем здесь алгоритм, гарантированный от зацикливания. Для того чтобы избавиться от фиксирован- фиксированной системы задания исходных данных, будем считать, что определена процедура spos (/, р), которая по номеру / формирует р [0] : = — с [/] и р [1 : т] : = а [1 : т, /]. Например, если заданы массивы а[\:т, \:п] и с\\ :п] (как это было раньше), такой процедурой может быть procedure spos (у, р)\ value /; integer /; array p; begin integer i; p [0]: = — с [j]; for i: — \ step 1 until m do p[i]: = a[i, j] end spos В дальнейшем мы рассмотрим и другие варианты этой процедуры. Итак, выпишем метод обратной матрицы целиком: procedure LPsol2(m, n, gz, eps, spos, b); value m, n; integer m, n; real eps, gz; procedure spos; array b; begin integer iter, /0, /1; array as[0:tn, 0:m], p, q[Q:ni\; integer array base[l:m]; real lev; boolean opt; procedure start2; begin integer /, /; as[0, 0]: = 0; /1: *=iler: =0; for i: = l step 1 until m do begin as[i, 0]: = b[i]; as[0, 0]: = as[0, O]+gzxb[i]; for /': = 1 step 1 until m do as[i, /]:=0; as[i, г]:=1; as[0, i]: = — gz; base [i]: — n-^-i end i end start; procedure new3 (opt); boolean opt; begin integer i, j; real max, a\; /0: = /1; max: = 0; for /: = /l-fl step 1 until n, 1 step 1 until /1 — 1 do begin spos(j, p); al: = p[0];
82 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ for i: = 1 step 1 until m do a\: — a\ — p[i] xap[0, /]; if a\ ~>max then begin max: — a\; /0: = /; if max > lev then go to mk end; end /; lev: = max/2; if lev<.eps then lev:=eps; mk: opt: = max<Leps; /1: = /0 end ледо; procedure fm3; begin integer i, /; real al; for /: = 1 step 1 until m do p[t]: = O; for /: = 1 step 1 until m do begin if base[j]^n then begin spos (base [j], q); for i: — 1 step 1 until m do p [/]: —p[i]-\-q [i]xas [j, 0] end end; for i: = 1 step 1 until m do print {base [i], as [i, 0], p [i], b [i], as [0, i]) end /m; procedure worki; begin integer /, /, Ю; real al; boolean an; /fe/-: = t/er +1; un: = true; spos (/0, p); for t: = 0 step 1 until m do begin <7[/]: =0; for /: = 1 step 1 until m do [i] [i] [ ][] end; q[0]: q[]p[] for i: = \ step 1 until m do if q[i]>eps then begin if un then begin /0: = i; un: = false end else for /:=0 step 1 until m do if as[i, j]/q[i]<as[iO, j]/q[iO] then begin Ю: = i; go to mfet end else if os[i, j]/q[i]>as[i0, j]/q[iQ] then go to mki; mki: end i; if un then go to «nfto; base [i0]: = j0; ah = l/q[i0]; for /:=0 step 1 until m do as[/0, /]: = as[/0, /]xei; for г: = 0 step 1 until i0—l, iO+l step 1 until m do begin al: = q[i]; for /: = 0 step 1 until m do as [i, /]: = as [i, j] — al xas [iO, j] end
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 83 end work; g\ / ; star/2; mk\: new3(opt); if opt then go to mk2; worki; go to mkl; mk2: fin3; go to mk3; unbo: print (jO, as[0, /0]); /чпЗ; ткЪ: end LPsol Для дополнительных и искусственных переменных не нужно при использовании процедуры spos расширять матрицу а, соответствующие столбцы могут легко выраба- вырабатываться алгоритмически. Вот, например, как выглядит эта процедура для случая, когда все т ограничений являются неравенствами и вводится т дополнительных переменных: procedure spos2 (/, р); value /; integer /; array p; begin integer t; if j^n then spos (/, p) else begin for i: = 0 step 1 until m do p[t]:=O; p[j — n]: = \ end end spos Посмотрим теперь, как будет выглядеть решение при- примера с помощью процедуры LP sol2. Постоянная часть записи изображена на рис. 14, изменяющаяся часть —на рис. 15. Мы внесли в запись данные, получающиеся после дей- действий процедуры starts. После действия процедуры new3, которая полностью аналогична new2, с той лишь разни- разницей, что столбцы матрицы а последовательно выписы- выписываются в массив р и оценки, которые в LP soil были записаны в as [0, N], теперь вычисляются умножением as[0, M]xp[M], мы получаем /0 = 2 и op/ = false. В про- процедуре workU снова восстанавливается в массиве р стол- столбец а\М, /0], который затем умножается на матрицу as[l : т, 1 : т] с записью результата в q[0 : т]. Получаем р 2;2|0 q 20021210 После перехода к метке mk\ получаем состояние, изобра- изображенное на рис. 16, и т. д.
84 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Читателю рекомендуется довести до конца вычисле- вычисления и сравнить получающиеся таблицы с записями в ре- решении этого примера с процедурой LPsoll. т п ffz Eps \Z\ ffl \W00\ ШГ b 5 3 f -f a Z 0 1 -2 0 f -3 -2 с -1 0 Рис. И. Исходные данные для метода обратной матрицы. iter jO jt lea opt [7} ? \T\ \Ш\ Q base BOOU 5 3 mo f 0 /000 0 f as Рис. 15. Заполнение рабочей памяти в методе обрат- обратной матрицы после процедуры start. as 3995 2.S 3 -/ 0.5 0 WOO 0 1 Рис. 16. Рабочая информация метода обратной матрицы. Достоинства модифицированного симплекс-метода ста- становятся яснее в тех случаях, когда удается более ком- компактно представить исходные данные задачи. Одним из наиболее характерных способов компактной записи является запись ненулевых элементов матрицы, кото- которых в реальных задачах часто оказывается гораздо меньше, чем нулей. Такую запись мы уже встречали в § 3 гл. 1.
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 85 При таком задании данных процедура spos может быть написана следующим образом: procedure sposS (/, р); value /; integer /; array p; begin integer i; for t: = 0 step 1 until m do p[i]:~0; for i: = lst[j-l]+l step 1 until lst[j] do p[ind[i]]:=ad[i]; p[0j: = -p[0] end spos в) Мультипликативный метод. Правильное название этого метода — метод последовательных улучше- улучшений с мультипликативным представлением обратной мат- матрицы. В нем матрица ar[N'k, M] на k-и итерации пред- представляется в виде произведения матриц dt[N't, N[—\] (здесь N\ — базис г'-й итерации) a~[N'k, M] = dk[N'k, M'k_l]x...xd1[N[, M). E0) Для того чтобы вычислить произведение cr[N'k, М\ х Ь[М], нужно последовательно умножить Ь[М] на dlt d2 и т. д. Матрица dt задается номером столбца rh отличного от единичного, и самим этим столбцом dtn[\ : m]. Для того чтобы умножить вектор х [1 : т] на dt, нужно просто выполнить оператор x[l :m]: = x[l : m]-\-x[ri] x dm [1 : т]. E1) Аналогично, для того чтобы вычислить произведение c[N'k] х a' [N'k, M\, нужно последовательно умножить с [N1/,] на dk, dk_ i и т. д. А для того чтобы умножить х [1 : т\ на dit нужно изменить лишь компоненту x[rt] х [/-,]: = х [1 :т] х dm [I :m]. E2) Для изменения информации об обратной матрице тоже не требуется тяжелых операций —достаточно к списку «мультипликаторов» dt добавить в конце (&+1)-й. Итак, в простейшем варианте мультипликативного метода запись состоит из задания базиса (base), вектора значений базисных переменных x[N'\, вектора значений
86 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ двойственных переменных v[l:m], текущего значения линейной формы у, числа итераций iter и, наконец, инфор- информации об обратной матрице — числа мультипликаторов пт\ и списка из пт\ мультипликаторов. Каждый элемент этого списка состоит из номера столбца rt и из инфор- информации о столбце. Обычно в мультипликаторах оказы- оказывается сравнительно немного ненулевых элементов, поэтому столбцы мультипликаторов хранятся в сжатой форме. Представление мультипликаторов, потребность в дополнительной информации, возможность хранения пар из индекса и элемента столбца — все это существенно зависит от вычислительной машины, выбранного алго- алгоритмического языка и от транслятора, поэтому в детали использования внешней памяти мы здесь входить не будем. Для полноты описания в приводимой" ниже процедуре мультипликаторы будут храниться в двух массивах в оперативной памяти array va [ 1 : пmax]; integer array nom[\ : nmax], где п max — задаваемый при обращении к процедуре размер. Описанный простейший вариант алгоритма недоста- недостаточно эффективен при большом числе интераций, а при хранении информации в оперативной помяти даже и нереализуем, так как число записей в массивы va и пот (равное пт~ 1) может превысить птах. Чтобы уменьшить информацию и упростить вычисления, используют так называемое «повторение» — в процедуре work после нахож- нахождения переменной, удаляемой из базиса, выполняется оператор if пт < птах — т then inclmult (nm, /О, q) else repetition Повторение (repetition) заключается в том, что базис текущей итерации получается заново из первоначального базиса по кратчайшему пути (т. е. не больше чем за т последовательных замен). При этом не производится промежуточный контроль неотрицательности x[N'], а очередной вектор, вводимый в базис, умножается на обратную матрицу, из него делается мультипликатор, определяется переменная, выводимая из базиса, и мульти- мультипликатор записывается в список:
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 87 procedure repetition; begin integer i, k, bk; real max; integer array bs [1 : m\; ntn\: = 0; nm: = 1; max = 0; for k: = 1 step 1 until m do begin bs [k]: = base [k]; base [k]: = 0 end; for k: = 1 step 1 until m do begin spos(bs[k], p); Ihmult (p, nm—1); for i: = k step 1 until m do if base [i] = 0/\abs(p[i])>max then begin max: = abs (p [i]); bk: = i end; base [bk\:—bs [k]; inclmult (nm, i, p); v[k]: — p[0]; end k; for i: = 1 step 1 until m do x[i]: = b[i]; Ihmult (x, nm— 1) end rep Мультипликативный метод наиболее распространен в эффективных программах по линейному программиро- программированию. Имеются различные варианты процедуры повторе- повторения, обеспечивающие более компактное и экономное зада- задание информации об обратной матрице после повторения. Литературу по этому вопросу читатель может найти в библиографических указаниях. Приведем здесь простейший вариант мультипликатив- мультипликативного метода, в котором двойственные переменные и значе- значение базисных переменных находятся последовательным пересчетом и используется простейшая процедура повто- ния. Кроме процедуры spos, исходные данные использует процедура-функция scpr (/, р), вырабатывающая скалярное произведение а [0 : т, /] на вектор р[0:т], где р[0] = 1. procedure LP so/3(m, n, gz, eps\, eps, птах, b, spos, scpr); value n, m, nmax; real gz, epsl, eps; procedure spos; integer n, m, nmax; array b; real procedure scpr; begin integer inter, /0, /1, nm, nm\; real lev, cost, max; integer array base[\ : m], nom[l : nmax]; array p, x, v [0 : m], va [1 : nmax]; procedure startS; begin integer t; inter: = 0; nm: — \; cos/: = 0; for t: = l step 1 until m do begin x[i]: = b[i]; v[i]:=gz; cost: = cost + b[i] x gz; baze[i]: = n-\-i end; end start;
«» ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ procedure inclmult (ft, r, p)\ value л; integer ft, r; array p; begin integer i; real x; va[k]: = r; nm\: = «ml + 1: for t: = 1 step 1 until m do if abs (p [i]) > eps then begin nom[r]: = i; va[r]: = — p[i]/x; r: = r-\-\ end; nom[k]: = — r; k: = r end; procedure Ihmult (p, ft); integer ft; array p; begin integer i, j, s, si; real л;; sl: = l; for t: = l step 1 until ft do if nom[i]<cO then begin *:=p[wa[i]]; p[va[i]]: = 0 end else p [nom [i]]: = p [nom [i]j + л: х ua [i] end; procedure rhmult (p, ft); integer ft; array p; begin integer i, /, s; real x; s: = — ft—1; x:=0; for f: = ft step —1 until 1 do if s = nom [i] then begin p [ua [7]]: = x; x: = 0; s: = — i end else x: = x + p [nom [i]] x ya [i] end; boolean procedure newA; begin integer i, j; real al; /0: = /1; max: = 0; for /: = 1 step 1 until m do Р[/]: = у[/]; rhmult (p, ш- 1); for /: = /l + l step 1 until n, 1 step 1 until /1 — 1 do begin a\: = — scpr{j, p); if a\>max then begin max\ — a\; /0:=/; if max 52 /ey then go to mft end end /; lev: = max/2; if lev<.epsl then lev: = eps: mft: яешЗ: = max^sepsl; /1: = Ю end пеш; procedure workS; begin integer t, Ю; real al, a% boolean un; spos(jO, p); Hrt: = true; Ihmult (p, nm—\); for i: = 1 step 1 until m do if p [t] > esp then begin if un then begin Ю: = t; н/г: = false end else if x[t]/p[i]<x|70]/p[t0] then tO: = i; /nftt: end t; f[tO]: = p[O]; if ыя then go to unbo; base [Ю]: = jO; al:=x[i0]/p[i0]; a2:=0;
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 89 for i: — 1 step 1 until m do x[i]: = x[i] — al*p[i]; x[iO]:=al; if nm<Lnmax then begin inclmult (ntn, iO, p) end else repetition. end work; procedure [in3; begin integer i, j; real a\; array 9, p[0:m]; for i: = 1 step 1 until m do <7[i]:=0; al: = 0; for t: = 1 step 1 until tn do begin if base[i]>n then p[0]:=gz else spos (base [i], p); al: = al-p[0] x x[ij; for /: = 1 step 1 until m do <?[/l: = <7 [/] + *['! x p[/] end t; for t: = 1 step 1 until m do printer, i, base[i], x[i], q[i], b[i], v[i]); print (iter, al) end fin; lev:=gz; /1: = 1; nml: = 0; start3; for iter: — iter +1 while пш4 do даогйЗ; comment вместо меток цикл while!; go to mk3; unbo: print ('unbounded solution'); mk3: finZ end LP sol В настоящее время начали распространяться другие методы представления информации о базисной матрице, которые в чистом виде или в комбинации с другими методами дают весьма эффективные разновидности метода последовательных улучшений. Так, большое распростра- распространение получает так называемое Ш-представление. Известно, что любая неособенная матрица а[\:т, 1 : т] может быть представлена в виде произведения a[l:m, l:m] = L[l:m, I : т] х U [I : т, 1 : т], E3) где L — нижнетреугольная, а U — верхнетреугольная мат- матрица. Вместо того чтобы решать систему а[\:т, \:т\х х[\:т\ = Ь[\ :т], E4) можно последовательно решить систему L[\ :m, l:m] х г[1 :т] = 6[1 \т] E5)
90 ГЛ 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ и систему m, l:m]xx[l:m] = z[l:m]. E6) Решение систем с треугольной матрицей труда не пред- представляет — такие системы решаются последовательным вычислением и подстановкой" переменных. При изменениях базисной матрицы может использоваться алгоритм под- поддержания ^-представления, в детали которого мы здесь входить не будем, или может использоваться сочетание ZiZ-представления с мультипликативным накоплением поправок. Отметим, что при LU-представлении обе треугольные матрицы оказываются редкозаполненными и для их хра- хранения используется техника компактной записи матриц, уже встречавшаяся нам выше. Предлагалось также в качестве одного из способов так называемое LP-представление базисной матрицы а[\:т, \ : tri\ = L[\ : т, I : т]хР[\ : т, 1 : т], E7) где L — треугольная матрица, а Р — ортонормированная. В библиографических указаниях приведены соответствую- соответствующие ссылки на подробные изложения этого подхода. Значительного повышения эффективности вычисли- вычислительных процедур можно добиться, ограничиваясь матри- матрицами какой-либо определенной структуры. Так, например, предположим, что в задаче C2) — C4) заданы разбиения множеств индексов М = М0 + Мг+...+Мк, N = N0 + Nl+...+Nk E8) и при этом а[М,, N,] = 0[Mi, M/] для /=^0, \Ф1, E9) т. е. матрицу ограничений можно схематически предста- представить рис. 17. Такая задача линейного программирования- обычно называется блочной. Блочная задача линейного программиро- программирования. Минимизировать c[N]xx[N] при условиях \N]0[N] а[М0, N]x а[М„ Nl]xx[Ni] =
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 91 Легко видеть, что в этой задаче базисную матрицу можно представить в виде рис. 18, где \N'i: = \M,\, N't czNh iel: ft. F0) Для решения систем с такой матрицей достаточно иметь обратные матрицы «блоков» al[N'i, Mi] и некоторую мат- матрицу flo[/V\ Мо]. Особенно просто выглядит решение такой задачи, когда каждый из блоков состоит из одного ограничения («узко- («узкоблочная задача»). In "г "з Рис. 17. Матрица ограничений блоч- блочной задачи. ¦ i i i ш p "г мз N' ш ш шш. Ш ш У//Л й щ 1 i Рис. 18. Базисная мат- матрица блочной задачи. Другие специализированные задачи линейного про- программирования мы рассмотрим в следующей главе. г) Генерирование столбцов в методе по- последовательных улучшений. Как мы уже видели, в методе обратной матрицы и в его более мощных вычис- вычислительных вариантах не имеет значения, как задана матрица ограничений задачи. Важно лишь, чтобы по номеру столбца можно было этот столбец восстановить. Оказывается, что от задания матрицы ограничений можно потребовать еще меньшего. Действительно, если посмотреть внимательно, где в методе последовательного улучшения используется матрица ограничений, то легко увидеть, что она появляется только при проверке допу- допустимости двойственных переменных у[М], полученных из уравнений C8), v[M]xa[M, N]^c[N] F1) или c[j]-v[M]xa[M, /]5s0, jc=N F2) можно, очевидно, заменить решением экстремальной задачи.
92 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Вспомогательная экстремальная задача. | Найти максимум о[УИ]ха[М, j] — c[j] no j<=N. Если этот максимум оказывается больше 0, то /0, на котором достигается этот максимум, и должно вводиться в базис (причем тут важен не сам индекс, а соответст- соответствующий ему столбец а[М, /]). Если же максимум равен О, то имеющееся базисное решение оптимально. Таким образом, если мы умеем решать вспомогательную экстремальную задачу, не используя матрицу а[М, N], то больше эта матрица нам нигде не понадобится. Рассмотрим, например, следующую задачу. Задача линейного ассортиментного рас- раскроя. Задано положительное вещественное число /0 и поло- положительный вектор [1:т]. Пусть N — множество цело- целочисленных векторов г[\ :т], удовлетворяющих условиям /[1 :m]xr[l :m]</0, r[\ : m]saO[l : m]. F3) Требуется найти вектор x[N]^0[N], удовлетворяю- удовлетворяющий условию vreA,r[l \m)xx[r] = b[\ : m] и минимизирующий Вспомогательная экстремальная задача, служащая в данном случае для проверки оптимальности текущего базисного решения, выглядит в данном случае следующим образом. Задача о наивыгоднейшем раскрое. Найти целочисленный неотрицательный вектор г[\:т], удовлетворяющий условию F3) и максимизи- максимизирующий v [ 1 : т] х г [ 1 : т] — 1. Методы решения этой задачи будут рассматриваться в пятой и шестой главах. В качестве вспомогательной экстремальной задачи может фигурировать снова задача линейного программи- программирования. Например, если рассматривается задача блочной структуры E9), то для нее можно предложить вариант алгоритма, при котором размеры задачи будут значительно
§ 6. НЕКОТОРЫЕ ПРОГРАММЫ 93 меньше. Действительно, предположим для простоты, что каждое из множеств решений систем a[MhN,]xx[N,] = b[Mi], x[Ni]^0[Ni], le=l:k, F4) ограничено. По теореме 7 каждое решение F4) может быть представлено в виде x[Nt] = d[Nh R,]xl[Ril F5) где K[Ri] — вероятностный вектор, a d[Nit г]—крайние точки множества допустимых решений. Условия нашей задачи линейного программирования можно заменить эквивалентной задачей. Преобразованная блочная задача. Минимизировать с [No] х х [No] + V,- е,. к (с [N,] X d [Nh Rt]) X К [/?,] F6) при условиях iel:ft, F7) \, ie=\:k, F8) a[M0, N0]xx[N0] + + Ьб1:*(о[Мо, Ni]xd[Nh /?;])х^[/?,] = b[Mo]. F9) Двойственной к ней является задача: Найти векторы v[M0] и ul[l:fe], удовлетворяющие условиям v[M0]xa[M0, N0]^c[N0], G0) d[yVb r]), re/?,, iel:fe G1) и максимизирующие t;[iW0]x6[M0]xwl[l :m]xl[l :m]. G2) Для проверки оптимальности базисного решения пре- преобразованной блочной задачи, кроме проверки условий G0), которая проводится обычным образом, нужно решать k экстремальных задач вида Задача i-ro блока. Найти г е Ri, на котором достигается минимум (c[N,]~v[M0]xa[M0, N,])xd[Nit r] + ol[i]. G3)
94 ГЛ. 2. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ Так как метод последовательных улучшений дает наи- наилучшую из крайних точек, то для решения этой задачи может использоваться решение этим методом следующей задачи линейного программирования. Локальная линейная задача. Найти вектор х [/V,], удовлетворяющий условию F4) и минимизирующий (c[N,]-v[M0]xa[M0, JV;])x*|W/] + al[i]- G4) В этом случае, если в какой-либо из этих задач мини- минимум оказывается положительным, то из соответствующего решения х* [N{] формируется вектор g[M0|Jl -k], где = a[M0, Nt]xx* который и вводится в базис. Такой метод решения блочной задачи называется мето- методом разложения Данцига — Вулфа. Метод генерирования столбцов имеет много чрезвычайно разнообразных применений. Именно благодаря идее гене- генерирования в настоящее время практически размеры задач линейного программирования ограничиваются лишь чис- числом ограничений задачи, а число переменных большой роли не играет.
ГЛАВА 3 ТРАНСПОРТНАЯ ЗАДАЧА § 1. Основные определения теории графов В этой главе мы приступаем к важнейшей проблематике книги — к теории оптимальных потоков в сетях. Для того чтобы определить сами сети и потоки, воспользуемся ши- широко распространившейся сейчас терминологией теории графов, которая в основном будет введена (с необходимыми фактами теоретического и вычислительного характера) в первых трех параграфах. Только после этого мы приступим к описанию потоков на графах, изучению их свойств, постановке и решению экстремальных задач для потоков. Транспортные задачи могут рассматриваться как задачи линейного программирования со специальными матрицами ограничений (как раз так мы их и рассматриваем). Построен- Построенные для них специальные методы допускают обобщение на несколько более широкие задачи. В конце главы будет рас- рассмотрена одна из таких задач. Но ближайшая наша цель — определения. Графом мы будем называть тройку (М, N, Т), где М и N конечные множества, а Т — отображение Т: N -» -> М X М. Элементы М называются вершинами графа, элементы N — дугами графа. Отображение Т сопоставляет каждой дуге beJV упо- упорядоченную 'пару вершин (i (и), / («)). Первая называется началом дуги и, а вторая — концом дуги и. Иногда для обеих вершин вместе используется термин «граничные вер- вершины 1)». ') Используется также название «конечный ориентированный муль- тиграф» — первое слово добавляется, чтобы подчеркнуть конечность множеств М и N, второе, чтобы указать на различие, которое делается между граничными вершинами графа, «мульти-» отражает возможность нескольких дуг с одинаковыми началом и концом. В последнее время Распространился также неудачный с нашей точки зрения термин «оро- граф».
96 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Граф может быть изображен рисунком (от этого и про- произошло его название), на котором вершинам соответствуют точки, а дугам — линии со стрелками, идущие от начал к концам. Рис. 19. Рис. 20. Рис. 21. Примеры. 1. Пусть М = 1 : б, N = {а, Ь, с, d, e, f, g, h, i}, Та =A,3), ГЬ=D, 5), Гс=B, I), Td =B, 4), Те =A,3), Tf =D,3), Tg=E, 1), 7Л = A,4), 7i = C,1). Этот граф может быть изображен рис. 19 или эквива- эквивалентным ему рис. 20.
§ 2. СПОСОБЫ ЗАДАНИЯ ГРАФА 97 2. М = 1 : т, N = 1 : 2 х т — 3, Ти = (и, и + I) для uel:m — 1 и Ти — (и — m + 3, и — m 4- 1) для aem:2 x m — 3. При m = 6 этот граф изображается на рис. 21. 3. М = К U L (Я П L = ф), N = К х L, T(i, /) = = (г, /). Вершины этого графа разбиты на два непересе- непересекающихся подмножества, и дуги идут из любой вершины первого подмножества К в любую вершину второго под- подмножества L. Нарисовать этот граф предоставляется чита- читателю. Часто приходится рассматривать графы, в которых в сравнении с исходным уменьшены множества дуг и вершин. Граф (М, N', Т), где N'—подмножество N, назы- называется частичным графом графа (М, N, Т). Таким образом, частичный граф — это граф, получающийся из исходного после удаления некоторых дуг. Граф (М1, N (М'), Т), где М' — подмножество М, а Л/ (М') = {и е Л', i (и), j (и) е М'}, называется под- подграфом графа (М, N, Т) Подграф получается из исход- исходного графа удалением некоторых вершин и всех дуг, для которых удаленные вершины являются граничными. Частичный подграф определяется как частичный граф некоторого подграфа. Если при использовании этих определений нам потре- потребуется подчеркнуть, что имеются в виду собственные под- подмножества, мы будем к соответствующему определению добавлять слово «собственный». Множество дуг, выходящих из вершины i, мы будем обозначать через NT', множество дуг, входящих в i, — через Nf. Очевидно, что каждый из наборов {Л^}/ем и {N;}i<=M образует разбиение N. Если i является граничной вершиной и, говорят, что i и и инцидентны (incident — свойственный, присущий). § 2. Способы задания графа Очень редко граф можно задать правилом формирова- формирования дуг и граничных вершин данной дуги, как это делалось в примере 2. Основным способом задания графа следует считать спи- списковый, в котором составляется список дуг, и запись о каж- 4 И. В. Романовский
98 ГЛ 3. ТРАНСПОРТНАЯ ЗАДАЧА дой дуге состоит из названия дуги, названия ее начала и названия ее конца. Так, в примере 1 мы задавали граф именно таким спи- списком: (а,\, 3) (Ь,4, 5) и т. д. Остальные методы являются лишь более удобными с тех или иных точек зрения вариан- вариантами этого основного метода. Во многих случаях для теоретических рассмотрений граф удобно задавать матрицей. Матрица а \М, N\, в ко- которой строки соответствуют вершинам графа, а столбцы дугам, называется матрицей инциденций г). Элементы ма- матрицы иициденций задаются правилом: a U (и), и] ~ —1, a lj (и), и] = 1, остальные элементы равны 0. Для примера 1 получаем табл. 1. Таблица 1 1 2 з- 4 5 6 Легко видеть, насколько неэкономно использовать дл задания графа матрицу инциденций. Однако она полезж. при рассмотрении систем уравнений (и неравенств), опре- определяемых графом. Отметим, что ранг этой матрицы всегда меньше | М | — числа элементов М. (Одна линейная зави- зависимость между строками матрицы очевидна — сумма строк равна 0.) От чего зависит ранг матрицы инциденций и чему он равен, мы установим ниже. Имеется другой способ матричного задания графа, ис- используемый в тех случаях, когда не требуется различать дуги с одними и теми же началами и концами, а достаточно только знать их общее количество. Реализующая этот спо- способ матрица смежностей г [М, М] — это неотрицательная целочисленная матрица, в которой г И, /] = | Ni П Щ I. а j 0 1 0 0 0 b 0 0 0 — 1 1 0 t 1 1 0 0 0 0 d 0 1 0 1 0 0 e —1 0 1 0 0 0 / 0 0 1 —1 0 0 я 1 0 0 0 —1 0 h j 0 0 1 0 0 1 1 0 —1 0 0 0 ;) При рассмотрении матрицы иициденций предполагается, что граф не имеет петель, т. е. дуг, у которых начало совпадает с концом.
0 1 1 0 1 0 0 0 0 0 0 0 2 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 § 2 СПОСОБЫ ЗАДАНИЯ ГРАФА 99 В примере 1 матрица г 11 : 6, 1:6] такова (табл. 2). Матрица смежностей использу- Таблица 2 ется сравнительно редко даже в 12 3 4 5 6 теоретических рассмотрениях. Чаще всего используется то или j иное списковое задание графа. Упо- 2 минавшееся уже задание графа трои- 3 ками фактически является разно- 4 видностью сжатого задания матри- 5 цы инциденций. Эта форма пред- „ ставления графа удобна тем, что позволяет быстро изменять информа- информацию о графе, добавлять в информации о дугах нужное число числовых характеристик, организовывать вычислительный процесс, используя последовательный просмотр дуг (что во многих случаях оказывается очень удобным). Однако это представление имеет два недостатка, которые в некоторых задачах оказываются существенными: во-первых, оно не содержит всей информации о графе, например, потому, что в нем не фигурируют изолированные вершины, т. е. вер- вершины, которым не инцидентна ни одна дуга, во-вторых, информация может быть задана проще, если рассматривае- рассматриваемый в задаче граф не придется часто изменять. Свободный от этих недостатков способ может рассма- рассматриваться как вариант сжатого задания матрицы смежно- смежностей. Мы можем задать граф в виде списка вершин, причем в записи о каждой вершине будет присутствовать как ин- информация о самой вершине, так и информация об исходя- исходящих из этой вершины дугах. Информация о дугах пред- представляет собой также список, в котором каждой дуге соот- соответствует запись, включающая информацию о конце дуги и необходимые числовые характеристики самой дуги Реализация этих способов в вычислительной машине существенно зависит от используемых вычислительных возможностей. В случае, если используется достаточно простой алгоритмический язык, типа алгол-60,1 второй способ задания графа можно реализовать с помощью тех же методов, которыми задаются в машине редко заполненные матрицы. Дуги нумеруются числами от 1 до п = | N |, а вершины — числами от 1 до т = \ М | таким образом, чтобы дуги, выходящие из г'-й вершины, предшествовали в этой нумерации дугам, выходящим из /-й вершины при 4*
100 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА i <С ]. Далее вводится целочисленный массив / [1 : и], иг- играющий ту же роль, что и массив ind. Наконец, с помощью массива 1st [0 : т] производится разметка массива /II : п], именно, 1st U] указывает место в / [1 : «], где кончается информация о Ni. Необходимая числовая информация о ду- дугах и вершинах может при этом задаваться с помощью отдельных массивов необходимой размерности. В примере 1 нумерация вершин уже имеется. Если пере- перенумеровать дуги в следующем порядке: a, h, i, с, d, e, f, b, g, то граф этого примера будет задаваться массивами /: 3, 4, 3, 1, 4, 1, 3, 5, 1, 1st : 0, 3, 5, 6, 8, 9, 9 Отметим, что так как N~6 = ф, то 1st 16] = 1st 15]. При использовании алгола-68 можно ввести специаль- специальные структурные виды, описывающие дуги и вершины, и необходимые связи между дугами и вершинами задавать с помощью ссылок. Например, для первого способа задания графа мы можем ввести виды mode vert = struct (...) для вершин и для дуг mode arc = struct (ref vert i, j, ...) где i и / будут ссылками на начало и конец данной дуги. Для второго способа задания можно ввести виды mode vert = struct (ref arc list, ...) для вершин, а для дуг mode arc = struct (ref arc next, ref vert /, ...) причем для каждой вершины ссылка list будет указывать на начало цепного списка, перечисляющего Ni. Этот спи- список будет организовываться с помощью ссылок next. Многоточие во всех этих описаниях обозначает место, оставляемое для числовых характеристик объекта. § 3. Связность Продолжим рассмотрение основных определений и фак- фактов теории графов В тех случаях, когда отображение Т в задании графа (М, N, Т) остается одним и тем же, будем для краткости обозначать граф просто через (М, N).
§ 3. СВЯЗНОСТЬ 101 Пусть заданы какая-то последовательность вершин ilti2,..., ift+i графа (М, N) и последовательность нь иг,..., uk его дуг. Будем называть эту пару последовательностей путем, если для любого / е 1 : k выполняются равенства ц = i («/), гм = / (и,). A) Вершина i1 называется началом пути, вершина iA+1 — концом пути, число k называется звенностыо пути. Путь, у которого начало и конец совпадают, называется замкну- замкнутым. Рассмотрим замкнутый путь, у которого все вершины различны (здесь начало и конец мы считаем одной верши- вершиной). Пусть ЛГ — множество его вершин, /V" — множество его дуг. Мы будем называть частичные подграфы (ЛГ, ЛГ) такого типа контурами. Целесообразно, однако, определять контур по-другому. Частичный подграф (ЛГ, ЛГ) назы- называется контуром, если: Г | ЛГ | = | ЛГ |. 2° Для каждого i gAI' справедливо | N'f \ = \ Nl1 \ = = 1, т. е. в каждую вершину одна дуга входит и одна выходит. 3° Никакой собственный подграф (ЛГ, /V') этими двумя свойствами не обладает. Предложение 1. Вершины и дуги контура можно перенумеровать так, чтобы они образовывали замкнутый путь Доказательство, Выберем произвольно вер- вершину из М', назовем ее iv В N' (по свойству 2°) имеется единственная дуга, выходящая из jlt назовем ее иъ а ее конец i2. Либо t2 совпадает с началом пути, либо имеется дуга, выходящая из ц. Назовем ее и2, а ее конец i3 и т. д. Так как на каждом шаге этого процесса появляется новая вершина (конец ранее не встречавшейся дуги), на некотором /-м шаге конец пути совпадает с началом. При этом мно- множества встретившихся вершин и дуг будут, очевидно, обладать свойствами 1° и 2° из определения контура, а зна- значит, в силу 3° совпадают сМ'и N'. А В духе определения контура можно ввести еще несколько полезных для дальнейшего понятий. Частичный подграф (ЛГ, N') называется циклом, если: 1° |ЛГ |= |ЛГ |. .
•02 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА 2° Для каждого i е М' справедливо | N'f \ -f | М'с+ ] = = 2, т. е. каждой вершине инцидентно ровно две дуги. 3° Никакой собственный подграф (M't N') этими двумя свойствами не обладает. Контур — это цикл, в котором можно обойти все дуги, двигаясь по каждой от ее начала к ее концу. В произвольном цикле также можно обойти все дуги, но по некоторым дугам придется идти от конца к началу. Дуги первого типа мы будем называть положительно ориентированными, дуги второго типа •— отрицательно ориентированными. Предложение 2. Вершины и дуги цикла можно перенумеровать так, чтобы для любой дуги и{ выполнялось (k = i (Щ) Л k+i = 1 М) V (ii = 1 (Щ) Л »/+i = i ("/)) B) (при выполнении первой альтернативы дуга положительно ориентирована, а при выполнении второй — отрицательно ориентирована). Доказательство является простым вариантом предыдущего. Частичный граф (М', N') называется цепью, если: Г | М' | - | N' | + 1. 2° Существуют такие I, ] е М', что 2 для остальных i e M'. 3° Никакой собственный подграф (М', А/') не является циклом. Такую цепь называют также цепью, соединяющей I и ;'. Предложение 3. Вершины и дуги цепи можно перенумеровать так, чтобы они обладали свойством B), и при этом I было первой вершиной, а ] — последней. С точки зрения этих определений цикл — это замкну- замкнутая цепь На рис. 22 приводятся примеры введенных объ- объектов. Граф (М, N) называется связным, если любые две его вершины можно соединить цепью. Естественно, что граф, сам являющийся цепью, связен. Однако, как это видно на примере графа, являющегося циклом, иногда можно обеспечить связность графа за счет меньшего числа дуг. В цепи без нарушения связности нельзя удалить ни одной дуги, и в этом смысле цепь минимальна.
5 3. СВЯЗНОСТЬ ЮЗ Представляет интерес нахождение такого рода минималь- минимальных связных частичных графов в произвольных графах. Теорема 1. Пусть (М, N) — связный граф. Най- Найдется такое множество дуг N' a N, что | N' I = I М I — 1 Контур Цикл Цепь и граф (М, N') связен. При этом каждой вершине i e M и каждой дуге и е N' можно присвоить номера т (i) и п (и) таким образом, что для любой дуги и п (и) = max {m (i (и)), т (/ (и))} C) и различным вершинам (дугам) будут соответствовать раз- различные номера. Доказательство. Мы будем строить последо- последовательность связных частичных подграфов (Mr, N'), в ко- которых | М' | = | N' | + 1. В каждом таком графе все вершины и дуги будут перенумерованы в соответствий с требованиями теоремы. В качестве исходного возьмем граф ({/„}, ф), где t0 — любая вершина. Присвоим ей номер 0. Пусть теперь мы имеем некий связный собственный частичный подграф <М', N') и выполняются все требуемые условия. Пусть / е М \ М'. Ввиду связности (М, N) существует цепь, соединяющая i0 и /. Перенумеруем ее дуги и вершины, начиная от г0: hi li> •••> ls> ls+i ~ ] (эта временная нумерация не имеет ничего общего с той, о которой говорится в формулировке теоремы). Так как г-о е /И', / ф М', то найдется наименьшее k, для которого ik е М', ik+x ф М'. Положим М' :=Л1' + 4+1; N':=N' + ub; т (»*tl) : = п (uk) : = | N' |.
104 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Получившийся граф связен, так как it,+l соединяется с лю- любой вершиной цепью, состоящей из цепи от этой вершины до ik и из дуги ик, а прочие вершины и без того связаны. Так как добавлены одна вершина и одна дуга, количест- количественное соотношение между | М' | и М' \ сохранено. Про- Процесс повторяется до совпадения М' с М. А Следствие 1. В связном графе число дуг не меньше числа вершин без единицы. Следствие 2. Ранг матрицы инциденций связного графа (М, N) равен \ М | — 1. Доказательство. Построим множество N', о ко- котором говорится в теореме. Пусть k = \ М | — 1. Рас- Рассмотрим матрицу а [М — i0, N'] Построенная в теореме нумерация переводит множества индексов этой матрицы в множество 1 : k, и матрицу можно рассматривать как матрицу а И : k, I : k]. По свойствам нумерации I a U, г] | = 1, a [i, /] = 0 при i > /. Следовательно, ранг а [ 1 : k, I : k] (и а \М, /VI) не меньше k. А как уже отмечалось выше, больше чем k он быть не может А Отметим, что каждый минор матрицы инциденций ра- равен 0, 1 или —1 (если в каждом столбце минора два нену- ненулевых элемента, он равен 0, а в остальных случаях его можно разложить по элементам какого-либо столбца и воспользоваться индукцией). Следствие 2 интересно тем, что связывается чисто алге- алгебраическое свойство матрицы с наглядным геометрическим понятием. В произвольном графе все вершины и дуги разбиваются на компоненты связности — максимальные связные под- подграфы (т. е. на такие подграфы, в которых множество вер- вершин не может быть увеличено без нарушения связности). Предложение 4. Пусть i e M, Mt — множество вершин, которые можно соединить с i цепью. Подграф (Mi, N (Mi)} является компонентой связности Доказательство. Нам нужно доказать, что этот подграф связен и что добавление к нему какой-либо вершины с сохранением связности невозможно Пусть I, |еЛ1;И отличны от i Существуют цепи, соединяющие i с / и с /. Перенумеровав их, получим (выписывая только вершины) 'l = '> ^2^ 'з> ¦¦> 'i == '> /l = 1> h, /З // = /•
§ 3. СВЯЗНОСТЬ 105- Пусть г — наибольший номер вершины из второй цепи, содержащейся в первой цепи. Пусть р — номер этой вер- вершины в первой цепи. Цепь I = is. h-Ъ •••> ip — jr, jr+l, ...,//=/ соединяет вершины / и / (рис. 23). Остается показать, что (М,, N (Mi)) — максимальный связный подграф. Но это следует из того, что Мг содер- содержит все вершины, которые можно связать с i, — добав- добавление новых вершин нарушило бы связность из-за отсут- отсутствия цепей, соединяющих их с i. А Легко видеть, что если (Mi, Nt) — компонента связ- связности, то аШ\ Mh Nt] = 0 \М \ Mi, Nt\, а \М,, N\Nt] = 0 [Mh N \ Nt]. Отсюда и из следствия 2 без труда получаем следующее утверждение. Предложение 5. Ранг матрицы инциденций ра- равен \ М | — р, где'р — число компонент связности графа. Предложение 6. Пусть р — число компонент связности графа (М, N). Если | N | > | М | — р, то в графе й содерокится цикл. i Доказательство. "-- ' Найдется компонента связно- связности (Ма, Na), ДЛЯ КОТОрОЙ I #а | > | Л*в | — 1. По теоре- Рис 23. ме 1 можно построить связный частичный граф (Ма, N') графа (Ма, Na), для которого I N' | = | Ма | — 1. Следовательно, существует ие Л^а\ Л''. Вершины i (и) и / (и) можно соединить цепью из дуг, лежа- лежащих в N'. Дополнив эту цепь дугой и, мы получим цикл. А В дальнейшем мы, как правило, будем заниматься связ- связными графами. В некоторых случаях используются более сильные определения связности, в которых требуется су- существование путей, соединяющих вершины. Одно такое определение понадобится в следующем параграфе. Граф называется вполне связным, если для любых двух его вершин i и / найдется путь, ведущий из i в /. Пример 4. Пусть М -¦¦ множество утверждений, N — множество заключений о том, что одно из утверждений
IP6 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА следует из другого. Для того чтобы установить эквивалент- эквивалентность всех утверждений из М, необходимо, чтобы граф (М, N) был связным. Теорема 2, которую нам предстоит доказать в § 4, как раз и утверждает эквивалентность шести различных утверж- утверждений. В гл. 6 и 7 потребуется следующий факт, по уровню используемых определений больше подходящий для этого параграфа. Назовем длиной контура число дуг в нем. Предложение 7. Если граф (М, N) вполне связен и общий наибольший делитель длин его контуров равен 1, то для любого достаточно большого k и любых i, / е М найдется путь из i в j звенности k. Доказательство. Из того, что граф вполне свя- связен, следует существование замкнутого путир, содержащего все вершины из М. Этот путь может быть добавлен к пути от i к / (который существует, так как граф вполне связен), акр может быть добавлен любой контур. Таким образом, осталось показать, что любое достаточно большое число может быть представлено в виде линейной комбинации длин контуров с целыми неотрицательными коэффициентами. Это, однако, известный факт теории чи- чисел. ^ § 4. Деревья Деревом называется связный граф, в котором число дуг на единицу меньше числа вершин. Таким образом, в теореме 1 утверждалось, что в каждом связном графе можно выделить частичный граф — дерево. Это понятие понадобится многократно, поэтому свойства деревьев очень важны. Многие из этих свойств выясняются в следующей теореме. Теорема 2. Следующие определения дерева эквива- эквивалентны: а) связный граф без циклов; б) граф без циклов, у которого число дуг на единицу меньше числа вершин; в) связный граф, у которого число дуг на единицу меныш числа вершин; г) граф без циклов, в котором добавление дуги приводит к появлению цикла;
4. ДЕРЕВЬЯ 107 д) связный граф, который перестает быть связным после удаления любой дуги; е) граф, у которого всякие две вершины соединены цепью и притом только одной. Доказательство. Будем вести доказательство по контуру (следовательно, по вполне связному графу), изображенному на рис. 24. 1. б -> в. По предложению 6 этот граф не может иметь больше одной компоненты связности, Рис. 24. На Пая цепь Удаляемая д Првтняя цепь дуга .Л... Рис. 25. 2. в -> а. Если связный граф имеет цикл, то одну из дуг этого цикла можно удалить, не нарушая связности графа (рис. 25). Действительно, все связи, не использо- использовавшие удалений дуги, сохраняются, а цепи, в которые она входила, могут быть заменены цепями с «обходом» по остав- оставшейся части цикла. Так как в нашем графе минимальное для связного графа число дуг, он циклов содержать не может. 3. а -> г. Так как граф связен, то | N | ^ | М | — 1. После добавления еще одной дуги по предложению 6 в графе должен найтись цикл. 4. г -»• е. Поскольку добавление дуги приводит к по- появлению цикла, то цикл содержит эту дугу. Остальная часть Цикла , представляет собой цепь, соединяющую граничные вершины дуги. Если бы какие-либо две вершины были сое- соединены двумя различными цепями, из этих цепей (или частей) можно было бы составить цикл (рис. 26).
108 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА 5. е -* д. Рассмотрим граничные вершины какой-либо дуги. Единственная соединяющая их цепь состоит из этой дуги. Ее удаление нарушает, следовательно, связность графа. 6 д -> б. То, что этот граф не имеет циклов, очевидно. Мы уже знаем, что удаление дуги из цикла связности не нарушает. Теперь равенство \ N \ = \ М \ — 1 следует из предложения 6. ^ Дерево (М, N') называется иерархическим, если в нем найдется вершина in e M, из которой существуют пути во все остальные вершины. Вершина г'о, если она существует, определяется этим условием однозначно Она называется корнем дерева (рис. 27). Вторая цепь \ Цикл f ПерВая цепь Рис. 26. Рис. 27 Иерархическое дерево. Предложение 8. Если граф (М, М) вполне свя- связен, для любой его вершины ij найдется такое N' с N, что граф (М, N') будет иерархическим деревом с кор- корнем в it. Доказательство проводится точно так же, как доказательство теоре'мы 1, только в качестве /0 следует выбрать корень il и строить для присоединения новых вер- вершин не цепи, а пути. А Отметим, что для задания дерева удобно пользоваться нумерацией, о которой шла речь в теореме 1, и каждой вершине сопоставлять номер вершины, к которой она при- прикрепляется (т е. другой граничной вершины дуги, имею- имеющей тот же номер, что данная). При использовании языков типа алгол-68 для зада- задания дерева удобно в структуре, описывающей вершину, предусматривать ссылку на прикрепляющую дугу и на вершину, к которой данная вершина прикрепляется.
§ 5. ПОСТАНОВКА ТРАНСПОРТНОЙ ЗАДАЧИ Ю9 § 5. Постановка транспортной задачи Наиболее распространена следующая «классическая» постановка транспортной задачи. • Имеется множество К пунктов производства и множе- множество L пунктов потребления однородного продукта Для каждого пункта производства ie /( задан объем производ- производства а [i] > 0, а для каждого пункта потребления /е[ — объем потребления р [/] > 0. Стоимость перевозки количе- количества продукта х из пункта производства i в пункт потреб- потребления / равна с М, /] X х. Матрица с \К, L] задана. Тре- Требуется составить план перевозки продукта, в котором все пункты потребления были бы обеспечены необходимыми количествами продукта, ни из какого пункта производства не вывозилось бы продуктов больше, чем там производится, а стоимость перевозки была бы минимальной. Если обозначить через х \i, /1 количество продукта, перевозимое из i в /, мы получим следующую задачу линей- линейного программирования. Матричная транспортная задача. Найти матрицу х [К, L], минимизирующую ZiSKJeL С [i, j) X X U, /] D) при условиях х [К, L] > 0 \К, U, 2/е/. х U, /] t=g a [i], i Для того чтобы система ограничений F), G) имела реше- решение, необходимо, чтобы Ц'ек a li] > V/etp |/]. Мы будем для простоты рассматривать так называемую закрытую задачу, в которой эти суммы равны. В этом случае нера- неравенства F) можно заменить равенствами. Для удобства дальнейшего рассмотрения положим Ь \К\ = —а 1Ю, Ь [L] = р [L] и запишем F) в виде U, /] = Ь Ш, i e= К (8) к, L. E) F) G) И для решения этой задачи, и для возможности более простого ее обобщения целесообразно переформулировать задачу в терминах теории графов. Рассмотрим граф (М, N, Т), в котором М — К U L, Л/ = /С х L, так что каждое ueIV представимо в виде
НО ГЛ 3. ТРАНСПОРТНАЯ ЗАДАЧА (i, /), где 16 К, j 6 L Естественно считать, что i ((/, /)) = — i> i ((i. /)) = /¦ Тогда вместо матриц сих можно рас- рассматривать векторы с [N] и х IN]. Далее заметим, что МГ = {('. /) I / е= L}, /V,-- = ф для ( е= К, л// = ф, Nt = {(/, г) | / е /0 Для i e L Таким образом, G) можно записать в виде vw. х [ы] = Ь [i], i e L, (9) а (8) — в виде -2NJ x[u]^b Ш, iEK. ¦ A0) Теперь наша задача может быть переписана в таком виде: Задан граф (М, N, Т), вектор Ъ [Ml, сумма ком- компонент которого равна 0, и вектор с [N]. Требуется найти вектор х \N], минимизирующий величину cW] х xlN] A1) при условиях x[N\^0\N], A2) Zyv. х [и] - Уд,. х[и] = Ь Ш, i e M A3) В A3) мы пользуемся тем, что Nj = © для i e L и jV/" = С для i e К, и поэтому A3) служит единой записью условий (9) и A0). В этой записи уже полностью устранены особенности конкретного вида графа,—такая задача мо- может быть поставлена для произвольного графа и интерпрети- интерпретирована следующим образом. Граф (М, N, Т) представляет собой транспортную сеть, узлами которой являются вершины М, а магистраля- магистралями — дуги N (параметры, характеризующие затраты и возможности движения, могут быть различными для раз- различных направлений). В каждом узле задан объем потреб- потребления продукта (отрицательное потребление означает про- производство). Требуется составить план перевозки с мини- минимальными транспортными издержками. Здесь мы считаем, что издержки складываются из издержек на отдельных дугах, причем на каждой дуге из- издержки пропорциональны грузопотоку Это позволяет упро- упростить задание плана перевозки и вместо плана, указываю-
§ 5. ПОСТАНОВКА ТРАНСПОРТНОЙ ЗАДАЧИ HI щего «откуда — куда — сколько везти», задавать сбалан- сбалансированный поток грузов. Именно такой сбалансированный поток и разыскивается в задаче A1)—A3). Условием ба- баланса является условие A3), которое может быть в терминах потоков сформулировано так: для каждой вершины втекаю- втекающий поток равен сумме вытекающего потока и потребления В дальнейшем мы будем заниматься задачей A1)—A3), которая называется сетевой транспортной задачей Условие A3) можно переписать короче, если вспомнить, что для матрицы инциденций 1 для и <= Nt, a[i, «] = 1 для и е N[, О в остальных случаях, или a U, и] = б (и е= Nj) -8(ug Ni). Теперь A3) можно записать так: a ft, N] х х \N\ = b (Л для I e= M. A3') или а Ш, N] х xl№ = Ъ Ш. A3") В таком виде легче будет написать двойственную задачу: Найти вектор v [M\, максимизирующий v [АЛ х b [M] A4) при условиях v\M\ х аШ, N] <с[АЛ. A5) Неравенство A5), в свою очередь, можно выписать иначе, вспомнив структуру матрицы инциденций: —v U (и)] + v 1} (и)) sg с [и], и <= N, или v [/ (ыI*?с[и]'+ v[i (и)], u<=N. A6) Переменные этой двойственной задачи принято называть потенциалами Далее этот термин будет встречаться неод- неоднократно, а в начале гл 7 излагаются некоторые понятия и факты теории потенциалов, позволяющие установить связи между потенциалами в различном понимании. Сформулируем в терминах потенциалов критерий опти- оптимальности решения транспортной задачи, который дается теоремой 5 гл. 2 и соотношениями двойственности:
П2 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Критерий оптимальности. Пусть х \М] — поток, удовлетворяющий условиям A2), A3) Для того чтобы это! поток был оптимальным решением сетевой транспорт- транспортной задачи, необходимо и достаточно, чтобы нашелся вектор потенциалов v \M], удовлетворяющий условию A6) и та- такой, что v [/ (и)] = с [и] + v U (и)] при х[и]>0. A7) § 6. Решение систем с матрицей инциденций В наши ближайшие цели входит описание метода после- последовательного улучшения плана для сетевой транспортной задачи. Существенной частью этого метода является изме- изменение имеющегося базисного решения, которое можно опи- описать в следующих геометрических терминах: имеется точка, принадлежащая выпуклому многограннику (даже вершина). Рассматриваются все направления движения из этой точки, в которых целевая функция убывает и которые не выводят движущуюся точку из множества. Выбирается одно из этих направлений, а на нем точка из множества, в которой значение целевой функции наименьшее, после чего процесс повторяется. В том варианте метода последовательного улучшения, который мы рассматривали в гл. 2, в качестве такого направления выбиралось одно из ребер многогран- многогранника, поэтому процесс переходил из одной вершины много- многогранника в другую. Для нас сейчас важно, что, имея реше- решение х0 [N] системы а [М, N] х х0 [N] = Ъ Ш], . мы представляли новое решение в виде хх [N] = х0 [N] - к х z [N], 1>0, A8) где - I/VI — решение однородной системы а Ш, ЛП х zlN] = О Ш1 A9) Это направление допустимо, если z [Лд 2г 0 [Лд, где No = {и | х0 [и] = 0}. В этом параграфе мы получим представление множества решений и множества неотрицательных решений системы A9) для случая, когда а [М, N] — матрица инциденций.
§ G. СИСТЕМЫ С МАТРИЦЕЙ ИНЦИДЕНЦИЙ 113 Пусть <ЛГ, N') — контур. Характеристический вектор w [N] подмножества N' cr N мы будем называть контурным вектором. Для цикла (М', N'} зададим в соответствии с предложением 2 ориентацию (направление обхода) и определим вектор w IN], полагая w [и] = 1 для положи- положительно ориентированных дуг цикла, w [и] = —1 для отри- отрицательных дуг и w [и] = 0 для дуг, не принадлежащих циклу. Такой вектор назовем циклическим. Знак компонент циклического вектора зависит от выбранного направления обхода. Циклический вектор, соответствующий контуру, при одном из направлений обхода совпадает с контурным вектором этого контура. Теорема 3 (Пуанкаре — Веблена — Александера). Каждое решение z \N\ системы A9) представимо в виде ли- линейной комбинации циклических векторов. Доказательство. Пусть Мы будем доказывать теорему редукцией множества Ns. Прежде всего заметим, что циклические векторы удовлет- удовлетворяют A9). Действительно, пусть w IN] — циклический вектор для цикла (М1, Л"). Для i efc M', очевидно, wWV U т~] = О [NT U NT], и поэтому a li, N] X w \N] = 0. Вершине feAl' в N' инцидентны две дуги. Назовем их «, и иг. Если одна из них принадлежит NT, а другая NT, то обе эти дуги одина- одинаково ориентированы, и так как w [tij = w [иг], выпол- выполняется равенство 2„еЛ,;'И)[«] = 2«е^- w[u\. Если же они принадлежат одному и тому же множеству, то имеют различную ориентацию, w [uj = —w [u2] и ра- равенство также выполняется. . Рассмотрим теперь граф (Мг, Nz), где Мг — множество граничных вершин дуг Nz. Каждой вершине i e Mz инци- инцидентно не менее двух дуг из Nit так как иначе из равенства следовало бы, что все слагаемые равны 0, что противоречит определению Nz и Мг. Выберем произвольно it e М г.
114 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Найдется дуга щ е Л/г, инцидентная этой вершине. Обоз- Обозначим вторую граничную вершину этой -дуги через t2. Найдется отличная от и1 дуга и% е N г, инцидентная 12. Будем продолжать этот процесс построения цепи до тех пор, пока какая-либо из вершин г" цепи не встретится вто- второй раз. Часть цепи между этими двумя появлениями i' составляет цикл. Пусть w \N] — соответствующий ему цик- циклический вектор. Представим z \N] в виде г Ш] = Я х w [N] + z' IN]. Вектор z' \N], очевидно, удовлетворяет системе A9). Вы- Выбрав к так, чтобы одна из компонент г' IN] обратилась в нуль, мы получим новый ректор с меньшим множеством N2. Утверждение теперь следует из возможности повторения описанной процедуры до полного исчерпания Nz. a Напомним, что конической комбинацией называется ли- линейная комбинация с неотрицательными коэффициентами. Теорема 4 (Бержа). Каждое неотрицательное ре- решение системы A9) представило в виде конической комбина- комбинации контурных векторов. Теорема доказывается совершенно аналогично теореме 3, выяснение различий в доказательстве предоставляется чи- читателю. Нам будет полезно одно специальное представление замкнутого потока циклическими векторами. Пусть граф (М, N) связен, {М, N') —дерево в этом графе. Назовем основным циклом такой, в котором только одна дуга не содержится в УУ. Соответствующий основному циклу цик- циклический вектор будем называть основным циклическим вектором. Теорема 5 (Кирхгофа). Решение z \N] системы A9) представило в виде линейной комбинации основных цикли- циклических векторов. Доказательство. Отличие от теоремы 3 здесь лишь в способе выбора цикла для редукции. Пусть, как раньше, Ns - {и | z [и] Ф 0}. Так как в (Мг, Ns) содержатся циклы, то найдется и е Nz\ N'. Добавление дуги и к (М, N') порождает однозначно определенный цикл, содержащий и. Пусть w [N] — соответствующий ему циклический вектор. Выбе-
§ 7. МЕТОД ПОТЕНЦИАЛОВ 115 рем ориентацию цикла так, чтобы w \и] = 1. Представим г \N\ в виде г IN] = г [и] х w [N] + z' IN]. Очевидно, что z' [и] = 0; дуга и исключается из Nz и множество Nz \ N' уменьшается на один элемент. При ис- исчерпании множества N2 \ N' автоматически исчерпы- исчерпывается и множество Nz. ^ Следствие. Любое решение системы A9), неотрица- неотрицательное вне N', представимо в виде конической комбинации основных циклических векторов. Таким образом, если план перевозки положителен на дугах, составляющих дерево, то конус возможных направ- направлений изменения плана является конической оболочкой основных циклических векторов. § 7. Метод потенциалов Основной частью метода последовательного улучшения плана является «улучшение» — проверка оптимальности базисного решения, выбор небазисной переменной, вводимой в базис и изменение базиса Рассмотрим, как выглядят все эти действия в случае транспортной задачи. Для простоты будем предполагать граф задачи (М, N) связным Базис в задаче линейного программирования опреде- определялся как набор переменных, которому отвечает максималь- максимальный набор линейно независимых столбцов матрицы огра- ограничений. Из доказанных теорем следует, что набор N' будет базисом в том и только в том случае, если (М, N') — дерево. Базисный план находится из условий хШ \ N'] = 0Ш\ N'], аШ, Л/'] х хШ'] = Ъ\М\. Решению этой системы существенно помогает нумерация вершин и дуг, о которой шла речь в теореме 1. Пусть k = — \ М\— 1 Уравнение, соответствующее i*., имеет вид a Uk, uk] x x \uk] = b \ik\ Найдя х \uk\ из этого уравнения и подставив его значение в уравнение, соответствующее второй граничной вершине
1 16 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА дуги uk, мы получим такую же систему для оставшихся дуг, в которой снова сможем определить последнюю пере- переменную. Поясним этот способ вычисления примером Рассмотрим граф, изображенный на рис. 28. Цифры около дуг — стои- стоимости перевозок, цифры около вершин — объемы потреб- потребления. На рис. 29 изображено дерево, соответствующее Рис 28. Транспортная сеть с исход- исходными данными Рис. 29. Начальный базис с пра- правильной нумерацией. базисному решению. Цифры около вершин и дуг — их номера. Табл. 3 показывает, как при этой нумерации будет выглядеть соответствующая часть матрицы инциденций (рядом в рамке записан вектор b [М\, а дальше — те его изменения, которые произойдут при последовательном вы- вычислении х [uk\). Нахождение значений базисных перемен- переменных идет с конца: х [и„] := 5. Вторая граничная вершина дуги и8 — ее начало г8. Заменяем х [us\ значением b [i3].
§ 7. МЕТОД ПОТЕНЦИАЛОВ 117 8 7 Таблица 3 6 5 4 3 2 1 —1 — I —1 — 1 0 1 2 3 4 5 6 7 8 [ 0 2 0 0 —7 —3 4 5 _3 —10 —5 1 6 6 Далее х \щ\ : = 4, аналогично Ь [ц1 : = ft [ц] + а; [м7]; V I //„ Л I t-tf} ] х \иъ\ х [ы4] х \щ\ х [м,] UJ : = Ь UJ — х [ив], b \i,\ b [ij It,] : = = b [lx\ - x \щ\, = b \i2] + .v l«4], = bli,l + x [ыя], \] + a; [m2]. = 7, = 5, = 6, Наконец, .v [t',1 = 1. По рис. 29 хорошо следить за тем, как ведется этот вы- вычислительный процесс — в крайних вершинах графа, кото- которым инцидентно лишь по одной дуге, поток определяется однозначно, дальше можно отбросить дугу, на которой поток определен, и повторить процесс. Для проверки оптимальности решения нужно по урав- уравнениям v [М] х а Ш, N'] = с [ЛП B0) найти систему потенциалов и проверить выполнение нера- неравенств A6). Система B0) содержит уравнений на одно меньше, чем переменных, и позволяет определить потенциалы с точ- точностью до произвольной постоянной. Из A7) видно, что этой постоянной является слагаемое, одинаковое для всех t e M. Если зафиксировать значение потенциала в одной (нулевой) вершине, остальные по ней можно будет найти однозначно. При этом целесообразно нахождение их в по- порядке возрастания номеров вершин: при вычислении по- потенциала 1-й вершины используется 1-е уравнение A7),
118 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА в которое входит потенциал 1-й вершины и (уже вычислен- вычисленный) потенциал вершины с меньшим номером. Так, в нашем примере полагаем v [in] : — О, а далее v [ij = v [i0] + с [щ], v 1г2] = v [ij + с [н2], v li3] = v Uj} + с 1«3], v [t4] = у [tj + с [и4], у f/5] = v [г,] — с [«,,], и [te] = v [г,] — с [ыв], v [г7] = и [г2] + с [и-,], v И8] = v [is] + с [г/8], 0+1 = 1, 1+4 = 5, 1 + 1 = 2, 5+1=6, 1-1=0, 1 — 2 1. 5+1=6, 2+1=3. Таким образом, удачная нумерация вершин и дуг графа предельно упрощает решение и прямой, и двойственной 5+JL 0 Рис. 30. Потенциалы начального базиса. Рис. 31. Цикл исправ- исправления. систем, требуемых для метода последовательного улучшения базисного решения, Теперь остается для каждого и <= N \ N' проверить справедливость неравенства A6). На рис. 30 изображены результаты этой проверки. Базисные дуги изображены сплошными линиями, дуги, на которых нарушается усло- условие A6), — штриховыми линиями, прочие дуги — пункти- пунктиром. При нарушениях на некоторых дугах условий A6 полагается выбрать из них какую-либо дугу п для вве- введения в базис. Этой дуге соответствует основной цикл, по- порождающий допустимое направление.
§ 7. МЕТОД ПОТЕНЦИАЛОВ П9 Выберем в нашем случае дугу, идущую из 1Ь в г8. Рас- Рассмотрим цикл, порожденный этой дугой (рис. 31, около дуг изображен знак их ориентации при положительной ориентации б). Часть базисного плана, соответствующая дугам из цикла, имеет вид @, 5, 5, 7), а часть циклического вектора A, —1,—1, —1). Поэтому в выражении х + % X w максимальное К, которое мы можем выбрать, сохраняя не- неотрицательность потоков, это X = 5. В общем случае очевидно X = min {х [и] | и е ЛГ}, B1) где JV" — множество отрицательно ориентированных дуг цикла. Пусть и — (какая-либо) дуга из N", на которой до- достигается минимум в B1). Удалив п из базиса (заменив ее дугой б), мы снова получим дерево. Выберем для примера в качестве и дугу 3. Если говорить о вычислительной стороне этой части ал- алгоритма, то мы должны рассмотреть два вопроса. Первый — это способ нахождения цикла по дуге б, добавляемой к дереву. Здесь нам помогает все та же нуме- нумерация: выписав номера граничных вершин б, мы просма- просматриваем список вершин в порядке номеров (это делается одновременно с вычислением потоков) и, дойдя до выпи- выписанного номера k, заменяем его на номер второй граничной вершины fe-й дуги. Таким образом, мы строим две цепи, начинающуюся из i (б) (левую) и начинающуюся из / (б) (правую). В каждой цепи номера вершин последовательно уменьшаются. В момент, когда эти номера совпадут (обоз- (обозначим общий номер через т0), мы и получим цикл. Удале- Удаление дуги и разрывает одну из двух цепей на две. Будем называть получившиеся цепи верхней (часть, имеющая меньшие номера) и нижней (большие номера). Вторую цепь будем называть целой. Теперь мы подошли ко второму вопросу вычислитель- вычислительного характера — как построить для измененного базиса нумерацию, которая оказалась настолько полезной в рас- расчетах.
1 20 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Поиск цикла и дуги и р азбил все вершины на пять под- подмножеств: Мо — не встретившиеся вершины (имеющие номера меньше т0), Mi ¦— вершины целой цепи, М2 — вершины верхней цепи, М3 — вершины нижней цепи, УИ4 — остальные вершины (имеющие номера больше т0, но не входящие в цикл). Некоторые из них могут быть пусты, например: Мо = {0}, М, = {1, 5}, М2 = {1}, М3 = {3, 8}, М4 = {2, 4, 6, 7}. Объединив _мкожества Мо, Ми М2 в одно М, выпишем элементы М в порядке возрастания их номеров, затем множество М3 по убыванию номеров, затем множество М4 по возрастанию номеров. Порядковые номера вершин при этой записи мы и примем за новые номера. Порядковые номера дуг определяются как наибольшие из номеров гра- граничных вершин. В нашем примере получим: старые номера 015 8324671 новые номера 012345678J веРшины' старые номера 123456J8c] ? дуги. новые номера 15й627843) Этот базис изобра кен на рис. 32. 3 Рис. 32. Результат второй итера- итерации с новой нумерацией. Построением нового базиса закончена итерация. Повторим теперь процесс, оставляя лишь необходимые вычислительные действия. Первоначально потоки на дугах нас не должны интересовать.
§ 7. МЕТОД ПОТЕНЦИАЛОВ 121 Проводим проверку оптимальности решения, соответ- соответствующего данному базису. Строим потенциалы и вычис- вычисляем невязки. Результаты вычисления в прежних обозна- обозначениях приведены на рис. 33. Наибольшая невязка соответ- соответствует дуге, идущей от вершины 0 к вершине 5 (в нумерации о 2 Рис 33. Потенциалы второй итерации. рис. 32). Просматривая вершины от больших номеров к мень- меньшим, вычисляем потоки и строим цикл (табл. 4). Минимум потока на отрицательных дугах равен 1 и достигается на дуге 1. Теперь пересчет потоков не нужен, так как X уже най- найдено. Осталось изменить нумерацию. Здесь Мо = ф, Мх = {0}, М2 = {0}, М3 = {1, 5}, М, = {2, 3, 4, 6, 7, 8} и перенумерация дает (рис. 34): старые номера 051234678 ' вершины, 78| 78/ новые номера 0 12 3 4 5 6 7 8 п\ 7 8 1/ старые номера 12345678S новые номера Й34526701' Читателю рекомендуется довести вычисления до конца. Мы рассмотрели содержание одной итерации метода потенциалов. Для полноты нужно описать построение на- начального допустимого базисного решения Используются два основных метода. Наиболее прост метод «искусственного базиса», который заключается в том,
122 ГЛ. 3. ТРАНСПОРТНАЯ ЗЛДАЧЛ Таблица 4 Вершина 8 7 E 5 4 3 2 1 Поток по дуге 4 3 0 6 0 5 2 1 Вторая граничная вершина 5 1 5 1 3 2 1 0 Измененная потребность 6 -3 6 3 5 —2 1 0 Цикл 0->5 0->5 0->5 1 1 0->5 1 1 1 i 0->5 1 1 0 1 1 Минимум 3 1 что строится расширение (М, N) исходного графа (М, N). Здесь М = М +1, N = N IJ Nf U Щ {I — новая вершина, Mf — множество дуг, ведущих от пунктов производства к i, Мт- — множество дуг от t до всех остальных пунктов) Значение b [I] полагаем равным О, c[N-\ - 0 clA/.J = gz л 1 [Л/.1,
§ 7. МЕТОД ПОТЕНЦИАЛОВ 123 где gt — достаточно большое число (например, всегда до- достаточно gz > V.ueN с [и]). В качестве начального N' можно в этом случае принять множество N \ N. В нашем примере мы получим таким образом граф, изображенный на рис. 35. Рис. 34. Оптимальное решение. Рис. 35. Искусственный базис. Для матричной транспортной задачи может быть пред- предложен другой метод: 1°. Выберем какую-либо вершину i (каждая из вершин в матричной задаче — это пункт производства или пункт потребления). 2°. Выберем дугу, инцидентную i. Поток по этой дуге положим равным минимуму из объема производства в на- начале дуги и объема потребления в конце дуги. Уменьшим эти объемы на величину потока по дуге; одну из вершин, объем которой стал равен нулю, устраним из рассмотрения вместе с инцидентными ей дугами, а другую вершину примем в качестве i. После этого вернемся к выполне- выполнению п. 29.
•24 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА В случае, когда множества вершин /( и L перенумеро- перенумерованы и каждый раз выбирается дуга с наименьшим номером вершин (второй вершины), метод называется методом северо-западного угла. Это название широко распространено в популярных сочинениях. Более целесообразно выбирать из оставшихся дуг, инцидентных i, дугу с наименьшей стоимостью. § 8. Алгоритмическая реализация метода потенциалов Поскольку метод потенциалов мы рассматриваем как разновидность метода последовательных улучшений плана, для программного воплощения этого метода нам достаточно, следуя схеме процедуры LP opt basic solution из § б гл. 2, выписать описания процедур start, new, work и fin и связать эти процедуры едиными информационными описаниями. Рассмотрим сначала реализации метода на алголе-60, Мы будем задавать граф для простоты списком троек. Обозначим число дуг графа через п и введем три массива array с[1 :п]; integer array i, j [1 :n) где i (и) — начало дуги и, j (и) — конец, с [и] — стоимость перевозки по дуге. Множеством вершин будет множество М, вектор потребностей будет задаваться массивом b [M], 1 Ш] х Ъ [М] = 0. Нумерацию вершин зададим вектором w [1 : т\, где w Щ s М — истинный номер вершины, получающей t-й номер в этой нумерации. Нумерацию дуг мы задавать не будем, но введем вектор arc [M], сопоставляющий каждой вершине (кроме первой) дугу с тем же номером. Чтобы различать множество М и множество номеров 1 : т, в качестве М выберем г + 1 : г + т, где г — доста- достаточно большое целое число (например, г = 1000). Проще всего написать, как обычно, процедуру new. Она состоит из вычисления потенциалов, которое произво- производится просмотром вершин в порядке их номеров, и после- последующей проверки, которую сейчас произведем в простей- простейшем варианте (без порогов и без циклического порядка просмотра):
125 § 8. ПРОГРАММЫ ДЛЯ МЕТОДА ПОТЕНЦИАЛОВ procedure newT (opt); boolean opt; begin real max; integer k, s, u; array wflOOl : 1000 + m]; w[1001]: = .0; for s:=2 step 1 until m do begin k: — w[s]; u:=arc[k]; v[k\: = \\ i[u] = k then v\j [u]] — c[u] else w[i'[u]] + c[«] end; max: = .0; for и : = 1 step 1 until n do if v \j [u\] — v [i [«]] — с [и] > max then begin max : = v [j [u]\ — v[i [«]J — с [и]; «0: = «end; op/: = max < eps end Процедура даогй состоит из двух отдельных блоков. В первом из них находится цикл и выделяются множества М3 и М4. Элементы множества УИ4 помечаются знаками минус в массиве w [I : m], о множестве М3 достаточно знать число его элементов, так как по связи выкидывае- выкидываемой из базиса дуги и\ = arc \w [sO]] и соответствующей ей вершины i\ = w [sO] можно установить, какой ветви при- принадлежит это множество. (Если /1 = / [и\], то разрывается левая цепь — начинающаяся из i (п), если же И —- / [и1], то разрывается правая цепь.) Выпишем вначале заголовок процедуры и первый блок: procedure workT; begin integer k, k2, II, 12, rl, r2, s, sO, t, u; begin real min, y; array jc [1001 : 1000 + m]; rl : = i [ы0]; r2 : == / [ы0]; /1 : = /2 : = 0; min : =gz; for s : = 1001 step 1 until 1000 + m do x [s]: = b [s]; for s: = m step — 1 until 2 do begin k: = w [s]; и : — arc \k\, и : = x[k]; k2: = \\ k = i[u] then j[u\ else i[u]; x[k2\:=x[k2] + y, if r\=k then begin /1 :==/l + l; rl :=k2; if min>abs(y) and k = i[u] then begin min : = abs(y); sO : = s; t: = /1 end end else if r2 = k then begin /2: = /2+1; r2:=k2; if ш'л > abs(y) and /г == / [и] then
126 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА begin min:—abs {у); sO:=s; t:—l2 end end else w[s]: = — w[s\; if r\ = / then go to mks end s; mks: end x; comment Одна операторная скобка осталась незакрытой — кончился блок, но процедура еще не кончилась. Во втором блоке происходит перестройка базиса, для чего используется вспомогательный массив d [1 : т\, в на- начало которого выписывается в обратном порядке множество М3, а в конец множество М4. После этого оставшиеся эле- элементы массива w пододвигаются вверх, переписывается тИ3 и наконец УИ4; begin integer array d[l:m]; k: — w[sO]; u:=arc[k]; if k = i[u] then begin A : = i[mO]; d[l]: = /[«01 end else begin r\ : = у|ыО]; d[l]: = t[«O] end; d[2]: = rl; l\ : = 2; I2: = m\. for s: = 3 step 1 until t-\-\ do begin и : — arc[r\]\ d[s] : = rl : = i[u]-\-j[u] — rl end; for s : = t step — 1 until 2 do arc [d [s + 1 ]]: = arc [d [s]]; arc[d\2]\: = uO; for s: = m step—1 until sO do if a>[s]<0 then begin d[l2]:= —w[s]; /2 : = /2 - 1 end else if oy[s] = d[/l] then begin tt»[s]: = 0; /1 : = /l + l end; for s: — sQ step 1 until m do if a)[s]>0 then begin w [sO]: = t0[s]; sO: ==sO+ I end; for s: = l step 1 until t do tiy[sO + s-1]: = d[s+1J; for s: = sO + t step 1 until m do w[s]: = d[s] end d; for s: = l step 1 until m do w[s]:=abs(w[s\); Her: = iter + 1 end work После этой процедуры записать какой-либо вывод резуль- результатов труда не представляет. Вот одна из простейших про- процедур, в которой выписывается список базисных дуг с их началами и концами и потоками на них;
§ 8. ПРОГРАММЫ ДЛЯ МЕТОДА ПОТЕНЦИАЛОВ 127 procedure finT; begin array л: [1001 : 1000 + m]; integer k, k2, s, u; for s: = 1001 step 1 until 1000 + m do x[s]: = b[s]; for s:—m step — 1 until 2 do begin k: — w[s\\ u: = arc\k]\ k2 [] []k [k2] [] j[] [] print ('?¦', u, i[u], /[«], abs(x[k])) end end Наконец, для процедуры start мы используем метод искусственного базиса. Нет нужды вводить для этого много дуг и дополнительную вершину, как об этом писалось выше. Достаточно ввести нулевые компоненты в массивах г, / и с, положив 1 [0]: = / [0]: = 1001; с [0]: = gz, но во всех случаях при arc [k] = 0 соответственно менять i [0] или / [0]: И и = 0 then begin i[0]: = /[0]: = 1001; if b[k]<0 then i[0]: = * else /[0]: = * end; Такую вставку нужно делать в процедурах new T и work T (в двух местах) после операторов и: — arc \k]. Сама же процедура start T выглядит очень просто: procedure startT; begin integer s; Her: = 0; for s: = 1 step 1 until m do begin arc{1000+ 5]: =0; ay[s]: = 1000 + s end end Приведем теперь всю процедуру решения транспортной задачи полностью: procedure potential method (m, n, i, j, c, b, gz); value m, n, gz; integer m, n; real gz; integer array /, /; array c, b; begin integer iter, uO; real eps; boolean opt; integer array arcf 1001 : 1000 + m], w[\ :m]; procedure workT; begin integer k, k2, /1, 12, r\, r2, s, sO, t, u; begin real min, y; array л; [1001 : 1000 + m]; r\:=i[m0]; r2: = j[uO]; /1: = 12: = 0; min: = gz; for s: = 1001 step 1 until 1000 + m do x[s]:=b[sj;
128 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА for s:=m step—1 until 2 do begin k: — w[s]; u:=arc\k]; y:=x[k\; if u = 0 then begin i [0]: = /[0]: = 1001; if b[k)<0 then i[0]:=fe else /[0]: = & end; &2: = if k = i[u] then /[«] else i[u]; x[k2]:=x[k2] + y\ if rl=A: then begin /l: = /l-f 1; rl: = k2; if min>abs(y) Д & = /[«] then begin min:=abs(y); sO:=s; /: = /l end end else if r2 = k then begin /2: = /2+1; r2:=k2\ if min > o6s («/) Д k = j [и] then begin min: = abs(y); sO:==s; /: = 12end end else tw[s]: = — w[s]; if rl = r2 then go to mfo end s; mfes: end л:; begin integer array d[\:m]; k: — w[sO]; u: — arc[k\; if ы = 0 then begin i [0]: = /[0]: = 1001; if b[k]<0 then i[0]:=k else /f0]:=* end; if k = i [u] then begin rl: = i[«OJ; d[\]: = j[uO~\ end else begin г1: = /[и0]; dj 1]: = г [ы0] end; d\2]: = r\; Zl:=2; /2:=m; for s: = 3 step 1 until /+1 do begin u: = arc[r\\; d[s\. — r\: = i\u\-\-j[u\ — r\ end; for s:=t step—1 until 2 do arc[d[s+l]]: = arc[d[s]]; arc[d[2]]: = u0; for s: — m step—1 until sO do if ay[s]<0 then begin d[/2]:= - cm [s]; /2: = /2 - 1 end else if oy[s] = d[/l] then begin ffi)[s]: = 0; II: = 11 +I end; for s: = s0 step 1 until m do if w [s] > 0 then begin да [s0]: = да [s]; s0:=s0+l end; for s: = l step 1 until / do w[s0 + s- 1]: = d[s+ 1]; for s: = sO + t step 1 until m do ay[s]: = d[s] end d\ for s: = l step 1 until m do w[s]:=abs(w[s]); iter: ~ iter + 1 end work;
§ 8. ПРОГРАММЫ ДЛЯ МЕТОДА ПОТЕНЦИАЛОВ 129 procedure finT; begin array x[1001 : 1000 + m]; integer k, k2, s, u; for s: = 1001 step 1 until 1000 + m do x[s]: = b[s]; for s: = m step — 1 until 2 do begin k: = w[s\; u:=arc[k]; /г2: = i [и] + / [и] - k; x [k2\. = x [k2] + x [k]; print (T, u, i[u], j[u], abs(x[k])) end end; procedure startT; begin integer s; iter: = O; for s: = l step 1 until m do begin arc [ 1000 + s]: = 0; ny[s]: = 1000 + s end end; procedure newT (opt); boolean opt; begin real max; integer k, s, u; array w[1001 : 1000 + m]; u[1001]: = .0; for s: = 2 step 1 until m do begin k: = w[s]; u: = arc\k\; if м = 0 then begin i[0]: = /[0]: = 1001; if b{k]<0 then i[0]:=k else j[0]:=k end; v[k]: = \i i[u] = k then у[/[ы]] — с[и] else ^1г[«]] + с[«] end; max: = .0; for u: — \ step 1 until n do if ?>[/[«]! — v[i[«]] — c[u]>max then begin tnax:—v[j\u]] — v[i[u]] — c[u]; uQ: — u end; opt: = max <Z.eps end newT; eps: = l0 — 5; startT; mkit- newT (opt); if op< then go to mkfin; workT; go to mfe/i; mkfin: finT end potmcth Рассмотрим небольшой пример. Пусть транспортная сеть представляет собой граф, изображенный на рис. 36. Нумерация вершин имеется на рисунке, нумерация дуг может быть установлена по таблице данных, в которую уже добавлен нулевой элемент, требуемый для процедуры start Т. 5 И. В. Романовский
130 ГЛ. 3. ТРАНСПОРТНАЯ ЗАД\ЧА Вектор потребления b Ш] выписан отдельно и: 0 1 2 3 4 5 6/89 i [и]: 1001 1001 1001 1002 1003 1003 1003 1004 1004 1006 Ци): 1001 1002 1003 1005 1002 1005 1006 1003 1006 1005 с [и]: ?2 94348646 1 6 [Ml: —5, 3, 0, — 7, 4, 5 Состояние вычислительного процесса представляется записью, в которую входят целочисленные переменные /ОО/ тог 1OO5 /ffffff Рис 36 Транспортная сеть. iter, иО и векторы w [1 : 6], arc [1001 : 1006]. После завер- завершения работы start T получаем iter 0 «0 а w ГС 1 1001 1001 0 2 1002 1002 0 3 1003 1003 0 4 1004 1004 0 5 1005 1005 0 6 1006 1006 0 Для удобства мы будем писать gz вместо его конкрет- конкретного значения. В процедуре new T вычисление потенциалов даст нам 1001 0 1002 | 1С03 g* 1 & 1004 — ёг 1005 gz 1006 после чего проверка оптимальности приведет к значениям шах = 2 х gz — 4, «0 = 7, opt == false. Выполнение первой части процедуры work T даст (цикл состоит, естественно, из трех дуг — положительно ориен- ориентированной дуги 7 и двух искусственных дуг 1004 ->¦ 1001
§ 8. ПРОГРАММЫ ДЛЯ МЕТОДА ПОТЕНЦИАЛОВ 131 и 1001 —>-1003, ориентированных отрицательно; размыкается вторая из этих дуг) sO = 3, иш=0, *=1 1 1001 2 1002 3 1003 4 1004 5 — 1005 6 — 1006 После второй части процедуры new T получаем (мы добавим к стандартной информации массив d [I : 6], чтобы виднее были действия, выполненные процедурой) Шг I \и0 1 1001 2 1002 3 1004 4 1003 5 1005 6 1006 arc 1001 0 1002 0 1003 7 1004 0 1005 0 1006 0 1 1004 2 1003 3 4 5 1005 6 1006 На второй итерации после new T получаем 1001 0 1002 gz 1003 i-gz 1004 -#z 1005 gz 1006 gz А во время work T и после завершения ее работы получаем iter 2~ w arc 1 1001 1001 0 2 1002. 1002 0 3 1004 1003 7 4 1003 1004 0 5 1005 1005 0 6 1006 1006 8 Наконец, после 6-й итерации получаем 1001 0 1002 8 1003 4 1004 5 1005 11 1006 10 Вычисленные по процедуре new T потенциалы удовлетво- удовлетворяют условиям A6), и мы получили оптимальное решение. Процедура дает окончательно (знак вопроса трактуется в print как перевод строки) 8 1004 1006 7 9 1006 1005 2 3 1002 1005- 2 4 1003 1002 5 2 1001 1003 5
132 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Напишем теперь ту же процедуру решения транспортной задачи на алголе-68. Потребовав, чтобы процедура new вырабатывала буле- булево значение «имеется улучшение», мы сможем основную часть алгоритма представить так: start; while new do work od; fin Для задания исходной информации введем три таких же массива, как и раньше, но в процедуре start преобразуем их в массив структур. Для этого нового массива мы введем структуру, описывающую дугу mode arc = struct (real с, int /, /) где i и / будут номерами вершин, соответствующих началу и концу дуги. В структуре вершины будут также две ссылки — ссылка на вторую граничную вершину базисной дуги upv и еще одна ссылка на вершину next, служащая для задания упорядочения вершин с помощью цепных спис- списков. Кроме того, в этой структуре будет с нужным зна- знаком храниться стоимость перевозки по базисной дуге с и будет отведено поле vx для вычисления потоков и по- потенциалов mode vert = struct (real с, vx, ref vert upv, next) Для информации о дугах мы введем массив [1 : п\ arc data, для информации о вершинах — массив [1 : т] vert base. Теперь уже все готово для того, чтобы написать проце- процедуру new Т. Осталось только сделать несколько уточнений к самой процедуре. Она будет состоять из двух частей — вычисления потенциалов и проверки оптимальности. Про- Проверка оптимальности будет происходить в точности, как раньше. Для вычисления потенциалов мы будем двигаться по цеп ному списку вершин, начиная от вершины vf, и последова- последовательно вычислять потенциалы. Однако так как при вычис- вычислении потоков нам понадобится противоположный порядок вершин, ссылки в ходе вычислений будут переворачиваться. Начало новой цепи будет содержаться в ve. В этой п следующих процедурах мы будем считать описанными
§ 8. ПРОГРАММЫ ДЛЯ МЕТОДА ПОТЕНЦИАЛОВ 133 для vert те операции, которые мы описываем для elem в гл. 1 (т. е. lin, cons, head, rob и join) proc newT = bool: begin real d, max: = .O; ref vert k: = next of vf; ve: = vf; next of w/: = nil; vx of vf: = .0; while lin k do vx o\k: — vx of upv of k-\-c of k; ve rob k od; for и to n do ref arc a: = data [«]; if (d: = we of base [/ of a] — vx of base [i of а] —с of a)^>max then max: = d\ «0: = u fi od; max > eps end Процедура даогй Г нуждается в более серьезных ком- комментариях. При поисках контура мы будем распределять встретившиеся вершины по трем множествам: левой цепи, правой цепи и множеству Mt. Для каждого из этих множеств будет строиться цепной список с началами и концами соот- соответственно в Ihf и the, rhf и rhe, fp (конца не требуется), Когда будет выяснено, какая из цепей разрывается, мы соединим множества Мо, М] и М2 в одну цепь, но не так, как мы это делали раньше, а просто «прицепим» наши цепи друг к другу. После этого мы перевернем ссылки на полу- получившейся цепи, присоединим цепь, соответствующую М3, изменив в элементах этой цепи поля, соответствующие стоимости и другой вершине upv, и, наконец, прицепим М4 (чтобы не делать лишнего, эту последнюю цепь мы будем строить прямо в перевернутом виде. На рис. 37—39 показана Рис. 37. Связи вершин в начале процедуры. последовательность всех действий. На рис. 37 изображены связи между вершинами до работы процедуры new Т.
134 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Сверху изображены связи, задаваемые ссылками upv, снизу — ссылками next, В прямоугольниках записаны ссылки. Вводится в базис дуга, ведущая из вершины 5 в 10. На рис. 38 — состояние связей после работы первой части процедуры work Т. Указаны лишь ссылки next и две ссылки upv в концах цепей, так как ссылки upv не из- изменились. На рис. 39 показаны связи после работы work Т. Разрыв Рис. 38. Связи вершин после нахождения цикла. Рис. 39. Связи вершин в начале следующей итерации. Мы будем пользоваться операцией dif сравнения двух ссылок opdif = (ref vert a, b)bool: aisnt b Смысл введения такой операции в том, чтобы не беспо- беспокоиться о нужных уровнях разыменований ссылок.
8. ПРОГРАММЫ ДЛЯ МЕТОДА ПОТЕНЦИАЛОВ 135 Дальнейшие пояснения даются прямо в теле процедуры: ргос workT = void: begin real у, yl:—c of data[uO], min: = maxreal; ref vert k: — ve, kl, /el: = nil, kr: = ni\, lhf: = base[iof data [и 0]], rhf: = base \i of data [«0]], /fte: = /ft/, r/ге: = г/г/, /p: = nil; for s to m do vx of base [s]: = b [s] od; со Сделаны начальные присваивания началам и концам цепей, в поля vx переписаны потребности вершин. Теперь будет выполняться движение по цепи снизу вверх, которое закончится при совпадении ссылок со while Ihe dif rhe do vx of upv of k-\- :=y: =vx of k; y: = abs'#; 61:= head k; if kl dif Ihe Д (bool r/z: = ?l dif г/ге) then /p cons /el со Пересчитывается ил:, отцепляется в kl (с помощью опе- операции head) очередная вершина, и теперь мы выясняем ее судьбу. Если она отличается от тех, которые нам нужны, ее поглотит список fp, в противном случае она присоеди- присоединится к соответствующей ветви. Обратите внимание на услов- условный оператор после else —в каждой из альтернатив он вы- выполняет некоторые действия (один оператор присваивания) и вырабатывает первый аргумент операции join. Дальше следуют действия, связанные с поиском минимума встреч- встречного потока на цикле со else if rh then kr:=rhe; rhe else kl: = lhe; Ihe fi join upv of kl; if min >y f\c of kl < 0 = rh then min: = y; ve: = kl fi fi od; if с of ve < 0 then if lin kr then next of kr:=k\ next of kl: = rhf else next of kl:—k fi; ki. = lhf\ kr:~rhf\ yl:~ — yl else if lin kl then next of kl:=k; next of kr: — lhf else next of kr.=k fi; kl:=*rhf; kr. = lhf fi; со Здесь производится соединение цепей — по знаку с of ve находится целая ветвь, которая присоединяется к Мо, а к ней присоединяется верхняя цепь. Отдельно рассматривается случай, когда целая ветвь пуста. После
136 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА выполнения этого оператора kl ссылается на начало нижней цепи, a kr — на конец со k: =kl; while k dif ve do k\: — upv of k; upv of k: = kr; y: = —c of k; с of k:—y\; y\:—y; kr:=k; k: = k\ od; k:=next of ve; ref vert (ve): = (yl, skip, kr, fp); со Перевернута нижняя цепь (с довольно сложными из- изменениями ссылок и передачами информации о базисных дугах), После этого нижняя цепь прикреплена к fp. Теперь осталось перевернуть объединенную верхнюю цепь со while k dif vf do kl rob k od; next of vf: = kl; Her +: = 1 end Приведем теперь всю процедуру метода потенциалов целиком, опуская для краткости описания new T и work T proc pot method = (int m, n, ref [ ] arc data, ref [] real b) void: begin int u, uO, iter: = 0; real cost: = 0, eps: = 1Q — 5, gz: =]010; mode vert = struct (real c, vx, ref vert upv, next); ref vert vf, ve; [l:m| vert base; vf: = base [ 1 ]; for s to m do base [s\: — (if b[s]>0 then gz else-gz fi, 0, if s=l then nil else y/ fi, if s = m then nil else base[s+ 1J fi) od; while пеоуГ do workT od; for s to m do ux of &ase[sj: = fe[s] od; while ve dif u/ do rz&X y: = vx of oe; ол: of upv of ?>? + :=#; cos/+: = abs(c of vexy); ve: = nex/ of ve od; с of base [ 1 ]: = 1; for s from 2 to m do print (s, с of upv of fczse[s], we of base[s]); с of base [sj: = s od; print (Her, cost) end Для простоты здесь процедуры start T и fin T ликви- ликвидированы, — соответствующие действия вписаны непосред- непосредственно в основную процедуру.
§ 9. ВАРИАНТЫ ТРАНСПОРТНОЙ ЗАДАЧИ 137 § 9. Варианты транспортной задачи Рассмотрим несколько различных вариантов транспорт- транспортной задачи, допускающих применение метода потенциалов с некоторыми достаточно простыми модификациями. а) Задача с ограничениями' пропуск- пропускных способностей. Кроме обычных для транс- транспортной задачи ограничений, вводится еще одна группа ограничений: задается положительный вектор d IN] и тре- требуется, чтобы x\N]*?,dlN] B2) (поток х [и] по каждой дуге и не превосходит пропускной способности этой дуги d \и).) В двойственной задаче ограничения B2) приводят к по- появлению новых неотрицательных переменных р IN], име- именуемых «рентами». . Двойственная задача приобретает теперь такой вид: Максимизировать v Ш] х Ь Ш] + р [Л/1 х d Ш\ B3) при условиях р [N] > О IN), B4) vlM] х а [М, N] — р Ш\ > с IN). B5) Неравенство B5) переписывается таким образом: для каж- каждого и <= N v I/ (ы)] *? с [и] + р [и] + v И (и)] Критерий оптимальности для задачи с ограничениями можно, впрочем, написать, исключая ренты. Обозначим через No множество дуг, на которых поток равен 0, а через Ni множество «насыщенных» дуг, на кото- которых поток равен d [Ny]. Иногда No в алгоритме будет вклю- включать не все дуги с нулевым потоком, а Л^ — не все насы- насыщенные дуги. Для того чтобы допустимый план х IN] был оптималь- оптимальным, необходимо и достаточно, чтобы нашлись такие потен- потенциалы v Ш], чтобы разность v [/ (и)] — v И (и)] — с [и] была равна нулю, когда 0 < х [и] < d [и], неотрицательна при kgIViH неположительна при и б? No.
138 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Таким образом, может быть два вида нарушений условий оптимальности: как и прежде, на дуге с нулевым потоком может оказаться v I/ (и)] > v U (и)] + с [и], и, в отличие от прежнего, на насыщенной дуге может • оказаться v [/ (и)] < v U (и)] + с [и]. В первом случае надо увеличивать поток по такой дуге, прибавляя соответствующий циклический вектор к вектору потоков; во втором — уменьшать, вычитая соответствую- соответствующий циклический вектор. Это вполне согласуется со сле- следующей теоремой, являющейся прямым аналогом теоремы 5. Теорема 6. Пусть (М, N') — дерево в связном графе (М, N), N\N' разбито на два подмножества No и Nt. Любое решение системы A9), неотрицательное на No и не- неположительное на Nv представимо в виде разности кони- конических комбинаций основных циклических векторов, соответ- соответствующих дугам из No и из Nlt z [N] = VueA,o Я„ х wu [N]- Vuen, К X wu [N]. Доказательство очевидно. Теперь уже можно просто описать, как решается методом потенциалов задача с ограниченными пропускными способ- способностями. Базис задается деревом N' и разбиением множества N \ N' ¦-= Nu U Ni. Положив х Шо] = 0 Wn], x WJ = = d [Л'х] и приняв в качестве вектора потребностей вершин «скорректированный вектор» ЫМ] — а Ш, NJ х d [iVJ, однозначно определяем по дереву потоки на М' (так же, как и раньше). Дерево (М, N'} используется также и для вычисления потенциалов. По потенциалам определяем, оптимален ли план, и если он не оптимален, вводим изменения — поло- положительный основной циклический вектор, соответствующий дуге из УУ0, или отрицательный основной циклический вектор, соответствующий дуге из Л^. Далее определяем максимальный множитель Я,, с кото- которым можно прибавить циклический вектор к плану пере- перевозки. В отличие от предыдущего, величина А. лимитируется
§ 9. ВАРИАНТЫ ТРАНСПОРТНОЙ ЗАДАЧИ 139 не только уменьшением потоков на отрицательно ориенти- ориентированных дугах цикла, но и увеличением потоков на по- положительно ориентированных дугах. Таким образом, К = min {miuueN-x [и], minu<=N,(d [и] — х [и])}. Дуга, на которой достигается минимум, выводится из базиса и включается в No, если она отрицательно ориенти- ориентирована, и в Nlt если положительно ориентирована. Начальное приближение в задаче с ограничениями про- пропускных способностей легко, строить тем же методом искус- искусственного базиса d[uj c/uj -d[u] Рис 40. Замена дуги с ограниченной пропускной способностью. Отметим, что простым преобразованием сети, заме- заменяющим каждую ограниченную дугу тремя «неограничен- «неограниченными» дугами (рис. 40), можно привести задачу с ограниче- ограничениями пропускных способностей к эквивалентной задаче без ограничений. б) Задача об оптимальном контуре. В некоторых случаях требуется оптимизировать замкну- замкнутый поток, разумеется, при каких-либо дополнительных ограничениях, так как множество замкнутых потоков представляет собой, как мы знаем, выпуклый конус. Простейшим из таких ограничений является условие нормировки или взвешенной нормировки потока. Пусть задан граф (М, N) и два вектора с [N] и / [N], причем / IN] > 0 IN]. Рассмотрим задачу. Задача об оптимальном нормиро- нормированном потоке. Найти х [N], минимизирующий с IN) X х [N] B6) при условиях a [М, N] х х W] = 0 Ш], хШ\>0 Ш), B7) UN] X х IN] = 1. B8)
140 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА Планы, удовлетворяющие условию B7), являются по теореме 4 коническими комбинациями контурных векторов. Если определить контурные векторы так, чтобы они удов- удовлетворяли условию B8), то каждый вектор, удовлетворяю- удовлетворяющий условиям задачи, будет уже выпуклой комбинацией контурных векторов. Поиск оптимальной крайней точки многогранника B7)— B8) будет, таким образом, эквивалентен поиску такого кон- контура (М', N'), на котором достигается минимум отношения 2лг с [и] / 5> / [и]. B9) Если / [и] рассматривать как длину дуги и, а с [и] — как затраты на прохождение этой дуги, то мы получим задачу о нахождении контура с наименьшими затратами на еди- единицу длины. Эта задача, как мы увидим в дальнейшем, имеет само- самостоятельное значение. Однако целесообразно искать именно не контур, а крайнюю точку многогранника B7), B8), Двойственной к задаче B6)—B8) будет задача: Найти вектор v \M] и число г, удовлетворяющее ус: ловиям v Ш\ х а Ш, N\ + z х l[N]^c IN) C0) и максимизирующие г. Условие C0), очевидно, преобразуется в условие v I/ (и)]— v[i(u)] + / [и] х z^c[u] для ueiV. C1) Переменные v [г] естественно продолжать называть по- потенциалами. Переменная г имеет особый смысл минималь- минимального удельного убытка (убытка на единицу длины на оп- оптимальном контуре). Базис в этой задаче включает, очевидно, на одну дугу больше, чем в транспортной задаче. Пусть N' — набор дуг базиса. Граф (М, N'), очевидно, связен, и если базису отвечает допустимый план, то он содержит контур (М, N). На дугах N' условия C1) должны выполняться как равен- равенства. Просуммировав по дугам N', получим г х ?-v l-[u] = vv с [и] и найдем из этого условия г. После этого, зафиксировав один из потенциалов, обычным образом по дереву, содержа- содержащемуся в (М, N'), найдем весь вектор v [Ml
§ 9. ВАРИАНТЫ ТРАНСПОРТНОЙ ЗАДАЧИ 141 Проверка оптимальности базисного решения произво- производится здесь, как обычно. В случае неоптимальности найдется дуга й, для которой v [/ (?)] > v U (й)] — / [й] X z + с [п]. Эту дугу мы можем включить в базис. Процесс ее включения в базис зависит от того, где лежат концы дуги п. Если доба- добавление дуги п порождает новый контур, то суммирование по дугам этого контура дает нам соотношение У. с [и] — z X ? / [и] < О, т. е. средний убыток на этом контуре меньше г. В этом слу- случае необходимо разомкнуть старый контур, исключив из него одну дугу из числа дуг, не входящих в новый контур. Для случая, когда добавление дуги п контура не порож- порождает, процесс сводится также к удалению из базиса дуги и, не принадлежащей контуру. Практически выбор и доста- достаточно безразличен, однако для установления сходимости процесса следует подчинить выбор и какому-либо жесткому правилу. Одно из таких правил и рассматривается ниже Пусть М* — множество вершин, для которых в (М, N') существует путь, ведущий от контура (М, N) до вершины Пусть i (й) е М*. Рассмотрим цепь, ведущую от / (й) к кон- контуру (по этой цепи определяется потенциал вершины / (й)) В этой цепи есть отрицательно ориентированные дуги, таь как иначе й замыкала бы контур. Первую из этих дуг и вы берем в качестве и. Если же i (а) ф УИ*, то, построив цепь, соединяющую i (и) с контуром, примем в качестве и последнюю положи телыю ориентированную дугу в этой цепи. Теорема 7. Описанный процесс сходится к опти мальному решению за конечное число шагов. Доказательство. Докажем прежде всего, что за конечное число шагов будут построены решение и система потенциалов, удовлетворяющие условиям C0). Действительно, граф (М, N) конечен и имеет конечное число различных контуров. При замене контура, содержа- содержащегося в базисном плане, z строго уменьшается, поэтому возвращение к контуру, встречающемуся раньше, исклю- исключается, и после конечного числа шагов все изменение базиса
142 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА будет относиться к изменению потенциалов для вершин, не входящих в контур. Легко убедиться в том, что изменения базиса, не затра- затрагивающие контура, могут разве лишь увеличить множество М*. Поэтому через конечное число шагов множество М* перестанет изменяться и дальнейшие изменения будут от- относиться только к значениям потенциалов на вершинах вне контура. Такие изменения могут быть двух типов. В первом про- происходит уменьшение потенциала в одной или нескольких вершинах из М* (обязательно в / (й)). Из монотонности процесса следует, что базисы с одним и тем же контуром и с одним и тем же М* не могут появляться повторно. Второй тип изменений не затрагивает значений в М*. Он лишь увеличивает один или несколько потенциалов в одной или нескольких вершинах из М \ М* (обя- (обязательно в i (п)). И здесь из монотонности процесса следует, что возможно лишь конечное число изменений, и значит, через конечное число шагов мы получим систему потенциалов, удовлетворяющую условию C0). Осталось показать, что полученное решение оптимально, Пусть (М, N) —оптимальный контур, а (М, N) —кон- —контур из базисного решения. Суммируя неравенство C1) по и <= N, получим или что и доказывает оптимальность контура (М, N). а Отметим еще, что из этого неравенства следует, что для любого оптимального контура на всех его дугах неравенство C1) выполняется как равенство. Следствие. Пусть N' — оптимальный базис задачи B6)—B8). Множество оптимальных контуров этой задачи совпадает с множеством контуров графа (M,N0), где No = {и 1 v I/ (и)] — v U (и)] + z х 1[и] = с [и]}. Задача об оптимальном контуре может быть подобно транспортной задаче использована для построения методов решения более сложных задач, например задач с ограниче- ограничениями пропускных способностей.
§ 9. ВАРИАНТЫ ТРАНСПОРТНОЙ ЗАДАЧИ 143 Нам эта задача потребуется дальше, когда мы будем рассматривать асимптотические свойства процессов динами- динамического программирования. в)Двухкомпонентная задача. Рассмот- Рассмотрим теперь следующую задачу линейного программиро- программирования. Заданы конечные множества М, N, векторы с [N], Ъ [М] и матрица а [М, N], в каждом столбце которой содержится по одному или по два ненулевых элемента. Требуется найти вектор х [А/1, удовлетворяющий усло- условиям а Ш, N] X x\N] = Ь[М], jiW1>0 [Л/Ч C2) и минимизирующий линейную функцию о IN] X х IN]. C3) Эта задача называется обычно двухкомпонентной (по условию на число ненулевых компонент в столбце). Пусть Nk = {/ е= N | в а Ш, /J содержится k ненулевых компонент}. Таким образом, N = Nt [j N2. Каждому элементу из N2 можно сопоставить дугу (без- (безразлично какой ориентации), граничные вершины которой соответствуют ненулевым компонентам. Будем считать, что ранг матрицы а\М, N] равен | М \. Рассмотрим вопрос о базисах системы ограничений C2). В нашем случае базисом является множество N', число элементов которого равно | М |. Если N' с N2 и граф, соответствующий N', связен, то он состоит из дерева и еще одной дуги, порождающей цикл. Отождествляя дуги и соответствующие им элементы из jV, обозначим этот цикл через (М, N). Оказывается, невырож- невырожденность матрицы а [М, N'] зависит только от невырожден- невырожденности а [М, N]. Действительно, в столбцах из yV все нену- ненулевые элементы сосредоточены в строках М и, следовательно, при разложении определителя а [М, N'] по столбцам TV отлично от нуля может быть лишь слагаемое, в котором перемножаются определители матриц а [М, N] и а Ш \ М, ^ \ N]. Далее можно пронумеровать вершины из М \ М
144 ГЛ. 3. ТРАНСПОРТНАЯ ЗАДАЧА и дуги из N \ N так, что номер каждой дуги будет равен максимальному из номеров вершин (вершины из М мы перенумеруем предварительно) — здесь достаточно сослаться на теорему 1 и на связность графа (M^N'). В этой нумерации матрица а [М \ М, N' \ N] будет треугольной и, следовательно, невырожденной. В общем случае условие базисности набора N' выгля- выглядит несколько сложнее. Граф (М, N') может быть не связным. Более того, трудно говорить о графе, так как среди базисных индексов могут быть индексы из Nlt которым не соответствуют дуги. Каждому из таких индексов может, од- однако, быть поставлена в соответствие вершина изМ. Обозна- Обозначим множество вершин, соответствующих Aff = /V, |~| N', че- через Mv Теорема 8. Пусть \ N' \ — \ М \. Для того чтобы матрица а [М, N'] была невырожденной, необходимо и достаточно, чтобы в каждой компоненте связности графа (А1, N2) содержалась либо_вершина из Мъ либо невырож- денн_ый_цикл, т. е. цикл (М, N) с невырожденной матрицей а Ш, N1 Доказательство. Пусть k — число компонент связности графа. Относя элементы N\ к той компоненте связности, которой принадлежит соответствующая вершина, мы получим k пар (Ма, Na). Легко видеть, что | Ма \ = = | УУа |. В связном графе число дуг может быть меньше числа вершин разве лишь на единицу. Поэтому в каждой компоненте связности содержится не более чем по одной точке из Mv Тем компонентам связности, где точек из Мг нет, соответствует граф с одним циклом, и этот цикл должен быть невырожденным по предыдущему рассуждению. ^ При решении этой задачи также большую пользу при- приносит правильная нумерация. Следует иметь в виду, что решение системы а [М, N'] X х W) = b IM] производится для каждой компоненты связности отдельно. Для компонент содержащих вершины из М1 вычисление идет нормально с единственным условием, чтобы оно за- заканчивалось расчетом для переменной из N[. Для компонент, содержащих цикл, решение систем производится изящным и своеобразным приемом: выберем
§ 9. ВАРИАНТЫ ТРАНСПОРТНОЙ ЗАДАЧИ 145 дугу / из цикла и выразим через х [j] все остальные пере- переменные компоненты связности а Ша, Na — j] х х Wa — /] = b [Ma] — a [Ma, j] X x [j]. Граф (Ma,Na — /) является деревом, и значения всех переменных могут быть последовательно найдены (выражены через Ь Ша] и х [/]). При этом используются все уравне- уравнения, кроме уравнений с наименьшим номером. Это остав- оставшееся уравнение и используется для вычисления значения х [/]. Можно добиться большего единства в изложении, если считать, что элементам из N\ отвечают петли — циклы со- состоящие из одной дуги. В этом случае в каждой компоненте связности присутствует ровно один цикл, и последователь- последовательность нахождения потоков такова — сначала вычисляются потоки на всех висящих дугах, а затем, когда остается найти только поток на цикле, он находится так, как описано в предыдущем параграфе. a b и d в f о 1 1 3 2 3 1 't г 2 3 Б '1 5 7 3 В Рис. 41. Пример базиса в двухкомпонентной задаче. Например, по матрице, изображенной ниже, и соответ- соответствующей графу рис. 41, вычисления потоков идут в сле- следующем порядке: Зхх[а] = 6, х[а] — 2, | = 3-1=2, x[c]=l-s/2xx[d],
146 гл. 3. ТРАНСПОРТНАЯ ЗАДАЧА Отсюда х Id] = в/29> и теперь мы можем по х Id] найти также х [с] и 'X [/]. Двойственная система v [М] X а Ш, N'] = с [Л/"'] решается в обратном порядке: сначала на цикле (М, N) находится v \М\, а по у \М] вычисляются остальные пере- переменные. Для вычисления v Ш], так же как раньше, все переменные выражаются через одну, которая затем нахо- находится из последнего соответствующего циклу уравнения. Последний вопрос, связанный со спецификой метода последовательных улучшений плана в данной задаче, — изменение базиса. Добавление дуги и к графу (М, N'} либо соединяет две компоненты связности — в этом случае появится компонента связности с двумя циклами — либо прямо породит второй цикл в какой-нибудь компоненте связности. Результат в обоих случаях один и тот же: компонента связности с двумя циклами. Рассмотрим частичный подграф (Мо, NQ) этой компоненты, состоящий из обоих циклов и соединяющий их цепи. Дуга й, очевидно, входит в jV0. Мы будем искать вектор z IN], являющийся решением системы а [М, N] х z IN] = 0 [М], положительный на дуге и отличный от нуля лишь на дугах УУ0. Пусть {Мг, Nt) — один цикл, (М2, М2) —другой, it — вершина, в которой первый цикл соприкасается с соединяю- соединяющей цепью, и г2 — такая же вершина для второго. Не ис- исключено, что il — i2. Система а [Мъ Nx\ х z IN,] = g [AfJ имеет единственное решение при любом g [MJ, в частности, при g [Mi\, отличном от нуля только на компоненте g lij = = а. Обозначим решение этой системы через za [NJ. Выбе- Выберем значение za [и] на дуге и, принадлежащей цепи и инци- инцидентной вершине ilt таким образом, чтобы восстановился баланс в вершине it (для этого нужно z [и] положить равным — ala [ilt и]). Для соблюдения баланса во второй гранич- граничной вершине и выберем значение z [и] на следующей дуге цепи и т. д. до попадания в вершину i2. При подходящем выборе вектора g Ш2], точнее, его единственной ненулевой компоненты g [i2], система а Ш2, Лд х г Ш2] = g Ш2]
§ 9. ВАРИАНТЫ ТРАНСПОРТНОЙ ЗАДАЧИ 147 будет иметь такое (единственное) решение, что и в вершине i2 будет выполняться условие баланса a ut, лд х z [лд = о. Вектор г [No] определяется с точностью до множителя. Выберем его знак таким образом, чтобы значение г [п] было положительным, и будем искать новый план в виде хк W] = х IN] + к х z [N]. При возрастании к обратится в нуль значение хК [и] на одной из дуг. Удалим эту дугу и из базиса. Удаление и разорвет либо цепь (тогда компонента связности разделится на две с циклом в каждой из них), либо один из циклов, и снова получится базис прежнего вида. При решении систем мы, так же как в транспортной задаче, пользовались удобно выбранной нумерацией. Од- Однако описание алгоритма во всех деталях потребовало бы слишком много места, и поэтому здесь не приводится.
ГЛАВА 4 ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ § 1. Упорядочения Рассмотрим граф (М, N, Т). Будем говорить, что дуги этого графа задают предшествования на множестве его вершин: начало каждой дуги предшествует его концу. Можно рассматривать цепочки из таких предшествований — последовательности вершин, в которых каждый элемент предшествует в этом смысле следующему за ним элементу, и говорить, что начало последовательности предшествует ее концу. Таким образом, i предшествует / в том и только в том случае, если найдется путь с началом i и концом /'. Такое отношение, которое мы дополним условием «каж- «каждый элемент предшествует себе самому», называется квази- квазипорядком. Элементы i и /, каждый из которых предшествует дру- другому, называются эквивалентными. Легко убедиться в том, что определенное так отношение эквивалентности обладает свойствами рефлексивности, симметричности и транзитив- транзитивности. Это отношение порождает разбиение М на множества эквивалентных вершин — классы эквивалентности. Каждый подграф, порожденный классом эквивалент- эквивалентности, по определению вполне связен. Нетрудно убедиться в том, что каждый класс эквивалентности — это макси- максимальный вполне связный подграф, т. е.' его нельзя расши- расширить с сохранением свойства вполне связности. При рассмотрении понятий предшествования и эквива- эквивалентности естественным образом наряду с исходным графом (М, N, Т) появляются некоторые новые графы. Граф (М, N, Т) называется транзитивным замыканием графа (М, N, Т), если каждой дуге в нем соответствует путь в графе (М, N, Т), имеющий те же начало и конец, а каждому^такому пути в свою очередь соответствует дуга в (М, N, Т). Граф, являющийся своим транзитивным замы- замыканием, называется транзитивным. Граф (М, N, Т) на-
§ 1. УПОРЯДОЧЕНИЯ 149 зывается редукцией графа (M,N,T), если каждой его вершине i взаимно однозначно сопоставлен класс эквива- эквивалентности М (i) графа (М, N, Т), а каждому непустому множеству {и I i (и) е= М (h), / (и) е Л* (У, / (ы) ^ М &)} также взаимно однозначно сопоставлена дуга а е JV с на- началом ij и концом ib Те же термины будут обозначать построение транзитивного замыкания и редукции. Предложение 1. Транзитивное замыкание редук- редукции графа есть редукция его транзитивного замыкания. Доказательство осуществляется непосредственной про- проверкой. Предложение 2. Число компонент связности при транзитивном замыкании и при редукции графа не из- изменяется. Вершины i и / называются несравнимыми, если ни одна из них не предшествует другой. Граф, не имеющий несравнимых вершин, называется линейно упорядоченным. Предложение 3. При транзитивном замыкании графа несравнимые вершины остаются несравнимыми, при редукции несравнимыми вершинам соответствуют несравни- несравнимые вершины. Предложение 4, В редукции графа (М, N, Т) контуров не содержится. Если граф (М, N, Т) сам не содержит контуров, то при редукции он не изменяется.' В вычислительном отношении представляет интерес по- построение транзитивного замыкания графа, его редукция, нахождение максимального набора несравнимых вершин графа. Эти задачи и некоторые их обобщения будут рас- рассматриваться в следующих параграфах. Здесь мы ограничимся лишь изложением простого метода поиска контуров в графе, так как редукция графа сводится к стягиванию каждого контура графа в одну вершину. Эта операция представляет некоторые сложности в удобном представлении необходимой информации, а для дальней- дальнейшего содержания книги большого интереса не представляет, В то же время описываемый ниже алгоритм поиска контуров используется в некоторых практических задачах для про-
150 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ верки правильности построенного графа (там, где по смыслу задачи этот граф контуров содержать не должен). Метод заключается в том, что произвольно выбирается вершина г\ е М и начинает строиться путь, идущий из ix. Для этого произвольно выбирается дуга из А/-. , конец которой обозначается через i2, выбирается дуга из Nr и т. д. Процесс повторяется до тех пор, пока путь не придет в вер- вершину, которая уже встретилась в пути, — это означает, что путь замкнулся и найден контур, либо пока путь не зайдет в «тупиковую» вершину, из которой не выходит ни одна дуга. В последнем случае дугу, которая завела в этот тупик, следует удалить из N, а путь продолжить с пред- предпоследнего шага (если нам понадобится хранить путь, встре- встречающийся на различных шагах процесса, для этого пути требуется магазинная организация^информации, упоминав- упоминавшаяся в § 4 гл. 1). В том случае, если в пути уже не содер- содержится ни одна дуга и /а стала тупиковой вершиной, нужно отбросить эту вершину и поискать в графе новую вершину. Процесс продолжается до тех пор, пока не будет предъяв- предъявлен контур или пока не будет исчерпан весь граф. Для описания вычислительного процесса мы зададим граф, как в § 2 гл. 3, двумя массивами: integer array lst[0:m], j[\:n] Рабочая информация о состоянии вычислительного про- процесса (запись) состоит из двух массивов: integer array fst, prec[\:m] с начальными значениями fst[i]: = lst[i—\]+\, fel:m, prec[i] = 0 и целого числа k с начальным значением 0. В каждый момент fst [i] будет номером первой невы- черкнутой дуги, выходящей из i. Именно эта дуга и будет выбираться для продолжения пути. Массив ргес [1 : т\ будет использован для нескольких целей сразу. Для вершин пути он будет указывать номер предшествующей вершины (кроме начальной вершины, указывающей на себя саму). Равенство ргес [i] нулю будет означать, что вершина i в пути еще не встречалась.
§ 2 МАТРИЦА КРАТЧАЙШИХ РАССТОЯНИЙ 151 Мы ограничимся описанием этого алгоритма на алголе-60у mksearch: for i: = k+\ step I until m do if fst\i]^lst [i] then begin k:—prec[i]: = i; go to mk end; go to mkfin; mk: i: = }[fst[k]\, if prec[i]>0 then go to mkcontour, if fst[i]^lst[i] then begin prec[i]: = k; k: = i; go to mk end; mk\: fst[k]:=fst[k]+\; if fst [k] =sS 1st [k] then go to mk; if prec[k] = k then begin pm:[.?]:=0; go to mksearch end; i: = prec[k]; prec\k]:=0; k: = i; go to m&l; mkcontour: (контур найден); mkfin: (контуров нет) Непосредственно после метки mksearch разыскивается вершина k, не являющаяся тупиковой, для того чтобы с нее начать поиск пути. Добавление к пути новой дуги осуществляется после метки mk с выходом на метку mkcon- mkcontour, если был найден контур. Если же контур не найден, то происходит прикрепление найденной дуги к пути и пере- переход в следующую вершину. После метки mk\ проверяется, не тупиковая ли это вершина, и если она оказывается ту- тупиковой, то делается шаг назад. Процесс выходит на метку mkfin, если в графе не оказалось контуров. На алголе-68 здесь было бы удобно использовать задание графа в виде списка вершин, каждая из которых имеет список дуг. Разумеется в этом случае при каждой вершине было бы необходимо хранить ссылку и на текущую дугу этого списка. § 2. Матрица кратчайших расстояний В этом параграфе мы займемся вопросом о построении транзитивного замыкания графа. Поскольку элементы k-и степени матрицы смежностей графа равны числу путей, соединяющих соответствующие вершины графа, и путь от одной вершины до другой (если он существует) содержит не более | М | вершин, то для того чтобы существовал путь, ведущий от вершины i к вершине /, необходимо и
152 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ достаточно, чтобы был положителен элемент s[i, j] матрицы s \М, М] = г [М, М] + г2 Ш, М] -Н\.. + г'« н Ш, М]. Таким образом, построение матрицы смежностей транзи- транзитивного замыкания графа (М, N) формально просто. Более интересной и общей является задача нахождения наилуч- наилучших путей. Пусть задан положительный вектор с [N], компоненты которого мы будем рассматривать как длины соответствую- соответствующих дуг. Длиной пути назовем сумму длин входящих в него дуг. Рассмотрим задачу о нахождении для каждой пары /, / кратчайшего пути, ведущего из / в /. Обозначим через \к \М, М] матрицу кратчайших путей, состоящих не более чем из k дуг. (Если ни одного пути такой протяженности, ведущего из i в /, не существует, можно считать, что {к [i, /1 = оо.) Очевидно, что f1 U, /] = min {с [и]\ие N7 Л Щ}, h U, п = 0 A) (минимум на пустом множестве по определению равен оо). Далее, легко показать, что для любых к и / (ШИ, /] = min {/* [i, 1г] + /' Uu /] | н е М). B) Матрица кратчайших расстояний f [M, М] совпадает, очевидно, с fM ^ [М, М\, и путь из / в / существует в том и только в том случае, если / Н, /] < оо. Произведение расчетов по формуле B) требует порядка | М |3 вычислений. Вычисление переходами от f к /ft+1 может потребовать 1 М | — 1 шагов и общая трудоемкость процесса будет оцениваться порядком | М |4. Можно вычислять /* для k, пробегающих целые степени 2, до тех пор, пока мы не дойдем до k ^ | М \ (алгоритм Беллмана — Шимбела). Трудоемкость такого процесса по- порядка | М |3 log2 | М | (следовало бы округлить второй сомножитель до ближайшего целого в большую сторону). Каждый из этих вариантов алгоритма требует памяти в 2 X | М \2 чисел. Тем интереснее, что существует алгоритм, требующий вдвое меньшей памяти и всего | М |3 операций. Этот алгоритм (алгоритм Флойда) состоит из | Af | шагов, выполняемых последовательно для каждого k e M. Рас- Рассматривается матрица расстояний / Ш, М\, первоначально
§ 2. МАТРИЦА КРАТЧАЙШИХ РАССТОЯНИЯ 153 совпадающая с определенной выше матрицей Р Ш, М]. На каждом шаге (соответствующем вершине k) просматриваются все пары i, j е М, значение / U, /] сравнивается с f \i, k] + -f- f №, j] и в случае, если сумма оказалась меньше, / И, /] полагается равным этой сумме. На алголе-60 мы можем (приняв М = 1 : т) записать этот алгоритм одним оператором: for k: = 1 step 1 until m do for i: = 1 step 1 until m do for /: = 1 step 1 until m do if f[i, l\>f[i, k] + f[k, j] then По окончании этого процесса (как будет доказано ниже) матрица f будет матрицей кратчайших расстояний. Прежде чем проводить доказательство, рассмотрим пример Пусть мы имеем матрицу, представленную табл. 1. Решение представляется в виде набора из шести матриц (табл. 2—7) (изменившиеся элементы выделены). Рассмотрим в этом примере, как происходит вычисление длины кратчайшего пути от 5 к 2. Этот путь состоит из переходов 5 -> 3 -» 6 -> 2. Т а б л и ц а 1 Таблица 2 1234 5 6 123456 1 2 3 4 5 6 0 ?2 3 gz 7 5 3 0 8 6 gz 2 gz 4 0 gz 1 gz 3 7 5 0 4 gz 6 gz gz 3 0 2 gz 4 2 gz 4 0 ' 0 gz 3 gz 7 5 3 0 6 6 10 2 gz - 4 0 gz 1 gz 3 7 5 0 4 8 6 g* 9 3 0 2 gz 4 2 ffz 4 0 Таблица 3 2 3 4 5 6 Таблица 4 3 4 5 6 0 gz 3 gz 7 5 3 0 6 6 10 2 7 4 0 10 1 6 3 7 5 0 4 8 6 gz 9 3 0 2 7 4 2 10 ¦4 0 0 7 3 13 4 5 3 0 6 6 7 2 7 4 0 10 1 6 3 7 5 0 4 8 6 13 9 3 0 2 7 4 2 10 3 0
154 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Таблица 5 3 4 5 6 Таблица( 3 4 5 6 0 7 з 13 4 5 3 0 6 6 7 2 7 4 0 10 1 6 3 7 5 0 4 8 6 10 8 3 0 2 7 4 2 10 3 0 0 7 3 7 4 5 3 0 6 G 7 2 7 4 0 1 3 3 7 5 0 4 6 6 10 8 3 0 2 7 4 5 6 3 0 Таблица 7 4 5 6 0 7 3 7 4 5 3 0 4 6 5 2 7 4- 0 4 1 3 3 7 5 0 4 6 6 6 4 3 0 О 7 4 2 6 3 0 Во время третьего шага непосредственный переход 5 -> 6 сравнивается по стоимости с 5 -> 3 -> 6, и, так как второй вариант оказывается дешевле, в табл. 4 и в после- последующих таблицах длина перехода 5 -» 6 уже уменьшена В связи с этим оптимальным стал уже и путь 5 -* 6 -> 2. На шестом шаге непосредственный переход 5 -> 2 сравни- сравнивается по стоимости с 5 -> 6 -*¦ 2, и, так как второй вариант оказывается дешевле, в табл. 7 длина перехода 5 -»¦ 2 уже равна длине перехода 5 -» 3 -* 6 -> 2 в табл. 1. Теорема 1. Матрица /, получаемая в результате работы алгоритма Флойда, является матрицей кратчай- кратчайших длин. Доказательство. Пусть кратчайший путь, иду- идущий из вершины i в вершину /, проходит последовательно через вершины ilt i2, ..., is Пусть ?j — первый шаг алго- алгоритма, соответствующий какой-либо из этих вершин (назо- (назовем ее вершиной /,; пусть также i = г0, / = is+1). Непо- Непосредственный переход от t,_, до t/+1 не может быть короче, чем переход от iui к iM через it, так как в противном случае путь /„. ¦•¦¦> '/_i. U+\> ¦¦•. 'Уи был бы короче кратчай- кратчайшего. После изменения длины перехода от iui до it (шага /гх)
§ 3. ДЕРЕВО КРАТЧАЙШИХ ПУТЕЙ 155 путь г0, ..., i,_i. it+i, •••> h+i также становится крат- кратчайшим. Повторяя этот процесс, мы установим, что в конце и путь i -> j является кратчайшим, а Отметим, что по тому же принципу можно решать задачи о наилучшем пути с некоторыми другими целевыми функ- функциями. Например, если каждой дуге и сопоставлена ее пропускная способность d [и] и требуется найти путь из i в / с наибольшей пропускной способностью, которая пони- понимается как минимум из пропускных способностей дуг, входящих в этот путь, то, обозначив через gk \i, j] макси- максимальную пропускную способность (не более чем &)-звенных путей из i в /, мы получим g1 [i, /] = max {d [и] | и е Nj П Щ}, g1 П. Л = gz, C) gM \i, /]_= max {min {gk [i, ij, gl [iv /3} | i, e M). D) Легко видеть, что алгоритм Флойда применим и здесь: for k: = 1 step 1 until m do for i: = 1 step 1 until m do for /: = 1 step 1 until m do \ » g[i> i]<g[i> k]/\g[i, j]<g[k, j] then [i /] » U k][k ] /] then g[i, k] else g[k, j] Методы построения кратчайших длин и путей (для по- построения путей нужно запомнить еще одну матрицу — матрицу ближайших переходов) не эффективны, если \М\ большое число. В этом случае приходится строить отдельные строки матрицы f Ш, М]. Для их построения разработано много алгоритмов, которые мы разберем в следующем параграфе. • § 3. Дерево кратчайших путей Зафиксируем какую-либо вершину /0 графа (М, N) и будем рассматривать задачу нахождения соответствую- соответствующей этой вершине строки матрицы /. Поскольку речь будет идти только об этой строке, обозначим ее через ср [М]. Пусть, кроме того, ср* [/] — длина кратчайшего из путей °т /0 до /, состоящих не более чем из k дуг. Из B) следует, что Ф* 1/1 - min {ф*1 Ш + Р li, /I I i e M) E)
166 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ ИЛИ Ф* [/] = min {ф*-1 U (и)} + с [и] | и <= Щ). F) Векторы ц>" [М] вычисляются по рекуррентному соотно- соотношению F) последовательно, начиная с ф1 [М] = f1 U'o, M] либо с вектора ф° \М], все компоненты которого, кроме Ф° [t0] = 0, полагаются равными схэ. Эти вычисления до- достаточно проводить до тех пор, пока не совпадут два после- последовательных набора ф* [М]. Заметим, что в зависимости от того, как расположена информация о графе, можно использовать различные ва- варианты организации вычислений по соотношениям F). В частности, если для каждого i мы легко можем перебрать дуги из Nt, процесс вычислений таков: для каждого к и для каждого i e M выбирается дуга из Nt с наимень- наименьшим значением ф* И (и)] + с [«],¦ которое и запоминается в качестве ф* It]. Другой вариант вычислений таков: в качестве началь- начального приближения для ф* Ш] принимается ф*" Ш]. Последовательно перебираются все дуги, и если для дуги и имеет место неравенство ф* [/ (и)] > ф* [i [и)] + с [и], тс правая часть этого неравенства принимается в качестве нового значения ф* [/ (и)]. Однако возможно и дальнейшее улучшение вычисли- вычислительной схемы. Оказывается, нет необходимости запоми- запоминать отдельно ф* и ф*-1, а можно при вычислениях огра- ограничиться одним вектором, проводя описанные пересчеты до тех пор, пока при полном просмотре дуг графа происхо- происходят изменения. Соответствующий алгоритм может быть описан следую- следующим образом. Пусть ft[M] — массив кратчайших вычис- вычисленных длин, и\ [М] — массив имен дуг, на которых дости- достигается минимум при вычислении, г — переменная, реги- регистрирующая номер последней дуги, вызвавшей изменения в массиве fi \М]. Начальные значения: ft Ц0\ = О, U [М — _ g = gz x 1 [М — Ю], и\ Ш] = (п + 1) х 1 Ш], г = = 0. (Массив и\ введен для регистрации решений — опти^ мальных путей от Ю до каждой вершины. После того кан для каждой вершины зарегистрирована ведущая в нее дуга, набор этих дуг порождает частичный граф, который) связен, так как для каждой вершины имеется путь, веду^ щий в нее из Ю, — отметим, что начальным присвоением
§ 3. ДЕРЕВО КРАТЧАЙШИХ ПУТЕЙ 157 и\ Ш] мы неявно ввели искусственные дуги, ведущие из Ю в каждую вершину. Очевидно, что на каждом шаге этот граф является деревом.) tnk: for u:—r-\-l step 1 until n, 1 step 1 until r— 1 do if fi[i[u]] + с[и]<fi\j[u]] then begin fi [/[«]]:= fi [»[«]] + с [и]; ; go to end Пересчет г обеспечивает здесь необходимое продолжение проверок и изменений до требуемой стабилизации. Прежде чем доказывать сходимость этого метода, рас- рассмотрим небольшой пример: Пусть граф задан списком дуг, в котором каждая дуга задана началом, концом и длиной. Составим таблицу, в которой дугам соответствуют столбцы: имя дуги АБВГДЕЖЗИКЛМНОПР имя начала 123451 1234455421 имя конца 342 11523536632 16 длина дуги 6347824176543458 . Вычисления будут проводиться в таблице, каждая строка которой соответствует вершине графа. Кроме номера вер- вершины, в такой строке содержится пара из вычисленной Таблица 8 1 2 3 4 5 6 0/Х gz/X gz/X gz/X gz/X gz/X 1 2 3 4 5 6 О/А" gz/X, gz/X, gz/X gz/X, gz/X, Таб Ю/В, 6/A, 2/E 6/M лица 9 4/Ж 5/3 Таблица 10 1 2 3 4 5 6 0/Х 4/Ж 5/3 gz/X, 6/Б 2/Е 6/М длины и (через косую черту) дуги, на которой достигается минимум. Табл. 8 представляет начальное состояние вы- вычислений с i0 = 1 (X использовано для искусственных дуг). Первый просмотр дает табл. 9 (в каждой строке после- последовательно пишутся новые значения изменяемых пар), второй просмотр — табл. 10. Дополнительно ко второму просмотру достаточно проверить, что дуга а (часть списка от начала до последнего изменения при втором просмотре)
158 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ изменений не приносит. На рис. 42 изображен граф, состав- составленный из дуг, перечисленных в табл. 10. Это дерево назы- называется деревом кратчайших путей. Сходимость алгоритма мы будем доказывать для слу- случая с Ш\ > 0 W). Теорема 2. Описанный выше алгоритм сходится к оптимальному решению за конечное число шагов. Доказательство. Обозначим через ср* [М] зна- значение ф Ш\ после /г-го - просмотра дуг, а через ср° [М] — начальное значение ф [М]. Пока- Покажем прежде всего, что последова- последовательность {ф* [М]} монотонно не возрастает. Для этого покажем, что если g [M] =^ h [M], то после при- применения одного цикла алгоритма к этим функциям неравенство будет иметь место и для получившихся функций. Рис. 42. Дерево крат- Покажем, что неравенство со- чайших путей. храняется при изменении, соответ- соответствующем любой дуге и. Это измене- изменение касается разве лишь g [j (и)] и h [j (и)], новыми значения- значениями которых становятся min {g [/ (и)], g [i («)] + с [и]} и min {Л [/ (и)], h [i (и)] + с [и]} соответственно. Очевидно, что ввиду справедливости неравенства для старых значе- значений оно сохраняется и для новых значений. Далее, очевидно, что ф1 Ш) ^ ф° Ш]. Предположим, что го* \М) < ф* [ЛИ. Полагая g Ш] = ф" Ш] и h"[M\ == = ф" Ш], мы по доказанному получим ф*+1 Ш] «S ф/; Ш] и, следовательно, {ф* [М]} монотонно не возрастает. Вместе с тем эта последовательность ограничена снизу (например, нулем). Следовательно, существует Ф Ш] = ПтА-ооФ* Ш]. Покажем, что эта функция удовлетворяет соотношению Ф Ш = min {ф Щи)] + с [и] | и е Nt). G) Действительно, для любого k мы имеем Фй Ш < ф* U (иI + с [и], и <= Nf и, следовательно, Ф Ш ^ min (ф II (и)] + с [и] | и ёЕ Nt}. (8)
§ 3. ДЕРЕВО КРАТЧАЙШИХ ПУТЕЙ 159 Каждому k как мы уже говорили, соответствует неко- некоторое дерево. Так как в графе (М, N) имеется лишь конеч- конечное число деревьев, то в бесконечной последовательности деревьев найдется дерево, встречающееся бесконечное число раз. Пусть й [АЛ — набор дуг, соответствующий этому дереву Для шагов k, при которых набор ик Ш] совпадает с п [М], для любого П Ф Ю мы имеем Ф* U (й 1/1 I)] + с [й Ш И < ф* [i 11 < <фГ1 U (п 1ШI + с\п[П]\ Переходя к пределу, получаем ijilil] = c[uli\\\ + ф11(Д U1JI, -(9) что вместе с (8) дает G). Осталось показать, что последовательность {ф* \М\) сходится к ф Ш] за конечное число шагов. Для этого разобьем все вершины графа (М, N) на уровни, отнеся к'нулевому уровню вершину Ю, а к уровню г все вершины, путь до которых от Ю состоит в дереве п из г дуг. Покажем, что при r-м появлении дерева п в последо- последовательности {ик Ш]} вычисленные для вершин r-го уровня значения ф* совпадут с ср. Для Ю это очевидно. Пусть это верно для уровня г—1. Последующие изменения век- вектора ф вершин (г— 1)-го уровня не коснутся ввиду того, что ф Ш] достигло на них своей нижней границы. Поэтому при г-м появлении дерева п в вершинах r-го уровня про- произойдет вычисление ф* [М] по формуле (9). Таким образом, если s — максимальный уровень вер- вершин, то после s-ro появления графа п мы получим оконча- окончательно ф [М] А Деревья, значения функции ф [М], соотношения (8) и (9) напоминают нам понятия и конструкции, возникав- возникавшие при изучении транспортной задачи на сети. Это не слу- случайно — можно построить сетевую транспортную задачу, решение которой как раз и будет давать дерево кратчай- кратчайших путей. Рассмотрим транспортную задачу на графе (М, N) с вектором стоимостей с IN] и вектором потребностей b Ш], все компоненты которого равны 1, кроме Ъ 170] = 1 — Щ\ (для баланса). Оптимальному базисному решению этой задачи соответствует дерево (М, N'). Легко видеть, что
160 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ для существования допустимого решения необходимо, чтобы в (М, N') существовал путь из iO в любую другую вер- вершину графа. Легко видеть также, что этот путь для опти- оптимальности решения должен быть кратчайшим. Наконец, потенциалы v Ш] для базисных дуг должны удовлетворять равенству v [/ («)] = v li («)] + с [и], а для остальных дуг неравенству v [/ (ы)] «S v И (и)] + с [ы], A0) откуда следует, что v [/] = min {v li (и)] + с[и]|ае NQ, т. е. при v НО] = 0 вектор потенциалов является векто- вектором кратчайших длин. Метод потенциалов для задачи о кратчайшем пути не- несколько преобразуется. Построение потоков по базису в данном случае лишено смысла. Потенциалы считаются, как и раньше, по дереву, но в каждом случае вычисляется потенциал конца дуги по потенциалу начала. Вводимая в базис дуга (на которой нарушается условие A0)) по- порождает цикл, состоящий из двух различно ориентиро- ориентированных путей. В отрицательно ориентированном пути потоки по дугам убывают по мере их удаления от /0, поэ- поэтому дугой с минимальным потоком всегда является по- последняя дуга отрицательно ориентированного пути. Таким образом, изменение базиса заключается в том, что для некоторой вершины (именно для / (п) ~ конца вводимой в базис дуги) изменяется «прикрепляющая» дуга в точности так же, как это описано для метода рекур- рекуррентных соотношений. Отличие же от метода рекуррентных соотношений в том, что при каждом изменении базиса пересчитывается вся система потенциалов, для чего у всех вершин, следующих за / (й), потенциал уменьшается на одну и ту же величину — с[п]. Отметим, что ни один из описанных методов не требует положительности вектора с [N], требуется лишь, чтобы существовал путь минимальной «длины», понимаемый как сумма «длин» входящих в него дуг. Так как допустимое
§ 3. ЯЕРЕВО КРАТЧАЙШИХ ПУТЕЙ 161 решение в случае искусственных дуг всегда существует, то для существования оптимального решения необходимо и достаточно, чтобы в графе не было контуров отрицатель- отрицательной «длины» Задачи, для которых это замечание существен- существенно, встретятся в § 4 Для случая положительного вектора с [Л/] следует отметить одну особенность метода потенциалов: он полу- получается особенно простым, если начинать решение с искус- искусственного дерева и на каждом шаге включать в базис дугу с наибольшей разностью, Алгоритм выглядит следующим образом: множество М разделяется на два подмножества; Л40 — вершины, крат- кратчайшее расстояние до которых уже вычислено, М' — остальные вершины. Первоначально Мп = {i0}, M' = = М — i0. 1°. Вершинам из М' приписывается расстояние / [г], равное f1 [i0, i], где Р определяется по формуле A) 2° В М' разыскивается вершина ix с минимальным зна- значением / [?] и включается в Мо. 3° Для оставшихся вершин из М' значения / [/] пере- считываются по формуле f Ш := min {/ til, / KJ + f1 lilt /]}. Этот пересчет удобно производить «счетом от себя»: для всех и е Wf, f i/ (и)} : = min {/ I/ (и)], / [t\l + о [и]}. 4е. В случае, если М' не пусто, перейти к 2", если пусто, завершить вычисления Этот алгоритм называется алгоритмом Дейкстры. Его отличительная особенность — окончательность решений о длинах кратчайших путей до вершин из Мо. Алгоритм Дейкстры в настоящее время считается самым эффектив- эффективным Имеется много вычислительных разновидностей этого метода, рассмотрим здесь одну из них, которая, хотя мы ее и опишем в терминах алгола-60, будет по используемой технике представления данных находиться вполне на уровне алгола-68 Следуя Дейкстре, разобьем множество М' на два под- подмножества: М — множество вершин, до которых расстоя- расстояние уже начало вычисляться, М2 — все остальные вер- вершины Вершины из М, соединим в цепной список, 6 И. В. Романовский
162 ГЛ, 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ упорядочив их по возрастанию / t/J, и для каждой вершины I укажем предшествующую рге Щ и следующую next [i]. Благодаря этому упорядочению значительно упроща- упрощается поиск в п. 2°. Вычисления п. 3° могут проводиться отдельно для каждой дуги и е <Vf,. Их можно разбить на такие действия: 3. Г Если / (и) е= Мо V / (и) е Л1Х Д f I/ (и) < / Ux] + + в [«], никаких изменений не делать и перейти к п. 3.4°. 3.2Р • f [/ (и)] := f Цг] + о [и]. Если / (и) е Mlt то исключить / (и) из цепи (ср. процедуру .exclel из гл. 1): next [pre [/ (и)]] ;= пел:^ [/ («)]; рге [яел;^ [/ (ы)]] :== рге [/ (ы)] 3.3° Найти в цепи k, для которого f [pre Ш] < / [/ («)] < f [k], и вставить / (м) в цепь между pre \k\ и к next [pre [?]]: = / (ы); pre[j(u)\. =pre[k]; next\j{u)\.=k\ pre[k]: = i(u). После этих действий перейти к п. 3.4°. 3.4° Если в Nj, есть еще дуги, вернуться к п. 3.1° для обработки следующей дуги. Многократный поиск k в цепном списке несколько облегчается, если при задании графа расположить дуги, входящие в каждое Nl, в порядке возрастания с [и] В этом случае каждая следующая из вершин / (и) должна рас- располагаться в цепном списке (если только ее заново вклю- включают в список) дальше предыдущей, и на каждой итера- итерации цепной список просматривается только один раз. Таким образом, общая трудоемкость метода Дейкстры оценивается величиной порядка s х \М\ + \N\, где s — максимальная длина цепного списка в ходе вычислений (очевидно, что s ^ \М |). Теперь соответствующую процедуру на алголе-60 мы приведем без дальнейших комментариев, предупредив толь- только, что up Ш — это дуга, ведущая в i в оптимальном дереве, а массив / должен по техническим причинам иметь (т 4- 1)-ю компоненту. Читателю будет полезно сопоставить текст процедуры с изложением алгоритма:
§ 4. КРИТИЧЕСКИЙ ПУТЬ 163 procedure dijkstra(m, с, j, 1st, iO, f, up); value tn, Ю; integer m, Ю; integer array /, 1st, up; array c, f; begin integer i, il, 12, u; real /1, /2; integer array next, prec[\ :m+l]; for t: = 1 step 1 until m do begin / [/]: = gz; next [i]: = prec [/]: = up [i]: = 0 end; f[fO]: = .O; f[m+l]:=gz + gz; prec[m+\]: = iO; next [/0]: —m'-\-\; il: = iO\ tnkit: if il—m+l then go to mkfin; iO: = il; i: = il: = next[il]; /1:=/[Ю]; for u: = lst[iO-\]+l step 1 until lst[iO] do begin г2: = /[«]; /2:=/l+c[«]; if /2</[t2] then begin / [t2]: =/2; up [i2]: = a; if next[i2)^m then begin next[prec[i2]]: — next[i2]; prec [next [i'2]]: = prec [72] end; mAi: if /[?]<f2 then begin i: = next\i]; go to m&i end; «ел:/ [prec [i]]: = i2; prec [i2\. = prec [i]; next [i2\. = i; prec [i]: = /2 end end u; go to tnkit; y mkfin: end § 4. Критический путь В некоторых моделях возникают задачи о нахождении не самого короткого, а, наоборот, самого длинного пути между двумя заданными вершинами графа. Здесь мы опи- опишем метод решения этой задачи и рассмотрим одно из ее важнейших приложений, которое связано с вопросами управления работами над сложными объектами (стройками, проектированием и т. д.). Однако, прежде чем говорить о приложениях, рассмотрим саму задачу. Задача о максимальном пути. Задан граф (М, N), не имеющий контуров, и каждой дуге и сопоставлено неотрицательное число /[и] — длина этой^ дуги. Заданы две вершины i_, t+ e M. Тре- Требуется найти путь из t_ в i+, имеющий наибольшую длину, где под длиной пути понимается сумма длин входящих в него дуг, 6*
164 ГЛ.. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Изменением знаков у t[u] можно свести задачу к задаче о кратчайшем пути, которая в этом случае будет иметь решение, так как (М, N) не имеет контуров. Для вычис- вычисления решения пригоден любой из алгоритмов, описанных в § 3, кроме алгоритма Дейкстры. Важно отметить, что из результатов § 3 следует, что можно говорить о дереве максимальных путей, которое решает все задачи о мак- максимальном пути с фиксированной начальной вершиной /_. Заметим еще, что можно было бы говорить и о дереве мак- максимальных путей, входящих в вершину (+, которое решало бы все задачи с фиксированной конечной вершиной. Можно, однако, не пользоваться алгоритмами § 3 непо- непосредственно, а видоизменить их для нашей задачи. Если мы ищем дерево максимальных путей, выходящих из i_, то мы должны ввести вектор v IM] — максимальных рас- расстояний от i до всех вершин и написать для него урав- уравнение v [i] = max {t[u\ + v [i (и)], и <= N-], Величины v [i], так же как и раньше, естественно на- называть потенциалами. Потенциалы вершин можно нахо- находить по уровням дерева максимальных путей: если вычис- вычислены потенциалы для всех вершин, непосредственно пред- предшествующих г", то по A1) можно вычислить и v [i]. Однако, вместо того чтобы пользоваться формулой A1), можно всякий раз, как будет установлено, что у верши- вершины v [i] потенциал имеет окончательное значение, для всех дуг и е Ni проводить вычисление v Ц (и)] := max {и [/ (и)], t [и] + v [i]}. A2) Таким образом, к тому времени, все как дуги из Nt будут просмотрены, v li] будет удовлетворять A1). Полезно для каждой из вершин помнить, сколько дуг, входящих в эту вершину, еще не просмотрено. Когда это число next [k] обращается в нуль, вершину можно вклю- включать в число «готовых» для того, чтобы просмотреть выхо- выходящие из нее дуги. Эти «готовые» вершины можно хранить с помощью цепного списка, причем поскольку для них next [k] = 0, то ссылки на следующие вершины можно хранить в том же массиве next чем и вызвано такое его название.
§ 4. КРИТИЧЕСКИЙ ПУТЬ 165 Так мы получаем следующую процедуру: procedure maxpath(m, n, t, j, 1st, Ю, v, up); value m, n, Ю; integer m, n, /0; integer array /, 1st, up; array t, v; begin integer i, i\, k, ml, u; real z; integer array next [0 : m]; for i: = l step luntil m do begin v[i]:= — gz; next[i]: — up\i]: = 0 end; for u: = 1 step 1 until n do next [/[«]]: = next [/[«]]+ U ml: = m+l; ne^[0]: = il: ==/0; m^t7: nex^fil]: = ml; if nex/[0] = ml then go to mkfin; i: = nexi\0]; z: = v[i]; for ы: = Ы[{—I]+l step 1 until Ы[г] do begin k\ = ;[«]; next[k]: = next[k]—l; if у[/е]<г + /[м] then begin и [А]: = г+ /[«]; up\k]: = u end; if лек* [/fe] = 0 then / i: = «^ [/1 ]: = k end u\ next [0]: = next [i]; go to тйг7; mkfin: end maxpath Легко заметить, что эта процедура для «неправильно составленных» графов, в которых есть контуры или не до всех вершин можно добраться из i_, даст неполное реше- решение. Однако вершины, в которых значение потенциала не вычислено, видны по массиву v [M], где им соответ- соответствует значение — gz. Теперь обратимся к задачам управления сложными комплексами работ. Граф, который возникает в таких задачах, трактуется следующим образом (он называется графом работ или сетевым графиком): его дуги соответ- соответствуют выполняемым работам. На очередность выполне- выполнения этих работ (множество которых N задано) наложены некоторые ограничения предшествования, — для каждой работы и указано множество работ Nu, которые должны быть завершены до того, как начнется выполнение и. Указание множества предшествующих работ является зада- заданием квазипорядка на множестве N. Можно рассматривать транзитивное замыкание этой системы предшествований. Обозначим множество всех работ, предшествующих и, через Na. Представляет интерес и сама задача построения графа по набору предшествований на множестве N. Анализ этой
166 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫ". ТРАНСПОРТНОЙ задачи несколько громоздок, однако без него мы не смо- сможем выяснить, что представляют собой вершины этого графа и как в принципе выглядит алгоритм построения сетевого графика. Нужно, однако, отдавать себе отчет в том, что практические алгоритмы построения сетевого графика выглядят значительно проще. Будем здесь предполагать, что каждый класс эквива- эквивалентности нашего квазипорядка состоит из одной работы. В противном случае система предшествований работ над объектом является противоречивой и должна пересмат- пересматриваться. Для проверки непротиворечивости системы предшествований может быть использован алгоритм из § 1. Итак, мы имеем некоторый набор подмножеств {NH}neN множества N. Поскольку среди Nu могут встретиться оди- одинаковые, введем самостоятельную индексацию для раз- различных подмножеств этого набора, обозначая их через N-T, х е Т. Естественно, что каждому и е N соответствует однозначно определяемое т & Т такое, что Nu = Nx. Каждое из множеств N% задает разбиение У1% мно- множества yv на два подмножества Nt, N \ Nx- Рассмотрим произведение этих разбиений По определению для любого т <= Т существует такое S (т) cz S, что № = Nt. A4) Обозначим через а (и) то а, для которого и е N%. Теперь мы можем строить наш граф. Каждому и ^ N сопоставим дугу. Вершинами графа мы будем сейчас счи- считать элементы t е Г и а е S. Началом дуги и будем счи- считать г (и), а концом а (и). Кроме этих основных дуг, вве- введем еще фиктивные дуги, идущие (для каждого теТ) из всех вершин S (т) в т. Построенный таким образом граф и является собственно полным и в некотором смысле пра- правильным сетевым графиком. Однако в использовании этот граф неудобен, и используется более простой граф, полу- получающийся из него после некоторых редукций. В результате редукций из графа удаляются некоторые фиктивные дуги и вершины.
§ 4. КРИТИЧЕСКИЙ ПУТЬ 167 Редукция графа основывается на следующих двух пра- правилах: 1. Если фиктивная дуга идет от вершины а к верши- вершине х, между которыми есть другой путь, эту дугу следует удалить. Фиктивные дуги служат для установления обязатель- обязательных предшествований между вершинами графа. Если это предшествование является следствием других предшество- предшествований, фиктивная дуга не нужна. 2. Если единственная дуга, выходящая из вершины (вхо- (входящая в вершину), является фиктивной, эту дугу следует, удалить и слить ее граничные вершины в одну. Мы различаем граничные вершины по необходимости — только из-за того, что из них выходит или в них входит по нескольку дуг. Если из вершины выходит только одна дуга — и при- притом фиктивная, — эта вершина не нужна, а значит, не нужна и дуга, которая устанавливает порядок у двух сли- сливаемых в одно целое вершин. Прежде чем заниматься обоснованием этого процесса, рассмотрим небольшой пример. Пример. Пусть N = { а, Ь, с, d, e, f, g, h, i, j, k, /}. Множества Nu и полученные транзитивным замыканием множества Nu выписаны в табл, 11. Таблица 11 и а Ь с d е f g h i j k I I i b g, g g /. a, — h, — I i c, f, g, h, e e I 1 b, g g — f, a, — h, — i i i c, f, g, h, e, I, b, I e, f, I, g
168. ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Среди множеств Nu имеется девять различных, Пере- Перенумеруем их числами от 1 до 9: Л/, = ф, Л/, = 1, N9 = g, Л/4 = /, Л/5 = {Ь, /}, N« = к, /}, N7 = {/, /, g}, Ns = {h, e, f, j, g}, NB = {a, c, f, g, h, e, I, b, /}. Произведение соответствующих разбиений состоит из восьми множеств, которые мы занумеруем числами из мно- множества 1 :8, Щ = /, Aft = g, Ml = /, Nt = b, Nt = f, N* = {A, e), Щ = {а, с), Щ = {d, i, k). Действуя по описанному правилу, получаем граф, изобра- изображенный на рис 43. Рис 43. Сетевой график до редукций. Риг 44 Тот же сетевой график после редукций. Далее начинается редукция графа, которая приводит к графу, изображенному на рис 44 Фиктивные дуги изображены на этих двух графах штриховыми линиями. В реальных задачах фиктивных дуг обычно оказывается значительно меньше.
§ 4. КРИТИЧЕСКИЙ ПУТЬ 169 Покажем теперь, что последовательность редукций не существенна для окончательного результата Теорема 3. Граф, получающийся из графа (М, /V) в результате описанных выше редукций, не зависит от по- порядка применения этих редукций Доказательство Легко видеть, что редукции обоих типов не изменяют свойств связности графа — если до редукции существовал путь из i в /, то после редукции путь из i в / также найдется. Поэтому дуги, которые могут быть удалены по первому правилу, определяются одно- однозначно. Рассмотрим множество Fl фиктивных дуг, которые при какой-либо последовательности редукций могут быть уда- удалены по второму правилу. Для каждой такой дуги по опре- определению имеется последовательность предшествующих ре- редукций, которые должны быть проведены (и могут быть проведены) до удаления этой дуги. Покажем прежде всего, что имеется последовательность редукций, при которой исключаются все дуги из F, Взяв одну из дуг, занумеруем предшествующие ей по порядку исключения из графа дуги, после чего присвоим очередной номер ей самой Выберем какую-либо из оставшихся дуг и перенумеруем очередными номерами те из предшествую- предшествующих дуг, которые еще не получили номеров (а затем и ее самое) Будем повторять этот процесс до полного исчер- исчерпания Fv По самому построению этой нумерации она дает поря- порядок, в котором фиктивные дуги, принадлежащие Fu могут исключаться из графа Пусть при какой-нибудь последовательности редукций удалено некоторое множество Fo с Fv Если Fx \ Fo не пусто, выберем в нем дугу / с минимальным номером. Очевидно, что так как все редукции, предшествующие удалению f, уже сделаны, то f можно удалить Таким обра- образом, никакая последовательность, не исчерпывающая Fx полностью, не может быть окончательной. ^ Обоснованность процедуры построения графа может быть проверена следующим образом: если задан некоторый граф, удовлетворяющий всем требованиям, которые предъ- предъявляются к сетевому графику, и по этому графу составлена система предпочтений для дуг, то процедура должна вос- восстанавливать этот граф.
170 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ К сожалению, описанная процедура этим требованиям не удовлетворяет. На рис. 45 и 46 изображен граф, послу- послуживший оригиналом, и граф, полученный после редук- редукций. Имеющимися редукциями невозможно удалить дугу х, ¦ .</ d * ' Рис. 45. Рис. 46. Однако удается доказать, что в ограниченном классе случаев эта процедура дает в точности нужный граф. Теорема 4. Пусть (М, N) — граф без фиктивных дуг, не имеющий контуров, причем существуют такие i_ и i+, что любая дуга лежит на каком-либо пути из ?_ в t+. Обозначим через Д/ц множество дуг из N, предшествующих и. Описанная процедура построения графа восстанавливает (М, N) по семейству подмножеств {Na}ueN. Доказательство. Транзитивными замыканиями множеств Na мы здесь ограничиваемся для простоты. Прежде всего отметим, что в получающемся графе i_ и i+ определяются однозначно: i соответствует элементу тое= Т (из i_ выходят дуги, не имеющие предшественников), г+ соответствует элементу а0 е S, состоящему из дуг, кото- которые никому не предшествуют В графе, получающемся после построения, будут при- присутствовать все дуги из N и некоторое множество фиктив- фиктивных дуг F. Мы должны показать, что все это множество при редукциях будет удалено, а дуги, инцидентные одной вершине, соединятся в ней.. Легко показать, что дуги, выходящие из одной вер- вершины в (М, N), будут выходить из одной вершины и в по- построенном графе, т. е каждой вершине, из которой выхо- выходят дуги, соответствует элемент множества Т. Действи-
§ 4. КРИТИЧЕСКИЙ ПУТЬ . 171 тельно, всем этим дугам предшествует одно и то же мно- множество дуг, а для дуг, выходящих из другой вершины, множество предшественников другое. Аналогично каждой вершине, в которую входят дуги, соответствует элемент ае5. Все дуги, входящие в вершину i, одновременно предшествуют или не предшествуют каждой дуге, поэтому УУ,;" лежит полностью в каждом из Nx, с которым пересе- пересекается. Значит, N[ лежит целиком в одном из элементов разбиения ч)с. Других дуг в этом элементе быть не может, так как такая дуга п предшествовала бы другому набору дуг, а значит, для какого-то и разбиение WxW разделило бы й и Щ- Все фиктивные дуги построенного графа можно разде- разделить на два класса — фиктивные дуги, соединяющие вход в вершину и выход из вершины исходного графа, и фиктив- фиктивные дуги, описывающие ненепосредственные предшество- предшествования. Дуги второго типа по самому своему происхождению имеют обходные пути и исключаются по первому правилу. Дуги первого типа (после того как исключены все дуги второго типа) исключаются по второму правилу, так как после этого из каждой вершины выходит не более одной фиктивной дуги. А Сделаем теперь несколько замечаний, относящихся к тер- терминологии и проблематике управления работами с помощью описанной модели. В сетевом планировании фиктивные дуги, как и настоя- настоящие, называются работами. Продолжительность настоя- настоящих работ считается известной, для фиктивных работ продолжительность принимается равной нулю. Вершины называются событиями. Естественно продолжить эту тер- терминологию и считать, что событие наступило, если выпол- выполнены все работы, входящие в соответствующее ему мно- множество. Основная задача сетевого планирования — это задача о нахождении моментов наступления различных событий. Исходными данными в этой задаче являются момент наступ- наступления «начального» события и продолжительности работ, которые положительны для настоящих работ и равны О для фиктивных. Каждая работа ограничена условием выпол- выполнения предшествовавших ей работ. В терминах графа Можно сказать, что работа начинается не раньше, чем наступит событие, являющееся ее началом.
172 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Таким образом, для того чтобы найти момент самого ран- раннего наступления события, нужно вычислить максималь- максимальную длину путей, ведущих из г0 в соответствующую вер- вершину. При этом путь максимальной длины от начала проекта /0 до конца проекта i+ называется критическим. Ранние начала вычисляются по формуле A1) и о них уже сказано достаточно. По аналогии с ранними началами определяются поздние моменты наступления событий — самые поздние сроки наступления событий, при которых общее время выполнения работы не увеличивается. Поздние моменты w\M] удовлетворяют похожему на A1) условию w Щ = min {w [j (и)] — t [и] | и е Nl), w [i+] = v [i+]. A5) Отметим еще, что величина p[u] = wlj(u)]-v[i(u)]-t[u] .A6) называется резервом времени работы и. Дуги, для которых резерв времени равен нулю, называются критическими. Предложение 5. Для того чтобы дуга была кри- критической, необходимо и достаточно, чтобы она принад- принадлежала какому-нибудь критическому пути. Доказательство. Действительно, пусть рас- рассматривается дуга и с началом i и концом /. Рассмотрим самый длинный путь из i_ в i (его длина равна v [i]) и самый длинный путь из / в г+ — (его длина равна w \i+] — w [/]). Очевидно, что для того чтобы р [и] = 0, необходимо и достаточно, чтобы v [г] + t [и] + w [Q - w [/] = v UJ, т. е. чтобы путь, составленный из и и этих двух путей, был критическим. ^ Следствие. В графе (М, Nc), составленном из кри- критических дуг, любая дуга лежит на пути из i_ в i+. Таким образом, граф (М, Nc) может рассматриваться как самостоятельный сетевой график. Мы рассмотрели только одну из задач, связанных с орга- организацией работ. Имеется большое число дополнительных проблем, относящихся к той же области, — вероятност- вероятностные модели, оценки продолжительности работ, составление расписаний при ограниченности числа исполнителей, рас- распределение финансирования по работам. Один из вариантов этой последней задачи будет рас- рассмотрен в § 7.
§ 5. КРАТЧАЙШЕЕ ДЕРЕВО 173 § 5. Кратчайшее дерево Задача о дереве кратчайших путей естественно наводит на мысль об аналогичной задаче — задаче о построении дерева с минимальной суммой длин дуг. Итак, пусть задан связный граф (М, N) и вектор с [N] длин его дуг. Требуется найти N' с: N так, чтобы графШ.ЛГ) был деревом, а сумма 1 IN'] х с [N'] была минимальна. Для решения этой задачи имеется весьма простой и эффективный алгоритм последовательного построения де- дерева (похожий на алгоритм, описанный в теореме 1 гл. 3): мы будем рассматривать последовательность деревьев (М', N'), увеличивая на каждом шагеМ' на одну вершину, a JV' — на одну дугу, соединяющую эту вершину с имею- имеющимся деревом. Первоначально мы выберем произволь- произвольное i0 е М и образуем М' = {г0}, N' = ф. На каждом шаге процесса, пока М' фМ, из всех дуг, одна гранич- граничная вершина которых лежит в М', а другая в М \ М', выбирается дуга наименьшей длины. Эта дуга включается в /V', а ее начало и конец в М' (что пополняет М' на одну вершину). Теорема 5. Дерево (М, N'), полученное в результате работы алгоритма, имеет наименьшую длину. Доказательство. Пусть (М, N") — некоторое другое дерево. Покажем, что 1 IN'] х в Ш'] < 1 IN"] х с IN"]. A7) Перенумеруем вершины из М в порядке их включения в М'. Пусть т (г) — номер i-й вершины, т (i0) = 0. Каждая дуга и из jV' имеет номер п (и), равный максимуму из номе- номеров граничных вершин. Найдем в ЛГ дугу с наименьшим номером, не содержа- содержащуюся в N" Обозначим ее через й, а ее номер через k. Добавление этой дуги к N" порождает в графе (М, N") однозначно определяемый цикл, среди вершин которого есть вершины с номерами, меньшими k, и есть вершины с номерами k и больше. Поэтому в цикле найдется дуга и, одна граничная вершина которой имеет номер меньше k, а другая не меньше k. По определению й мы имеем с [и] =^ *?; с [и], и поэтому замена и на и в графе (М, N") не уве- увеличивает длины графа и оставляет его деревом.
174 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Повторяя этот процесс до полного совпадения N" с Л/, мы придем к A7), откуда уже и следует утверждение тео- теоремы, а Вычислительная реализация этого алгоритма (алго- (алгоритма Прима — Краскала) сложности не представляет. Отметим только, что здесь выгодно использовать те же идеи организации вычислений, которые были в методе Дейкстры. Важно отдавать себе отчет в том, что задачи с такими простыми алгоритмами — счастливое исключение. Это хо- хорошо видно на этой задаче — достаточно чуть-чуть изме- изменить ее формулировку, и трудность ее существенно изме- изменяется. Вот пример: Задача о кратчайшем дереве путей. Найти А/' с N так, чтобы граф (М, А/') был иерар- иерархическим деревом с корнем в г0, а сумма 1 IN'] х с [А/'] была минимальна. Еще один вариант постановки задачи: Задача о частичном дереве. Пусть задано непустое подмножество Мо с М. Найти частичный связный подграф (Мх, Ny) графа (М, N) так, чтобы Мо с. Mi и сумма 1 [A/J х с [Л/J была мини- минимальна. Решение первой из этих задач достаточно просто, хотя и существенно отличается от алгоритма Прима — Кра- Краскала, о второй задаче и сходных с ней речь пойдет в сле- следующей главе Итак,' пусть задан граф (М, N) и неотрицательный вектор с Ш]. По формуле A) образуем матрицу <р [М, М] кратчайших однозвенных переходов от вершины к вершине. Так как в каждую вершину дерева (кроме i0) должна вхо- входить ровно одна дуга, можно пересчитать ф по формуле Ф Ш, ;] : = ф Ш, i] — 1 Ш] х min {ф [/, i] | / ф i). Рассмотрим граф (М, Л/о), где А/о = {(/, /) | Ф U, /] = О, i ф /}. В этом графе может не быть путей из t0 во все дру- другие вершины. В таком случае в этом графе найдутся кон- контуры. В каждом классе эквивалентности этого графа (в тер- терминологии § 1), как это отмечалось в гл. 3, существует иерархическое дерево с корнем в любой его вершине,
§ 5. КРАТЧАЙШЕЕ ДЕРЕВО 175 поэтому о переходах в классах эквивалентности уже можно не беспокоиться, и нам нужно построить переходы между классами. Проведем редукцию графа (М, Л/о) и для получившихся вершин положим Ф [С, /] = min {с [«] | i (и) е Mr, j (и) е М>). Для получившейся матрицы повторим процедуру пере- пересчета, построим граф (М, Л/о) и т. д. до тех пор, пока мы не получим граф, в котором из г0 можно попасть в любую вершину. При обратном процессе восстановления графа по его редукции мы будем в каждом классе эквивалентности вос- восстанавливаемого графа строить иерархическое дерево. В ка- качестве корневой вершины этого дерева будет выбираться конец дуги, ведущей в этот класс. Пусть, например, М = 1 : 10 и ф Ш, М] задается табл, 12. После пересчета мы получаем табл. 13, соответ- соответствующий граф<М, jV0) изображен на рис. 47. В этом графе Рис. 47. Граф нулевых переходов первой итерации. классами эквивалентности являются {2, 6, 7}, {3, 5, 8}, {4, 9, 10}; для них мы получаем матрицу ф [М, М], представлен- представленную в табл 14. Пересчет дает табл. 15 и рис. 48. В полу- получившемся графе есть путь из / во все вершины. При вос- восстановлении получаем граф, изображенный на рис. 49. Этот алгоритм удобно (с некоторыми изменениями вычислительного характера) описывается на алголе-68. Мы запишем его в виде процедуры, входными параметрами которой будут массивы, задающие информацию о графе, но сначала скажем об изменениях Граф б^'дет храниться
176 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ S 4 Б 6 7 8 9 10 1 2 3 4 5 е 7 8 9 Ю Таблица 12 6 7 8 9 10 X X 9 7 2 6 6 X 2 8 2 7 X 8 5 2 5 3 6 X 1 9 8 1 8 6 X О, 2 1 X 6 7 6 3 3 X 9 3 9 X 3 6 2 5 4 9 1 X Таблица 13 1 234 5 6789 10 X X 7 5 0 4 4 6 X 0 6 0 5 X 6 3 0 3 2 5 X 0 8 7 0 7 5 X 1 1 0 X 5 6 3 0 0 X 6 0 6 X 0 5 1 4 3 8 0 X Таблица 14 1 А В С Таблица 15 ABC X 7 X 5 4 3 6 X 5 5 3 3 X 1 А = {2, 6, 7} ?¦ = {3, 5, 8} С = {4, 9, 10} в виде набора звезд дуг, входящих в каждую вершину. В каждой такой звезде будет выделено по одной дуге — с минимальной длиной В графе, составленном из выделен- выделенных дуг, мы будем пытаться найти путь от i0 до какой-
§ 5. КРАТЧАЙШЕЕ ДЕРЕВО. 177 нибудь из вершин Г. Если такой путь найдется, то вер- вершина t" и все остальные вершины этого пути выбывают из рассмотрения Если же в процессе поиска найдется контур, мы его редуцируем, как в § 1, заменяя одной вер- вершиной. Звезды вершин контура, объединяются при этом (с удалением появляющихся петель) в одну звезду, и для новой звезды отыскивается новая минимальная дуга. Рис. 48. Граф нулевых переходов второй итерации. Рис. 49. Кратчайшее иерархическое дерево. Трудной частью этого алгоритма является обратный ход Поскольку для дальнейшего нам не понадобятся детали этого алгоритма, мы предоставляем читателю в качестве упражнения повышенной сложности разобраться в нем с помощью комментариев: proc arborescence = (ref [] inf с, i, j, res, int Ю) void: begin со мы не задали число вершин и дуг графа, их мы по- получим как границы массивов со int т — upb res, n — upb с; со введем структурные виды для дуг и вершин и еще один для вспомогательной информации со mode arc = struct (ref ver vi, vj, ref arc next, int c); mode ver = struct (ref arc by, f, ref ver br, im, int a, s, bool act, w)\ mode mem = struct (ref arc w, ref ver v, int s);
178 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ со Информация о дуге содержит поле next для цепных списков, естественные ссылки на вершины и поле для стоимости. Информация о вершине сложнее: im — ссылка на вершину, «представляющую» данную в редукции графа, Ьг — ссылка для цепного списка класса эквивалентности, / — начало цепного списка звезды, by — ссылка на мини- минимальную дугу. Смысл информации, помещаемой в поля, a, s, act и w и в структуру mem, будет разъяснен позже. Введем теперь некоторые знакомые нам операции со prio dif = 1, cons= 1; op dif = (ref ver a, b) bool: a isnt b; op lin = (ref arc a) bool: a isnt nil; op cons = (ref ref arc a, ref arc b) ref ref arc: begin next of b: = a; a: = b end; op cons = (ref ref ver a, ref ver b) ref ref ver: begin br of b:=a\ a: = b end; со Работая с классами эквивалентности, мы будем перехо- переходить от одной «новой вершины» к другой по дугам старого графа. Часто нужно будет искать нынешнего представи- представителя начальной вершины дуги, выбранной для данной вершины. Для простоты опишем соответствующую про- процедур у. со ргос prec=(ref ref ver v) ref ref ver: im of vi of by of v; [1 : m] arc аи; [1 : n\ ver v; [1 : m] mem st; int a\, a2, i\, ist:=O, /1, min; ref arc u\, u2, u3, umin; ref ver ul, v2, v3, vi; со Описав необходимую память, перейдем к заполнению массивов. Вначале просто заполняется массив вершин со for i to m do v [(]: = (nil, nil, nil, v[i], maxint, 0, 1фЮ, true) od; со act помечает «активные» вершины, представляющие классы эквивалентности, еще не соединенные с Ю. В а будет записана минимальная длина дуги в звезде, которую мы сейчас построим со
§ 5. КРАТЧАЙШЕЕ ДЕРЕВО 179 for и to n do au\u]: = (v[i[u]], vl: = v[j[u]], skip, al: = c{u]); f of vl cons au[u]; if a of ul>al then a of vl:=al; by of yl: =au[u] fi od; for t to m do со начался основной перебор вершин со while act of v[i] do yl: =v2: = v [i]; while ш of vl[\act of yl do w of yl:=false; yl: = prec(vl) od; со маркируя путь, идем до пассивной или до маркирован- маркированной вершины со if w of vl then while v2 dif vl do act of y2:= false; y2: = prec (v2) od else со начинается разбор случая, когда найден контур. Очистим путь, оставив только контур со while v2 dif vl do w of u2: = true; v2: = prec (v2) od; mm: = maxint; w3: = umin: = nil; o2: = prec (vl); у of s/[tl: = ist-\-: = 1]: =yl; while у2 dif yl do уЗ: = Ьг of y2; v of s^[tl + : = l]:=y2; im of y2: = yl; ос/ of u2: = false; 6r of yl cons у2; while v3 dif ref ver (nil) do im of y3:=yl; у4: = уЗ; v3:=br of уЗ; 6a of yl cons vA od; у2: = prec (v2) od; for k from /s/ to 11 do у2:=у of st[k]; a2:=a of у2; u2:=f of у2; a of v2:=ist; со для каждой вершины в поле а запоминается момент, когда она перестала представлять класс эквивалентности со while lin u2 do if im of vi of «2 dif yl then «3 cons u2; if (al:=c of «2-: = a2)<mm then rnin:=al; umin: = u2 fi fi; «2: = «ex/ of н2 od od; со Мы исключили все вершины контура из «активной» информации, но у1 должны сохранить. Для обратного
180 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ хода потребуется некоторая информация о vl, которая и сохраняется в очередной записи mem: это ссылка на vl, предыдущая дуга с минимальной стоимостью и номер пре- предыдущей такси же записи со st[ist]: = (by of vl, vl, s of vl); ref ver (vl): = (utnin, «3, br of vl, vl, min, ist, true, true) fi od od; со Теперь начинается обратный ход. Мы должны оставить у каждой вершины по одной входящей в нее дуге из числа дуг, встречавшихся нам в ходе вычислительного процесса, причем дуги, которые встречались позже, пользуются привилегией со for i from ist by — 1 to 1 do if s of s/[i]SsO then /l: = 0; u3: = nil; al: = i; v4: = v2: = vj of {ul:=by of (vl: = v of st[i])); while v3 dif vl do i 1: = s of (v3:=v2); while П>/1 do il: = s of st[al: = il]; s of st [al]: = —1 od; /1: = a of v2 — 1; s of v2: =i\; by of v2: —u of s/[al]; v2: = v of s/[a of v2] od; bz/ of o4: = u\ fi od; for гг to л do с of au[u]: = u od; for i to m do res[t]: = if i = iO then 0 else с of au[by of t»[i]] fi od end § 6. Максимальный поток через сеть Эта задача является частным случаем транспортной задачи с ограничениями пропускных способностей. Задача о максимальном потоке. Пусть задам граф (М, N), положительный вектор егс пропускных способностей d [N\ и две вершины i0 — «источник» и i+ — «сток». Требуется найти поток х [N], удовлетворяющий во всех вершинах, кроме f0 и i+, усло- условию баланса потоков а И, Л/J х х Ш\ = 0, A8),
§ 6. МАКСИМАЛЬНЫЙ ПОТОК 181 условиям ограничения потока на дугах О Ш] -=? х [N] < d IN], A9) и максимизирующий поток, выходящий из /0 (равный потоку, входящему в i+): 1 Wf0] х х Wio]. B0) Величина B0) будет здесь называться величиной потока v. Для того чтобы свести эту задачу к транспортной задаче с ограничениями, достаточно добавить к графу еще одну дугу п <ф N, положив д/ = N -\- п, i (и) = г0, / (й) = /+, и определить с IN] (с [й] = 1, с IN] = 0 IN]) и Ь [М] ф li+] = — Ь [/„] = d [и] = d = 1 + 1 [ЛГ,-;] X * ВД, остальные 6 [i] равны 0). При этом мы получаем на графе (М, N) транспортную задачу с ограничениями пропускных способностей, экви- эквивалентную задаче A8)—B0). В ней минимизация потоков означает минимальную перевозку по дуге й, т. е. макси- максимальный поток через граф (М, N). Можно выписать для этой задачи двойственную и применить известные резуль- результаты теории двойственности. Интересно, что теорема двойственности для задачи о максимальном потоке приобретает уже совершенно ком- комбинаторный вид. Назовем разрезом такое множество Af* с N, что в лю- любом пути из iu в i+ в графе (М, N) содержится по меньшей мере одна дуга из N* (иначе удаление N* разрезает все пути из t0 в i+). Величиной разреза назовем сумму про- пропускных способностей включенных в него дуг. Теорема 6 (теорема о максипотоке и миниразрезе). Максимальная величина потока через граф (М, N) совпа- совпадает с минимальной величиной разреза. Доказательство. Легко показать, что любой поток, идущий от источника к стоку, представляется в виде суммы потоков vp, идущих по отдельным путям. Каждый такой путь содержит хотя бы одну дугу из разреза, ка- какой бы разрез N* мы ни зафиксировали Величина потока равна сумме величин элементарных потоков. Сумма элементарных потоков, содержащих дан-
•82 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ ную дугу из разреза, не превосходит ее пропускной спо- способности. Итак, Здесь Р — множество путей, а Р (и) — путей, содержащих дугу и. Итак, максимальная величина потока не превосходит минимальной величины^ разреза. Осталось показать, что они совпадают. Пусть N' — базис оптимального базисного решения транспортной задачи с ограничениями пропуск- пропускных способностей, N" — множество насыщенных дуг. Граф (М, N'}, который обязательно включает дугу б, является деревом. Удаление из этого графа дуги п делит его на две компоненты связности — компоненту, содержащую /0, и компоненту, содержащую i+. Обозначим множество вер- вершин этих компонент через Мо и М+ соответственно. Из v Цо] = О и с [и] — I легко получаем v Шо] = 0 [Мо], v Ш+] = 1 Ш+]. По теореме двойственности минимум в пря- прямой задаче равен максимуму в двойственной. Равенство с 1№ х х 1№ = v [М] х Ь [М] — р [N] х d IN] превращается в нашем случае в равенство х[п] =~d— I \N*] X dlN*] или 1 IN*] x d IN*] = d — x[u] = Zu^n- x [u]. B1) l 1 Здесь N* — множество дуг с началом в Мо и концом в Л1| Это множество, очевидно, образует разрез и содержите! в N", так как иначе были бы возможны улучшения опти- оптимального решения. Равенство B1) и доказывает теорему. А Алгоритм для нахождения максимального потока явля- является вариантом метода потенциалов. В нем, разумеется, не требуется реально вводить векторы с [N], Ь [М] и дугу п. Метод состоит из двух частей: поиска начального решения, состоящего из дерева (не обязательно кратчайших) путей из вершины i0 и последовательных улучшений. При каждом таком улучшении заданы две компоненты связности графа— поддерево, содержащее г0, и поддерево, содержащее i+ с заданными на них потоками. Заданы потоки и на всех остальных дугах. Если имеется ненасыщенная дуга, веду- ведущая из первой компоненты во вторую, она заменяет цепь, соединяющую /0 и i+, поток по которой и пересчитывается
§ 6. МАКСИМАЛЬНЫЙ ПОТОК 183 Рис. 50. Дерево кратчайших путей (нулевая итерация построения по- потока). Рис 51. Первая итерация Рис. 52. Вторая итерация Рис 53. Третья итерация.
ГЛ. 4. ЗАДАЧИ. РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Рис 54. Четвертая итерация- Рис 55. Пятая итерация. г Рис 56. Шестая итерация Рис. 57. Седьмая итерация. Рис 58. Окончательное решение.
§ 7. РАСПРЕДЕЛЕНИЕ РЕСУРСОВ 185 обычным образом до тех пор, пока не насытится какая либо дуга с положительной ориентацией или не станет нулевым поток на дуге с отрицательной ориентацией. Далее эта дуга выбывает из базиса, изменяется деление дуг на компоненты связности и процесс повторяется. Пример, Рассмотрим граф, изображенный на рис 50 Пропускные способности написаны рядом с дугами Жир ными линиями выделены дуги входящие в дерево путей. Путь может использоваться для потока в 2 единицы Дуга Ь разомкнётся, оставив граф, изображенный на рис 51 Штрихами выделена дуга, замыкающая путь. Далее полу- получающиеся графы приводятся без пояснений на рис 52—58 На рис 58 видно окончательное решение. Штрихами поме- помечены дуги разреза. § 7. Распределение ресурсов в сетевом графике Задача о максимальном потоке через сеть находит не- неожиданное применение в одной экстремальной задаче, развивающей схему сетевого графика. Задача распределения ресурсов. Пусть задан сетевой график (М N), в котором продолжительности работ линейно зависят от пара- параметра ft, t (и, ft) = U [и] — ft х а [и], а [и] > 0, B2) который для работы и может меняться на отрезке [0, d [и]]. На значения параметров ft [N] наложено условие ft IN] > 0 [N], 1 IN] х ft [ЛП ^6. B3) Требуется выбрать такой вектор ft [N\, удовлетворяю- удовлетворяющий B3), при котором длина критического пути была бы минимальна.' Будем решать эту задачу как параметрическую задачу с параметром G При 6 = 0 вектор /0 [ЛП задает продол- продолжительности всех работ. Найдем множество критических дуг Nc. При малом Э мы хотим найти такое распределение ресурсов, которое больше всего уменьшало бы критиче ский путь Очевидно, что дополнительный ресурс при малых 0 Должен вкладываться исключительно в дуги из Afc. Эти
186 ГЛ 4 ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ вложения будут пропорциональны в, и поэтому можно рассматривать вектор w \NC] скоростей увеличения ресурса # [Nc] Покажем, что можно ограничиться увеличением ресурса на дугах некоторого разреза графа (М, Nc). Действительно, множество N+ = {и | и е= Nc, w [и] > 0} B4) само должно представлять собой разрез, так как от вло- вложения ресурса должны уменьшиться все критические пути, т. е. все пути из i_ в i+ в графе (М, Nc). Выберем в N* ми- минимальный разрез Nx (т. е. разрез, в котором уже нет лиш- лишних дуг) и положим г = min {w [и] х а [и1 | « s A/j}. B5) Уменьшим на z продолжительность всех путей по разрезу A/j. Получится вектор остатков скоростей w [и] ; = ai[(il-6(ueilfi) х г х ее [и], и е N. B6) и новое множество Л^+. Пока это множество является разрезом, будем заново выбирать минимальный разрез (каждый раз он будет дру- другим) и пересчитывать w IN] по формуле B6). Если же множество N+ разрезом не является, то ресурсь тратятся нерационально — они не уменьшают какого-тй из критических путей, и если уменьшить исходный вектор 'w [Nc] на этот оставшийся вектор, то при том же уменьше- уменьшении критического пути затраты ресурса будут меньше, а при тех же затратах ресурса больше будет уменьшение критического пути. Таким образом, оптимальное распределение ресурсов должно состоять из выпуклой комбинации капиталовло- капиталовложений в минимальные разрезы. При этом в каждый раз- разрез Nl капиталовложение производится с вектором интен- сивностей р [N], где Р[и] = 1/а[и] B7) (продолжительность всех путей по разрезу уменьшается на одно и то же число). Естественно выбрать тот из мини- минимальных разрезов, на котором достигается минимум затрат на единицу уменьшения времени. Таким образом, мы полу- получаем задачу:
§ 7. РАСПРЕДЕЛЕНИЕ РЕСУРСОВ 187 Задача выбора разреза. Найти разрез N, в графе (М, Nc), на котором дости- достигается минимум ?jv,1/gi [и]. Обозначим решение этой задачи через R. Итак, при малых в вектор вложений ресурса г INc] будет выглядеть так: z [и] = у X б (и <= R) /а [и]. B8) Определим теперь, чем определяется максимальное зна- значение в = в0. Во-первых, значение суммарной затраты ресурса ограничено величиной в0 ?д г [и] *? в0 или v «S в/v^ A/а [«]) = gu B9) во-вторых, вложение ресурса в каждую из дуг и е R не должно превысить максимальное значение d [и] и, сле- следовательно, у sg min {d [и] х а [и] \ и е R) = g2. C0) Наконец, в графе при уменьшении некоторых дуг могут появиться новые критические пути. Найти субкритический путь просто — нужно в графе * (М, M\R) найти макси- максимальный путь из i_ в i+. Пусть его длина на т меньше длины критического пути. Тогда у =~с т и окончательно y = mm{g1,go,r}. В случае, когда у = gu ресурс исчерпан и решение окончательно; если у = g2, то для дуг, у которых ресурс достиг максимальной границы, мы полагаем а [«] = 0 и Р [и] — оо, для остальных дуг уменьшаем d [и] на у х Р[ы], соответственно изменяем /0UV] и 6 и решаем за- задачу заново. Для случая у = т, кроме таких изменений, мы должны добавить к графу (М, Nz) новые критические дуги, после чего снова задача решается заново. Отметим, что от шага к Шагу этого процесса минимум в задаче выбора разреза увеличивается (так как увеличи- увеличивается граф (М, Nc) или увеличиваются —до оо — значения некоторых из р [и]). Поэтому график изменения длины кри- критического пути выглядит примерно, как указано на рис. 59. Теорема 7. Описанный алгоритм дает оптималь- оптимальное решение задачи распределения ресурсов. Доказательство этой теоремы следует из того, что за- Дача распределения ресурсов может рассматриваться как параметрическая задача линейного программирования.
188 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ о в Найти v [Ml и у [N], удовлетворяющие условиям v Н (и)] + t0 [и] — а [и] х y[u]^v [j (и)], C1) 1 IN] х у [N] < в, C2) О Ш] < у [N] =sS d IN] C3) и минимизирующие v [i+] — v [i_]. Ограничимся здесь лишь наброском доказательства за- законности нашего метода, которое пригодно для всех пара- параметрических задач линейного про- программирования. В параметрической задаче ли- линейного программирования каждо- каждому допустимому решению х [N] мож- можно сопоставить пару точек (у, к), где у — значение целевой функции на этом решении и Я — значение параметра, при котором х [N] яв- является решением (если х [N] яв- является решением при нескольких значениях параметра, ему соответ- соответствует несколько точек). Когда х [N] пробегает все множество допустимых решений при всех значениях пара- параметра, пара (у, Я) пробегает выпуклое замкнутое много- многогранное множество (рис. 60). При одном и том же значении параметра все оптималь- оптимальные решения задачи проектируются в одну и ту же точку, принадлежа- принадлежащую нижней границе множества. При изменении параметра для получения оптимального решения следует двигаться из имеющегося оптимального решения по траекто- траектории, сохраняющей принадлежность нижней границе, т. е. по направле- направлению наискорейшего убывания целе- целевой функции. Легко показать, что скорость убывания целевой функции не зависит от того, какое именно оп- оптимальное решение имеется при данном состоянии параметра. Специфика рассматриваемой нами задачи используется Рис. 59. Зависимость дли- длины критического пути от ресурса. Рис. 60. Область значе- значений параметра и целевой функции.
§ 8. ПОКРЫТИЕ ГРАФА ПУТЯМИ 189 лишь в том, что при изменении решения оказывается невы- невыгодным уменьшение капиталовложений в дуги, в которые на предыдущих шагах процесса были сделаны положитель- положительные капиталовложения. § 8. Покрытие графа путями Пусть (М, N) —транзитивно замкнутый граф без кон- контуров, в котором нет дуг с одинаковыми началом и концом. Мы будем интересоваться вопросом о разбиении множества вершин этого графа на линейно упорядоченные подмноже- подмножества, т. е. о выделении в графе такого множества путей, чтобы каждая вершина принадлежала хотя бы одному пути. Транзитивная замкнутость графа позволяет свести эту задачу к эквивалентной задаче о поиске путей, в которых каждая вершина участвует ровно по разу Этот набор путей может быть найден в результате решения транспортной за- задачи на некотором вспомогательном графе. Что это за за- задача, будет видно из доказательства следующей теоремы, являющейся основной целью нашего рассмотрения. Теорема 8 (Дилворта). Минимальное число путей, содержащих все вершины из М, равно максимальному числу попарно несравнимых вершин. Доказательство. Так как несравнимые вер- вершины должны лежать на различных путях, то максималь- максимальное число несравнимых вершин не превосходит минималь- минимального числа путей. Для того чтобы показать, что эти два числа совпадают, сведем за- задачу о нахождении минималь- минимального числа путей к транспорт- транспортной задаче. _ Рассмотрим граф (M^N), в котором множество М со- состоит из двух экземпляров множества М (элементы пер- первого экземпляра (М, 1) мы будем обозначать (i, 1), где Рис. 61. Транзитивно замкну- сеМ, элементы второго экзем- тый граф пляра (М, 2) соответственно (i, 2)) и двух вершин г0 и t+ (рис. 61 и 62). Дуги мы будем задавать граничными вершинами, поэтому для задания графа можно каждой вершине поставить в соответствие множество
190 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ вершин, в которое можно из нее попасть. И для исходного графа положим Во вновь определяемом графе нужно для каждого t e M задать Mt. Положим Mi = ф для i <= (М, 1) и i — i+, Mio *= (М, 1) + ilt Положим теперь с [и] = 1 для всех дуг, входящих в вер- вершину i+ из (М, 2) и с [и] = 0 для всех остальных дуг. (Таким образом, с [и] = б (г (и) е (М, 2) Д / («) = i+).) Рис 62. Преобразованный граф. Потребление зададим вектором Ь [(М, 1)] = 1 [(М, 1I, b ЦМ, 2)] = —1 [(М, 2)], б [д = — ь [д = | м |. Эта транспортная задача (поскольку вектор цен неотри- неотрицателен) имеет оптимальное базисное решение. Легко ви- видеть, что в этом оптимальном базисном решении все ненуле- ненулевые потоки целочисленны. Если добавить потоки единичной величины из вершины (i, 1) в соответствующие вершины (i, 2), мы получим условия баланса потоков в этих верши- вершинах, и наш поток превратится в поток из i0 в ?+. Этот поток разлагается на элементарные потоки по путям из i0 в г+, причем число их будет равно (минимальному) значению целевой функции в транспортной задаче Легко видеть, что построенные так пути проходят через все вершины графа
§ 8. ПОКРЫТИЕ ГРАФА ПУТЯМИ . 191 (М, №) и им соответствуют пути в исходном графе (М, N), также проходящие через все вершины. Далее, базисность решения означает, что имеется базис- набор N' из | М | — 1 дуг такой, что (М, N') является деревом. Если удалить дугу (iu, i+), которая обязательно должна содержаться в любом базисном решении, граф (М, N') разобьется на две компоненты связности В пер- первой компоненте (содержащей Q у всех вершин будет один и тот же потенциал (равный, например, для удобства 1), во второй компоненте у всех вершин, кроме г+ с потенциа- потенциалом, равным 1, потенциал будет равен 0, По_теореме двойст- двойственности для оптимальных решений и* [М\ и х* [N\ мы должны иметь v* Ш) X Ь [М] = в IN] X х* [ЛП C4) v* [(г (и), 2)] >у* [(/ (и), 1)] для и е= N. C5) Из транзитивности графа (М, N) и из неравенства C5) следует, что не существует вершины i e M, для которой v [(/, 1)] = 0 и v [(i, 2)] = 1. Действительно, в этом случае существовала бы базисная дуга иъ входящая в /, и, следо- следовательно, v [(i (u^, 2)] = 0, и базисная дуга «2, выходя- выходящая из /, для которой v [(/ (и2), 1)] = 1 Но по транзитив- транзитивности графа тогда имеется и дуга иа, ведущая из / (их) в / (и2), для которой C5) нарушается. Рассмотрим теперь равенство C4). В правой его части стоит число путей, в ле- левой — число вершин из М, для которых (г, 1) принадлежит первой компоненте, а (г, 2) — второй компоненте (когда эти вершины принадлежат одной и той же компоненте, их суммарный вклад в целевую функцию равен 0). Обозначим множество таких вершин через М* и покажем, что вершины из М* попарно несравнимы. Действительно, если бы суще- существовал путь из i\ в i2, i'i, h g M*, to в этом пути нашлась бы такая дуга (t', i"), в которой (?', 2) принадлежит второй компоненте, а (/", 1) первой компоненте, а для этой дуги нарушилось бы условие C5). Итак, мы разбили граф на пути таким образом, что в ка- каждом пути найдется вершина из множества попарно не- несравнимых вершин а К теореме Дилворта сводятся многие комбинаторные теоремы двойственности.
192 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ § 9. Паросочетания в простых графах Граф (М, N) называется простым 1), если множество М разбивается на такие два подмножества Мх и Mit что на- начало любой дуги лежит в Mlt а конец — в М2. Мы уже несколько раз встречались с простыми графами. Паросочетанием простого графа называется набор дуг, все начала и все концы которых различны Естественно воз- возникает задача о выборе наибольшего такого набора. Теорема 9 (Кёнига) Наибольшее число дуг паросо- паросочетания равно наименьшему числу вершин в множестве, которому инцидентны все дуги графа. Доказательство Дополним граф вершинами ?0 и i+ и дугами, ведущими из t0 в Mt и из Мг в г+ с пропускной способностью 1, а на дугах из /V сделаем пропускную спо- способность больше | М | Легко видеть, что величина макси- максимального потока через такую сеть как раз и равна макси- максимальному числу дуг в паросочетании По теореме 6 величина этого потока равна величине минимального разреза Разрез состоит из вновь введенных дуг, число которых равно вели- величине потока Эти дуги определяют множество М' вершин из М, которым они инцидентны Любая дуга из N имеет в качестве одной из граничных вершин вершину из М' (иначе нашелся бы путь, увеличивающий поток) Это и дока- доказывает теорему А Следствие 1 (теорема Кёнига — Оре) Назовем де- дефицитом графа величину. б = max { | Л | — | Г Л | |Лс MJ, где ГА — {/ | NJ П (ihe^Nf) Ф ф}. Максимальное число дуг в паросочетании графа равно | М, | — б Доказательство Действительно, множество вершин, которому инцидентны все ребра, имеет вид В U Г (Ж, \ В), где В cz Мх. По теореме 9 максимальное число дуг в паросочетании равно s = min { | В |+ | Г (Mi \ В) | | В cz MJ. Далее имеем s = min { | Мг | — | А | + | ГЛ | | A a MJ = = | Mt | — max { | А \ — \ ГЛ | I А с 1) Употребляется гвкже термин «двудольный граф».
§ 9. ПАРОСОЧЕТЛНИЯ 193 Следствие 2 (теорема Кёнига — Холла). Назовем паросочетание полным, если число дуг в нем равно | Мг |. Для того чтобы паросочетание было полным, необходимо и достаточно, чтобы \ТА | ^ | А \ для любого А с M:. Действительно, условие означает, что 6 = 0. Следствие 3. Все члены г) определителя произволь- произвольной квадратной матрицы а [1 : п, 1 : п] равны нулю в том и только в том случае, если найдутся такие ЛГ, М" cz 1 : п, что a W, М"\ = 0 [ЛГ, ЛГ] и | ЛГ | + | ЛГ | > п + 1. Доказательство. Если сопоставить строкам матрицы вершины Мъ столбцам — вершины Мг ( I Мг | --- = lAf2l~ra). а ДУГУ из i'eMi в /е М-г проводить только при a U, /] т^О, мы получим простой граф. Ненулевому члену определителя соответствует в нем полное паросочетание. Если полного паросочетания нет, дефицит больше нуля. Множества М' f| Mlt M'~ (] М.2 и будут обладать требуе- требуемыми свойствами. А Матрица р [М, М] называется бистохастической, если р[М,М]^0Ш,М], %н=мр U, М] = У1еМ Р Ш, i] = 1 Ш]. Это название возникло в связи с теоретико-вероятностным происхождением таких матриц. Частный случай бистохастической матрицы — это пере- переставляющая матрица, которая была введена в § 1 гл. 1. Оказывается, переставляющие матрицы — это крайние точки множества бистохастических матриц. Теорема 10 (Биркгофа — фон Неймана). Всякая би- стохастическая матрица прсдставима в виде выпуклой ком- комбинации переставляющих матриц. Доказательство. Покажем, что в определителе бистохастической матрицы найдутся ненулевые члены. Действительно, если бы их не было, то по следствию 3 из предыдущей теоремы нашлись бы такие множества ЛГ, ЛГ с= М, что р [М1, ЛГ] = 0 [Л1\ ЛГ] и | ЛГ | -f | ЛГ | > > I М | + 1. Суммируя элементы матрицы р [М \ М',М"], 1) Членом определителя называется произведение П1С=1;ла [i, Ti], где Т — взаимно однозначное отображение Т : 1 : п -> 1 ; п. 7 И. В, Романовский
194 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ мы получим из C6) 21=м"(?шм\м-ри, /])= \М"\. Вместе с тем Х*ем\лг B/еМ» Р Н,/1) < I М\М' | = | М | - ! М' |, что дает неравенство |ЛГ|+|М"|=ё|М|, противореча- противоречащее выбору Ж' и /И". Далее, каждому ненулевому члену определителя соответ- соответствует переставляющая матрица г [М, М]. Положив к = = min {р U, /] | г Н, /] = 1}, мы можем представить мат- матрицу р Ш, М] в виде р[М,М\--=% х г Ш, М] -f A — Ц X pi [М, ЛП. Легко показать, что матрица р\ является также бистохасти- ческой матрицей и что у нее положительных элементов меньше, чем в р. Итерирование этого разложения приводит к утверждению теоремы. ^ Отметим возможность другого доказательства этой за- замечательной теоремы: ограничения C6) — это ограничения специфической транспортной задачи, в которой все объемы производства и объемы потребления равны 1. Любое базис- базисное решение такой задачи является целочисленным, сле- следовательно, состоит из нулей и единиц и представляет собой переставляющую матрицу. Транспортная задача с ограничениями C6) носит назва- название «задача о назначениях». Это название возникло из сле- следующей интерпретации задачи. Имеется т должностей и т претендентов на эти долж- должности. Назначение г-го претендента на /-ю должность приводит к убыткам с U, /]. Требуется распределить пре- претендентов по должностям так, чтобы суммарный убыток был минимальным. Задача о назначениях часто используется как вспомога- вспомогательная задача при решении дискретных задач, в которых требуется найти оптимальную в каком-либо смысле подста- подстановку. Для решения этой задачи был разработан специаль- специальный алгоритм, получивший название «венгерский метод», так как в нем существенно используются результаты вен- венгерского математика Эгервари,
§ 10. ВЕНГЕРСКИЙ МЕТОД 195 § 10. Венгерский метод для задачи о назначениях Общая структура алгоритма такова: он состоит из после- последовательных шагов, на каждом из которых делается по- попытка выбрать назначение при неотрицательной матрице убытков так, чтобы все выбранные элементы матрицы были нулевыми, Если это сделать не удается, матрица изменяется с сохранением свойства неотрицательности. При неотрицательной матрице значение целевой функ- функции задачи должно быть неотрицательно, поэтому если удастся получить «нулевое» назначение, о котором сказано выше, оно, очевидно, будет оптимальным. Для получения «нулевого» назначения нужно таким образом изменить мат- матрицу, чтобы минимальное значение целевой функции равня- равнялось нулю. Таким образом, невозможность получить «нуле- «нулевое» назначение показывает, что матрица еще недостаточно изменена. Метод изменения матрицы очень прост — он состоит из прибавления ко всем элементам какой-либо строки или столбца матрицы одного и того же числа, Поскольку в лю- любом допустимом решении должен быть ровно один элемент из этой строки (или этого столбца), к значению целевой функции при этом изменении прибавляется то же число. Первоначальная подготовка матрицы заключается в том, что от каждого элемента каждой строки матрицы вычи- вычитается наименьший в этой строке элемент Матрица стано- становится неотрицательной с нулевым элементом в каждой строке. Вычитание из каждого столбца наименьшего в нем элемента обеспечивает существование нулевых элементов и в столбцах. Основной шаг алгоритма состоит из поиска «нулевого» назначения и преобразования матрицы. Для «нулевого» назначения лучше воспользоваться терминологией простых графов, считать, что Мх — множество строк матрицы, М2 — множество столбцов и дуга из i в / идет в том и только в том случае, если а И, /] = 0. Тогда существование «нулевого» назначения эквивалентно существованию в этом графе пол- полного паросочетания. Будем разыскивать в нашем графе максимальное паро- сочетание (дающее наибольшее число «независимых» нулей— нулей, расположенных в различных строках и столбцах матрицы). По теореме 9 число дуг в максимальном паросоче-
196 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ тании равно наименьшему числу вершин в множестве, ко- которому инцидентны все дуги графа. В терминах матрицы теорема 9 звучит следующим образом: наибольшее число независимых нулей равно наименьшему числу вертикаль- вертикальных и горизонтальных линий (столбцов и строк), которыми можно перечеркнуть все нули матрицы. Итак, пусть построено максимальное паросочетание и найдены множества строк М' и столбцов М" так, что для каждого нуля a U, /] либо i е М', либо / е М". Пусть X = min {a U, /] |;еЖД М', / е М2 \ М"). Прибавим к к каждой строке М' и вычтем Я из каждого столбца М2 \ М". Значение целевой функции уменьшится при этом на X X ( | М, \ — | М" | - | М' |) > 0. Матрица останется неотрицательной, так как а [Мх, М"] не уменьши- уменьшилась, а Ш', М.г \ М"] осталась без изменений, а в a [Mi \ М', М2 \ М"\ наименьший элемент равен К. Это преобразование матрицы и завершает основной шаг алго- алгоритма. Осталось описать способ построения максимального па- росочетания и множеств М', М", Этот метод пригоден, разу- разумеется, для любого простого графа, и поэтому мы будем вести построение в терминах простых графов. Пусть в простом графе (Л1,, /И2, N) выделено уже паро- паросочетание /V*, / (N*) d Mi — множество начал дуг паро- сочетания, J (N*) а М2 — множество концов. Определим множества /* и J* таким образом, чтобы /* с / (jV*), J* с: J (N*), каждая дуга из Af* была инцидентна ровно одной вершине из /* U J* Если k — \ N* \, то, очевидно, k = | / (N*) \=\J (N*) | = | /* | + | J* |. Положим M* = I* + J*. Кроме самого паросочетания, для алгоритма требуется еще некоторое множество «кандидатов в паросочетание» УУ', которое будет постепенно пополняться и в котором для не- некоторых из элементов N* будут содержаться «дублеры». От N' мы потребуем, чтобы для каждой его дуги в М* наш- нашлась инцидентная ей вершина, но чтобы в Л^' нашлось не больше одной дуги, инцидентной любой вершине из М*. Кроме того, мы потребуем, чтобы граф (М, N* (J /V') не содержал циклов. Множество N' будет естественным образом
§ 10. ВЕНГЕРСКИЙ МЕТОД 197 разбиваться на N'_ = {и е= W, t (и) «= /*} и ^:={ке ЛГ, / (и) е= У*}- Перейдем теперь к описанию самого метода. Первона- Первоначально, кроме заданного Л/*, мы имеем I* =ф, J* — J (N*), N' = 0- Пополняя множество ЛГ и связывая его элементы с элементами Л/*, будем приписывать этим парам положи- положительные ранги г (и). Опишем теперь очередной шаг алгоритма (до увеличе- увеличения множества Л7* или установления его максимальности). 1° Если все дуги графа инцидентны М*, то построенное паросочетание максимально и работа алгоритма завершена. Пусть существуют дуги, не инцидентные М*. Ниже будем считать, что дуга и именно такова. 2° Если найдется дуга п, для которой i (ii) ф I (N*), j (а) ф J (N*), то а можно будет присоединить к './V*, и работа алгоритма завершится. 3° Если найдется дуга й, для которой i (й) е / (Л/*), сделаем ее дублером дуги из N*. В N* имеется единственная дуга и*, началом которой является i (а). Сейчас / (а*) е J*. Исключим конец дуги й* из У*, а ее начало включим в /*. Дугу а включим в N', Если концу дуги а не инцидентна никакая дуга из Л^*, припишем дуге й* ранг г (и*) = 1. .Если имеется и* eiV*, / (и*) = j (и) и, естественно, i (и*) е /*, положим г (а*) = г (и*) + 1 и вернемся к п. 1°. 4° Если найдется дуга а, для которой i (а) ф I (N*), но / (й) g J (N*), то множество N* можно перестроить с уве- увеличением его размера. Действительно, существует дуга и*, инцидентная / (й), i (и*) е /*, а значит, и дуга их <= N', выходящая из i (и*). Если г (и*) = I, то легко видеть, что найдется еще I — 1 пар н* е N*, u-t e N', причем последо- последовательность дуг а, и\, ult а%, ... , ut, щ образует цепь. Эта цепь имеет нечетное число дуг, ее начало г (и) и конец / (и1+1) не инцидентны JV*. Если мы заменим в УУ* дуги и* дугами щ и й, мы увеличим размер этого мно- множества и закончим работу алгоритма. На каждом шаге алгоритма множество jV* увеличивается на один элемент до тех пор, пока не обнаружится максималь- максимальность паросочетания.
198 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Покажем действие алгоритма на простом примере. Пусть простой граф задается матрицей (табл. 16), строки которой соответствуют Ми столбцы — М2, элементами являются названия дуг (там, где нет названия, дуга отсутствует). Таблица 16 11 12 13 14 15 16 17 1 2 3 4 5 6 7 а г Р h k g q v n b с e t d s f w X I m Первоначально пусть N* = {a, t, c, g, q, tn), N' = ф, /* ^ 0, J* = 12 : 17. а) По п. 3° дуга h становится дублером g, их общий ранг равен 1. Теперь N' = {Щ, I* = {5}, У* = {12, 13, 15, 16, 17}. Р) Дуга v становится дублером q, их ранг равен 2, N' = {h, v}, I* - {5, 6}, J* = {12, 15, 16, 17}. у) Дуга п становится дублером т, их ранг равен 2, N' = {h, v, п}, /* = {5, 6, 7}, У* = {12, 15, 16}. б) Дуга х — дублер с, ранг равен 3, N'= {hSv, п, х), I* = {3, 5, 6, 7}, J* ={12, 16}. е) Дуга Ь — дублер а, г (а) = 4, N' = {h, v, n, х, Ь), /• = {1,3,5,6,7}, J* ={16}. |) Дуга г — дублер t, r (t) = 5, N' = {/г, v, п, х, Ь, г}, /* = {1,2, 3, 5, 6, 7}, У* = ф. Теперь дуга s по п. 4° приводит к цепи (подчеркнуты дуги из N*) s, t, г, а, Ь, с, х, т, п, g, h, что дает новое паросочетание (очевидно, максимальное) N* = {q, s, г, Ъ, х, п, h]. Итак, справедливы следующие утверждения.
§ 10. ВЕНГЕРСКИЙ МЕТОД 199 Теорема 11. Алгоритм построения максимального паросочетания сходится за конечное число шагов. Теорема 12. Венгерский метод для решения задачи о назначениях сходится за конечное число шагов. Теорема 12 следует из предыдущей ввиду того, что на каждом шаге венгерского метода строится новое паросоче- тание, соответствующее большему значению исходной целе- целевой функции, а число наборов независимых элементов конечно. Можно оценить трудоемкость построения максимального паросочетания и получить из нее трудоемкость венгерского метода, однако приведенная нами вычислительная схема неоптимальна. Между тем венгерский метод в удачных реа- реализациях оказывается высокоэффективным. Удачная реализация связана с тем, что последовательно решается т задач о назначениях, в которых число столб- столбцов не больше числа строк и последовательно увеличи- увеличивается. При п — 1 оптимальное назначение находится триви- тривиально, нужно просто найти минимум в единственном столбце матрицы. При увеличении числа столбцов на 1 мы уже имеем набор из независимых нулей, стоящих в появившихся ранее столбцах. Во вновь появившемся столбце мы находим ми- минимум (с учетом потенциалов строк — тех вычитаемых, которые были определены из предыдущих расчетов), объяв- объявляем его новым нулем матрицы или дугой il из описанного алгоритма построения паросочетаний. Если этот нуль может дополнить имеющееся паросочетание, итерация кончается, в противном случае он оказывается дублером некоторого нуля из паросочетания и через него соединяет га-й столбец с одним из предыдущих. Они образуют теперь множество неперечеркнутых столбцов, в этом множестве среди не- неперечеркнутых строк разыскивается элемент минималь- минимальной стоимости, после чего изменением потенциалов соот- соответствующих строк и столбцов производится пересчет матрицы. Новый нуль может также быть в «занятой» строке — в этом случае появляется еще одна неперечеркнутая строка и процесс продолжается. Отметим, что при этом очень про- просто осуществляется поиск минимума — элементы нового неперечеркнутого столбца сравниваются с уже найденными минимумами строк предыдущей итерации.
200 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Если- же строка не занята, то, как в п. 4° алгоритма максимального паросочетания, строится цепочка, по кото- которой паросочетание изменяется с увеличением размера на единицу, что заканчивает процесс для вновь введенного столбца. В описываемом ниже алгоритме все необходимые связи осуществляются между строками матрицы, поэтому удобно ввести структуру row, описывающую строку. Полями этой структуры, кроме самой строки матрицы с, являются потен- потенциал строки vit текущий минимум по неперечеркнутым столбцам min, столбец, выбранный в данной строке w (w = 0, если такого столбца нет), и две ссылки на другие строки: wr — на строку, в которой находится дублер из столбца, выбранного данной строкой, р — для общего цеп- цепного списка строк. Этот общий цепной список разбит на две части ссылкой г\, строки, идущие до г\ включительно, являются неперечеркнутыми, а строки после г\ до конца списка г2 — перечеркнутые. Оказывается полезным ввести «нулевую» структуру гО и хранить в с of гО потенциалы столб- столбцов, в р of гО ссылку на начало общего цепного списка, а саму ссылку гО использовать вместо nil. Параметрами процедуры, кроме самой матрицы cost [1 : т, 1 : я] (где т ^ /г), являются векторы row [1 : п] и col [I : т], в которые записывается оптимальное назначение. Выраба- Вырабатываемое процедурой значение — это сумма выбранных эле- элементов матрицы cost. Дальнейшие комментарии приводятся прямо в тексте процедуры: proc gribov = (ref [,] int cost, ref [ ] int row, col) int: begin int m = upb col, n = upb row; int f: == maxint, d, s, vs, g, gl, u, u\; mode row = struct (ref row p, wr, int vi, w, min, [1 :n] int c); prio dif = 1; op dif = (ref row a, b) bool: a isnt b; [0: m] row a; ref row г, Ю: = а[0], r\, r2: — a[m], t, t\, t2; ref [ ] int vj: = с of rO; for i to m do p of a[i — 1]: —a[i\, vi of a[i]: — w of а[г']: = О; с of a[i]: =cost[i]; if (u: = (c of fl[»])ll])</ then f: = u; t:=a[i]f\ od; со Заполнен массив структур и найдено назначение для
§ 10. ВЕНГЕРСКИЙ МЕТОД 201 первого столбца. Осталось запомнить это назначение, после чего пойдет основной цикл добавления столбцов со р of г2: = гО; w of f: = l; j[] f for / from 2 to n do g: = 0; a: — maxint; r: = rO; /i: = r2; while r dif r\ do /: = r; wr of (r: = p of г): = И); jf (u: = min of r: = vi of r+(c of r)[/]<d then d: ^и; /1: = / fi od; со Сейчас перечеркнутых строк нет, поэтому г\ = г2. Выбрали минимальный элемент нового столбца, сформиро- сформировав попутно значения min и запомнили в й строку, пред- предшествующую выбранной (так удобнее) со while (s: = w of (t: — wr of Л))>0 do if /dif rl then p of /l:=p of /; p of /:=p of r2; r2:=p of r2:=t else rl: = /1 fi; со Выбранный элемент назначается дублером. Соответст- Соответствующая строка переводится во вторую часть общего списка (случай, когда она стоит в конце первой части, технически более прост) со vs: = vj[s]; /2: = rO; gl: = maxint; while /2 dif rl do r:=p of /2; if («l: = (c of r)[s] — us + f/ of r) <. (u: = min of r — g) then u: — u\; wr of r:=/ fi; if u<g\ then gl: = u; t\: = t2 fi; mm of r: = u, /2: = r od; со Находим минимальный неперечеркнутый элемент, по- попутно корректируя значения min. Если этот минимум оказывается положительным, корректируем потенциалы пе- перечеркнутых строк и соответствующих им столбцов со И (g:=gl)>0 then while r dif r2 do vj[w of {r.—p of /¦)]+:=?; ft of r +: = g od fi od; со Завершающие действия цикла— переброска назначений,
202 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ включение нового назначения, фиксация потенциала послед- пего столбца и изменение целевой функции со while (г: = wr of t) dif rO do w of /: = w of r; t: — r od; w of t:=j; vj\j]: = d; f+: = d od; for i to m do if (d: = col [i]\ =w of a [i]) > 0 then row[d]: = i fi od; f со оформление результата со end Этот вариант венгерского метода был разработан А. Б. Грибовым и показал себя очень хорошо в эксперимен- экспериментальных расчетах (исходная программа Грибова записана на алголе-60). Высоко эффективной является и программа А. Б. Грибова для транспортной задачи, построенная па тех же принципах. Следует, однако, иметь в виду, что венгерский метод существенно использует возможность быстрого обращения к любому элементу матрицы стоимостей и его буквальное использование при решении задач большого размера (тре- (требующих использования внешней памяти) может оказаться неэффективным. §11. Матрицы из нулей и единиц Матрица смежности г lMlt М2] простого графа может рассматриваться как набор характеристических векторов некоторых подмножеств из Мг (или как набор характеристи- характеристических векторов подмножеств из М2, если рассматривать строки этой матрицы). В последнее время появилось много работ и постановок задач, связанных с такими объектами. Мы перечислим здесь некоторые из вопросов, которые представляют практиче- практический интерес. Прежде всего терминология. Множество Mx с набором его подмножеств {#,-}, i e М2, называется гиперграфом, В комбинаторной топологии такой же объект называется комплексом остовов. Если с каждым множеством Rt гиперграф содержит любое его подмноже- подмножество, он называется матроидом (или соответственно полным комплексом). Естественно возникают также постановки задач.
§ П. МАТРИЦЫ ИЗ НУЛЕЙ И ЕДИНИЦ 203 Задача о различных представителях. Пусть | Мг | == т. Найти в М1 такое подмножество R, чтобы | R | = т и существовало взаимно однозначное отображение Т: R ~> М2, при котором i e Rt. для всех i е= R. ' Иными словами, требуется выбрать по одному предста- представителю из каждого подмножества так, чтобы все они оказа- оказались разными. Проще решать эту задачу, если говорить о множестве R с максимально возможным числом элементов (это число не превзойдет ш). Тогда можно просто убедиться в том, что мы получаем задачу о максимальном паросочетании в простом графе, которая нам уже знакома.- Более сложной оказывается следующая задача. Задача о наилучшем покрытии. Пусть задан положительный вектор с [М2\. Требуется найти такое подмножество S с М2, чтобы UteS Re = М1 и величина 1 IS] х с IS] принимала минимальное значение. Вариантом этой задачи является задача о наилучшем разбиении, в которой требуется дополнительно, чтобы мно- множества Rj, i <= S, были дизъюнктны и, следовательно, обра- образовывали разбиение множества Мг. Интересно применение методов линейного программирования для решения этой задачи. Рассмотрим следующую задачу. Найти вектор х [Мг], удовлетворяющий условиям r[Mi,Mi]-Xx[Mi] = l[M1], C7) х [ЛУ > 0 [М2] C8) и минимизирующий с Ш2] X х Ш2]. C9) Предложение 6. Любое допустимое целочисленное решение задачи C7) — C9) является характеристическим вектором некоторого подмножества S с М2. Базис, которому соответствует целочисленное допусти- допустимое базисное решение, можно описать следующим образом.
204 ГЛ. 4. ЗАДАЧИ, РОДСТВЕННЫЕ ТРАНСПОРТНОЙ Он состоит из двух множеств Si = {/ \х [/] =1} и S0 = {j\x [/] = 0}. При этом, очевидно, ни для каких дизъюнктных подмно- подмножеств базиса Rlt Ro с St [j So не должно выполняться г [Ми RJ х 1 [#,] = г [Mlt Ro] X 1 [Ro]. Можно несколько изменить схему вычислений метода последовательных улучшений и, решая задачу C7) — C9), выполнять переходы от одного базисного решения к другому только в том случае, если получающееся решение окажется целочисленным. Теорема 13 (Трубина). Описанный метод решения зсдачи C7) — C9) дает оптимальное решение. Доказательство этой теоремы здесь проводиться не будет. Неожиданные экстремальные задачи, связанные с та- такими матрицами, возникают при попытках экономного ре- решения линейных систем. Вот пример такой задачи. Задача о порядке исключения пере- перемени ы х. Найти взаимно однозначное отображение Т2. М2 -» -> 1: | М2 | и отображение Т1 : Мх -> 1 : оо таким обра- образом, чтобы Ту Ф Т\6 при i Ф k, Txi > max {T2j \ r [i, j] = 1] и достигался минимум величины max {Ту | i e Mx}. Название этой задачи связано вот с какой ее интерпре- интерпретацией: при решении линейной системы а [Мъ М2] X у [М2] = р [Alii можно сопоставить матрице этой системы «характеристиче- «характеристическую матрицу» г Ши М2], где г [i, /] = б (a [i, /J Ф 0). Пусть имеется допустимое решение нашей 'экстремальной задачи G\, Т\>). Отображение Т\ задает упорядочение на Мг :/-=!&<=> T±i •< T2k. Единственным образом опреде- определяется неулучшаемое отображение Tf, согласованное с этим упорядочением Tti = max {max {T2j | r [i, j\ == 1}, 1 + max {77* | k -J i)}.
§ 11. МАТРИЦЫ ИЗ НУЛЕП И ЕДИНИЦ 205 Теперь легко видеть, что равенства, соответствующие индексам /, для которых Tfi = max {7г/ 1 г И, /1 = 1}, могут быть использованы для выражения переменных (с тем же номером) через переменные с меньшими номерами. Задачи последовательного редуцирования комплекса остовов в последнее время стали появляться в различных областях математики. Одно из неожиданных применений таких задач встре- встретится нам в конце гл. 6. Многочисленные экстремальные задачи комбинаторного типа могут быть записаны как задачи линейного программи- программирования с матрицами из нулей и единиц и с дополнитель- дополнительными условиями целочисленности. Хотя теорема 13 дает метод для решения некоторых из таких задач, этот метод оказывается для большинства задач недостаточно эффек- эффективным. В следующей главе будут описаны некоторые комбина- комбинаторные задачи, в которых затруднительно использование методов линейного программирования, и будут предложены методы их решения, основанные на улучшенном переборе.
ГЛАВ А 5 МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ НА ГРАФАХ § 1. Характеристические числа графа Под многоэкстремальными задачами понимаются такие задачи, в которых при выбранном определении окрестности не исключается возможность существования локальных экстремумов, отличных от глобального, т. е. таких допусти- допустимых решений, которые не обеспечивают глобального экстре- экстремума, но в окрестности которых нет лучших с точки зрения рассматриваемой целевой функции решений. Многочислен- Многочисленные задачи такого типа возникают при введении всякого рода численных характеристик графа. В этом параграфе будут описаны некоторые из них. Первым следует назвать уже встречавшееся нам число компонент связности графа. Это число р может быть найдено без решения каких-либо экстремальных задач. Не связано с экстремальными задачами и следующее число — число незсвисимых циклов. Оно легко выражается через число компонент связности и равно v = \ N \ — | М | + р Используя предложение 5 гл. 3, легко показать, что v сов- совпадает при таком определении с рангом матрицы, составлен- составленной из циклических векторов графа. Следующим важным числом является хроматическое (или цветовое) число. Граф (Ж, N) называется ^-хроматическим, если каждой его вершине можно приписать число от 1 до k (цвет) таким образом, что начало и конец каждой дуги полу- получают различные номера (будут выкрашены в различный цвет). Наименьшее k, при котором граф является /г-хромати- ческим, и называется хроматическим числом Оно обозна- обозначается через у. Т е о р е м а 1 (Кёнига). Граф является 2-хроматическим в том и только в том случае, если он не содержит циклов нечетной длины. Доказательство. Граф, имеющий цикл нечет- нечетной длины, очевидно, не может быть раскрашен в два цвета, так как среди вершин цикла (число которых нечетно) ока- окажутся одноцветные соседние вершины.
§ 1. ХАРАКТЕРИСТИЧЕСКИЕ ЧИСЛА ГРАФА 207 Пусть граф не содержит циклов нечетной длины. Можно предполагать его связным, так как каждую компоненту связности можно раскрашивать отдельно. Выберем дерево в графе, цвет одной из вершин и, двигаясь от нее по дереву, раскрасим все остальные вершины. Получившаяся рас- раскраска будет непротиворечивой с точки зрения остальных дуг, так как их добавление замыкает цикл четной длины, на котором раскраска вершин является чередующейся, и значит, граничные вершины имеют разные цвета. ^ Цветовое число может быть получено в результате реше- решения следующей задачи линейного программирования в це- целых числах. Пусть k — число, при котором граф (М, N) заведомо является /г-хроматическим, г > | М |. Требуется найти неотрицательную целочисленную матрицу х [\:k, M], удовлетворяющую условиям 1 [1 : к] х x[l :k,M] = 1 Ш], х [l:k, I (и)] + х U:k, j (u)\ ==: 1 [l:k], и с= N и минимизирующую линейную функцию ?/e=l:ft, 1еМГ'ХХ[], г]. Переменная х [j, i] здесь равна единице в том случае, если для вершины i выбирается цвет / (для каждой вершины выбирается один цвет, соседние вершины имеют различный цвет). Величина г в целевой функции выбрана таким обра- образом, что любое решение х, использующее / цветов, лучше решения у, использующего / + 1 цветов. Действительно, = ! М | X rl < rin < Ц/еi:ft, ,-емг' X t/ [/, t]. Следующие два числа — числа внешней и внутренней устойчивости, определения которых требуют введения еще некоторых понятий. Множество М' вершин графа (М, N) называется внут- внутренне устойчивым, если никакие две его вершины не смежны, т. е. не являются одновременно граничными вершинами какой-либо дуги В правильно раскрашенном графе множе- множества вершин одного цвета образуют внутренне устойчивые множества. Числом внутренней устойчивости а называется максимальное число вершин в М'.
208 ГЛ. 5. МНОГОЭКСТРЕМЛЛЬНЫЕ ЗАДАЧИ Очевидно, что а х у ^ | М \. Множество М' называется внешне устойчивым, если каждая вершина из М \ М' смежна с какой-либо верши- вершиной из М'. Числом внешней устойчивости f> называется минималь- минимальное число вершин в М'. Эти числа также можно получить, решая соответствую- соответствующие целочисленные задачи линейного программирования. Число внутренней устойчивости получается из задачи: Максимизировать 1 Ш\ X х Ш] при условиях xli(u)] + x[j(u)]^l, u^N, xli\ e0:1, iejM, Число внешней устойчивости — из задачи: Минимизировать 1 Ш] X у Ш\ при условиях y[i] eO:l, i «= М, 1 Ш,] X ylMt)^* I, ie=M, где Mi — множество вершин, связанных дугой с i, к ко- которому добавлено само i. Получающиеся при этом векторы являются характери- характеристическими векторами множеств соответственно внутренней и внешней устойчивости. Отметим, что во всех случаях мы пришли к задаче линей- линейного программирования с дополнительными условиями це- лочисленности переменных. Более того, во встретившихся нам задачах матрица ограничений состояла из нулей и единиц. § 2. Эйлеровы и гамильтоновы пути и циклы Интересные задачи связаны с построением полных об- обходов графа. В термин «полный обход» мы можем вклады- вкладывать различное содержание, и это приводит к различным задачам. Более простой из них является задача построения обхода, содержащего все дуги графа. Замкнутая цепь, содержащая по одному разу все дуги графа, называется эйлеровым циклом *). ]) Мы снимаем здесь предположение о том, что в цепь каждая вер- вершина графа входит не более одного раза.
§ 2. ЭЙЛЕРОВЫ II ГАМИЛЬТОНОВЫ ПУТИ И ЦИКЛЫ 209 Теорема 2. Связный граф (М, N) обладает эйлеро- эйлеровым циклом в том и только в том случае, если в графе нет вершин, которым инцидентно нечетное число дуг. Доказательство. В одну сторону доказатель- доказательство совершенно очевидно. Если в графе есть вершина, которой инцидентно нечетное число дуг («нечетная» вершина), все дуги не смогут войти в эйлеров цикл, поскольку каждое прохождение вершины использует по две инцидентных вер- вершине дуги. Предположим, что нечетных вершин в графе нет. Пост- Построим какой-либо цикл и множество его вершин обозначим через Мо, а множество дуг через No. Положим N1 — N \ No. В графе (М, Nx) нет нечетных вершин. Кроме того, най- найдутся вершины из Мо, которым инцидентны дуги из Nv Действительно, если бы таких дуг не было, то не было бы связи между (Мо, No) и (М \ Мо, УУг), вопреки предполо- предположению о связности графа (М, N), Выберем вершину i e Мо и построим из дуг N1 цикл, содержащий L Встроим дуги из этого цикла в замкнутую цепь, соответственно пополнив Ми и No и снова полагая Ni = N \ No. Этот процесс можно, очевидно, повторять до полного исчерпания Л^. Построенная в результате замк- замкнутая цепь и будет искомым эйлеровым циклом, а Замкнутый путь, содержащий все дуги графа, назы- называется эйлеровым контуром. Теорема 3. Для того чтобы в связном графе (М, N) существовал эйлеров контур, необходимо и достаточно, чтобы | N1 \ = | Ni | для всех i <= М. A) Доказательство. При выполнении условия теоремы вектор 1 [N] является решением уравнения а [М, N] X х Ш] = 0 [N] и, следовательно, представим в виде выпуклой комбинации контурных векторов. Легко показать, что 1 IN] является суммой нескольких контурных векторов. Покажем, что из соответствующих им контуров можно составить замкнутый путь. Возьмем один из контуров и превратим его в замкну- замкнутый путь. Так как граф связен, то найдется вершина, лежа- лежащая на этом пути и принадлежащая одному из остальных контуров. Разорвем путь в этой вершине и вставим в разрыв обход контура. Мы снова получим замкнутый путь, для
210 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ которого сможем продолжить то же рассуждение до полного исчерпания набора контуров. Поскольку контуры содержали все дуги графа, то полу- получившийся замкнутый путь является эйлеровым контуром. Необходимость условия очевидна. А Следствие. Связный граф, удовлетворяющий усло- условию A), вполне связен. Цикл (контур, путь) называется гамильтоновым, если че- через каждую вершину графа он проходит ровно по одному разу. Назовем граф полным, если любая пара его вершин сое- соединена дугой хотя бы в одном направлении. Теорема 4 (Кёнига). В полном графе всегда сущест- существует гамильтонов путь. Доказательство. Пусть iu i2, ... , ik — некото- некоторый путь и / не входит в него. Покажем, что путь можно рас- расширить добавлением /. Если не существует дуги, ведущей из / в /ь то имеется дуга из г, в /. При наличии дуги из / в г2 можно поставить / между it и г2. В противном случае найдется дуга из i% в /. Повторяя этот процесс, мы вклю- включим / между какими-либо двумя вершинами пути либо убедимся в том, что есть дуга из ik в / и припишем / как последнюю вершину пути. Последовательно расширяя путь, мы включим в него все вершины графа, а Нахождение гамильтонова пути (или контура) в произ- произвольном графе может быть приведено к задаче линейного программирования с условием целочисленное™ перемен- переменных. Мы сформулируем, однако, более важную и общую задачу — задачу нахождения гамильтонова контура с наи- наименьшей длиной. Эта задача называется задачей о бродячем торговце или задачей о коммивояжере. При формулировке этой задачи целесообразно освободиться от трудности поиска допусти- допустимого решения и, добавив искусственные дуги, считать, что в графе имеются переходы из любой вершины в любую дру- другую. Тогда задача принимает следующий вид. Задача о коммивояжере. Задана матрица с [М, М]. Требуется найти такой по- порядок обхода вершин (элементов множества) t0, iu ... ,im= = @, т — i УН |, чтобы сумма VAel:m с [ik_\, ik\ была минимальной.
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 211 Эта задача также может быть записана как задача ли- линейного программирования с целочисленными переменными: Найти целочисленную матрицу х Ш, М], удовлетво- удовлетворяющую условиям хШ,М)^0 1М,М], B) 1 [ЛЛ X * Ш, М\ = х [М, М] X 1 [АЛ = 1 Ш], C) х И, /] < \А | - 1, А ^ М, АаМ D) и минимизирующую значение  и о И, /] х х [i, j\ E) Условия B), C) вместе с условием целочисленности опреде- определяют переставляющую матрицу, Условие D) является усло- условием одноцикловости этой подстановки — если бы в под- подстановке был цикл с множеством вершин А ^= М, усло- условие D), очевидно, не выполнялось бы. Задачу B) — E) не удается использовать непосредст- непосредственно для решения задачи о коммивояжере. Более успеш- успешным в решении этой и других задач сходного типа оказа- оказались методы улучшенного перебора, один из которых мы опишем в следующем параграфе. § 3. Метод ветвей и границ Когда мы занимаемся решением дискретных задач, трудно четко сформулировать, что значит построить метод решения этой задачи. Один метод решения всегда есть — это метод, заключающийся в полном просмотре всех эле- элементов множества. Один из подходов заключается в том, чтобы оценить трудоемкость предлагаемого метода через какие-то внешние параметры задачи — число переменных, число ограничений, количество битов информации, описывающих все исходные Данные, и т. д. Некоторые оценки такого рода уже нам встречались. Однако этот корректный подход не может последовательно проводиться в жизнь. Во-первых, пара- параметры, по которым оценивается трудоемкость задачи, часто плохо характеризуют задачу, — среди задач с данным зна- значением параметров есть классы «очень трудных» и «очень
212 ГЛ. 5. МНОГОЭКСТРЕМЛЛЬНЫЕ ЗАДАЧИ легких» задач. Во-вторых, кроме принципиальных оценок нас интересует фактическая трудоемкость численных мето- методов на задачах данного класса, на вычислительных машинах с такой-то памятью и быстродействием. Надеяться на полу- получение априорных оценок в этом случае пока не приходится. Поэтому нашей целью сейчас является в большей степени разработка и экспериментальная проверка методов, чем оценка их трудоемкости. Перебор множества допустимых решений часто может быть различными улучшениями доведен до высокоэффектив- высокоэффективных методов Разумеется, для успешного использования этих методов нужно в значительной мере пользоваться спе- спецификой задачи. Мы опишем здесь несколько идей такого улучшения и несколько вариантов использования этих идей. Большая группа методов улучшенного перебора объеди- объединяется под названием «метод ветвей и границ». Общая идея этого метода очень проста. Предположим, что мы решаем задачу: | Найти минимум f (х) по х е А . Пусть имеется некоторое разбиение множества А Ш:А = Ао U A, U ... U Ak и известно, что в множестве Ао оптимальных решений быть не может. Тогда min {/ (х) | х <= А} = = min {min {/ (х) | х е Л,} | i ен 1 : Щ. F) Разбиение множества А на подмножества преследует несколько целей. Прежде всего, выделение множества Ао сокращает задачу, и мы, конечно, стремимся как можно большую часть множества А передать в Ао. Далее, разбие- разбиение на подмножества Л; оставшейся части А может упро- упростить задачу нахождения минимума / (х) (во всяком случае, полезно выбирать такие разбиения, при которых задача упрощается). Отметим два важных способа увеличения множества Ао, Если мы знаем, что для двух элементов разбиения Л; и Aj имеет место min {/ (х) | х е Л,-} > min {/ (х) | х е Л,}, G) то в Л; заведомо оптимальных решений нет и Ло : — Ло U А/,
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 213 Если мы имеем какое-либо допустимое решение х0 и для некоторого i е 1 : J; установили, что min {f (х) | х е= А{} > / (*„), (8) то в А-, заведомо оптимальных решений нет иА0: = А0\]А1ш Для того чтобы получить неравенство типа (8), полезно использовать оценки снизу для минимума / (х) на Л,-. Один из методов получения таких оценок — использование рас- расширений получающихся экстремальных задач. Имея некоторое разбиение Л можно проводить его даль- дальнейшее измельчение, в котором тот или иной элемент раз- разбиения заменяется несколькими элементами (составляю- (составляющими его разбиение). При этом последовательно уточняются оценки и находятся новые допустимые решения, а некото- некоторые из элементов разбиения переводятся в множество Ао. Реализация этого общего принципа имеет много сложностей, часто меняющихся от задачи к задаче, и прежде чем о них говорить, рассмотрим какую-нибудь реализацию. Покажем, как можно осуществить эти принципы на задаче о коммивояжере, иллюстрируя рассмотрение и кон- конкретным примером. Рассмотрим задачу с М = 1 : 8 и с мат- матрицей стоимостей переездов, представленной табл. 1. Таблица 1 Таблица 2 12 3 45678 12345678 1 1 На каждом шаге вычислений одно из множеств разбие- разбиения будет делиться на два множества. Принцип деления для каждого из подмножеств в этой задаче оказывается возможным сделать единым — таким же, как для всего множества А. Множеством А в задаче о коммивояжере является множество гамильтоновых контуров или — в мат- матричных терминах — множество одноцикловых подстановок. 1 2 3 4 5 6 7 8 gz 7 3 4 4 3 1 7 5 g2 2 6 5 8 6 8 3 1 gz 2 1 9 6 7 2 6 3 gz 2 6 4 2 4 7 2 1 g2 4 2 8 5 8 4 3 4 gz 1 3 2 9 5 6 2 1 ^2 0 7 6 7- 2 3 5 0 gz 1 2 3 4 5 6 7 8 g^ 5 0 2 2 1 0 6 3 gz 0 5 4 7 6 8 1 0 gz I 0 8 6 7 0 5 1 gz 1 5 4 2 2 6 0 0 gz 3 2 8 2 6 1 1 2 gz 0 2 0 8 3 5 1 0 gz 0 5 5 5 1 2 4 0 gz
214 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ Способ разбиения множества А гамильтоновых конту- контуров на подмножества будет использоваться только один: зафиксировав дугу и, мы будем относить к одному множе- множеству все пути, содержащие эту дугу, а к другому — все пути, не содержащие этой дуги. В первом случае матрица (и за- задача) может быть уменьшена, так как из i (и) и '/ (и) можно составить «вершину» /', для которой с W, i'\ = оо, с [i, i'] ~ — с \i, i (и)] и с [Г, i\ = с [/ (и), i] при i Ф г". Во втором случае можно поюжить с U (и), / (и)] = оо и рассмотреть задачу о коммивояжере с оставшимися дугами. Итак, в обоих случаях мы получаем задачу о коммивояжере, и поэтому нам достаточно иметь метод оценки минимума лишь для этой задачи. Отметим, что при неотрицательной матрице с [М, М] нуль будет оценкой снизу для минимума. Поэтому редук- редукции, проводившиеся над матрицей с [М, М], при решении задачи о назначениях венгерским методом, дают оценку снизу для минимума целевой функции х). Преобразуя нашу матрицу, получаем табл. 2 (справа от строк и под столбцами записаны вычитаемые). Целевая функция уменьшена на 10, и это число и яв- является оценкой снизу для минимума целевой функции. Отметим, что запрещение некоторых из нулевых переходов Таблица 3 2 4 5 6 7 8 Таблица 4 12 3 4 5 6 7 8 1 3 4 5 6 Т 8 gz 0 2 1 1 0 6 0 gz 2 0 4 3 5 0 1 gz 0 5 4 2 2 0 0 gz 3 2 8 2 1 1 1 0 2 0 3 5 0 0 gZ 0 5 5 1 1 4 0 gz gz 0 0 2 2 1 0 6 3 ?2 0 5 4 7 6 8 1 gz gz 1 0 8 6 7 0 0 1 gz 1 5 4 2 2 1 0 0 gz 3 2 8 2 1 1 1 2 gz 0 2 0 3 3 5 1 0 gz 0 5 0 5 1 2 4 0 gz x) Задача о назначениях может рассматриваться как расширение задачи о коммивояжере. Очень эффективной оценкой для минимума является минимум целевой функции в задаче о назначениях. Но его получение слишком трудоемко. Используемая нами оценка представ- представляет собой не что иное, как допустимое решение задачи, двойственной задаче о'назначениях.
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 215 повышает эту оценку. Так, запрет перехода 7 -» 6 позволяет вычесть 1 из 6-го столбца, запрет 8 -> 7 вычесть 2 из 8-й строки. Больше всего (на 5) повышается оценка при за- запрете перехода 2 -> 3. Этот переход мы и используем для дробления А. Итак, получаем два варианта (табл. 3 и 4). В варианте Ах запрещен переход 3 -> 2, так как он замыкает контур. Вариант Ах имеет меньшую оценку и развивается дальше. Больше всего повышает оценку удаление перехода Таблица 5 . Таблица б 12 4 5 6 8 8 -> 7 (табл. 5 и 6). Теперь наименьшую оценку имеет ва- вариант А2, который целесообразно дробить по переходу 3 -> 2 (табл. 7 и 8). Делим далее Л21 по переходу 8^-7 (табл. 9 и 10). Сейчас Л = Аи U A12 U Аш U Ап2 U А22. Делим Ап по 6 -» 1 (табл. 11 и 12). Делим А1П по 7 -> 6 (табл. 13 и 14). Наконец, делим ЛШ1 по 3 -> 5 (табл. 15 и 16). Таблица 8 12 3 4 5 6 7 8 0 2 1 0 0 0 gz 2 0 .3 3 0 1 я* 0 4 4 2 0 0 ?г 2 2 2 1 1 1 Я* 0 4 4 0 0 2 1 3 4 о 6 7 8 1 gz 0 9 1 1 0 4 2 0 gz 2 0 4 3 3 4 0 1 gz 0 5 4 0 5 2 0 0 gz 3 2 6 6 2 1 1 1 gz 0 0 7 0 3 5 0 0 gz gz 8 5 5 1 1 4 0 gz Наконец, делим ЛШ1 Таблица 7 3 4 5 6 7 gz 0 2 2 1 0 G 1 gz 1 0 8 6 7 0 0 I 5 4 9 2 1 0 gz 3 2 8 2 1 1 2 gz 0 2 0 3 5 1 0 gz 0 5 0 1 2 4 0 gz 1 2 3 4 5 6 7 8 g2 0 0 2 2 1 0 6 0 gz gz 2 1 4 3 5 1 gz gz 1 0 8 6 7 0 0 1 gz 1 5 4 2 2 1 0 0 gz 3 2 8 2 1 1 1 2 gz 0 2 0 3 3 5 1 0 gz 0 5 0 5 1 9 4 0 gz
216 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ Таблица 9 13 4 5 6 8 Таблица 11 2 4 5 6 8 1 3 4 5 7 0 gz 2 0 3 0 1 gz 0 4 2 0 0 gz 2 яг 1 1 1 0 4 4 0 0 gz Таблица 14 2 4 5 6 8 1 3 4 5 7 0 gz 2 0 1 0 1 Rz 0 2 2 0 0 gz 0 gz 0 0 0 gz 4 4 0 0 gz Таблица 10 3 4 5 6 7 8 1 2 4 5 6 7 gz 0 2 2 0 0 1 gz 1 0 7 6 0 0 gz 1 4 4 2 1 0 gz 2 2 2 1 1 2 gz 0 5 0 1 2 3 gz gz 0 2 2 1 0 4 1 gz 1 0 8 6 5 0 0 gz 1 5 4 0 2 1 0 gz 3 2 6 2 1 1 2 gz 0 0 0 3 5 1 0 gz gz 5 0 1 2 4 0 gz Таблица 12 12 4 5 6 8 Таблица 13 2 4 5 8 1 3 4 5 6 7 gZ 0 2 1 gz 0 0 g^ 2 0 1 3 0 1 gz 0 2 4 2 0 0 gZ- 0 2 2 1 1 1 gz 0 4 4 0 0 0 gz 1 3 4 5 0 gz 2 0 0 1 RZ 0 2 0 0 gz gz 1 0 0 Таблица 15 2 4 8 Таблица 16 2 4 5 8 1 4 5 0 2 gz 0 gz 0 g^ 0 0 1 3 4 5 0 gz 2 0 0 0 gz 0 2 gz 0 gz uz 0 0 0 1 Теперь очевидно оптимальное решение в множестве Л11Ш: 2->3-»-5->4-»8->-7-н>6->1-*-2. Все остальные мно- множества имеют оценку минимума не меньше 16 и поэтому не могут дать решений с меньшим значением целевой функ- функции. Получившуюся схему ветвлений удобно представить деревом, изображенным на рис. 63. Описанный метод называется методом ветвей и границ, так как в нем поиск оптимального решения идет по ветвям дерева вариантов, и при этом ветвлении используются гра- границы — оценки.
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 217 При выборе метода мы можем распоряжаться следую- следующими его характерными особенностями: — способом оценки минимума целевой функции на эле- элементе разбиения, — способом дробления элемента разбиения, — способом отнесения элементов разбиения к Ло, — стратегией выбора варианта для ветвления и конкрет- конкретных параметров ветвления. Л '• /\ / \ A if Aio rip/ A /\ /\ А А нппг "т/г Рис. 63. Дерево вариантов в задаче о коммивояжере. Так, в задаче о коммивояжере в качестве оценок можно было использовать и решение задачи о назначении, и реше- решение задачи о кратчайшем иерархическом дереве. Способ дробления в этой задаче определяется, по-видимому, одно- однозначно — разумных замен ему не видно. Способ «отбра- «отбраковки» элементов мы использовали один — по оценке мини- минимума. Эффективность этой отбраковки повысится, если взять достаточно хорошее допустимое решение и сравни- сравнивать с ним оценки (действовать по формуле (8)). Например, если строить обход вершин, выбрав какую-то вершину для начала и переходя из каждой вершины в самую близкую из оставшихся (по таблице 2), мы получим при начальной вершине 1 путь стоимости 18, что позволит нам сразу забраковать подмно- подмножества Аиъ АШ2, А22.
218 ГЛ. 5. МНОГОЭКСТРЕМЛЛЬНЫЕ ЗАДАЧИ Важнейшие особенности метода — выбор варианта для ветвления и общая политика ветвления. Главная цель ветв- ветвления — выделение «неперспективных» частей множества А, частей с большими оценками, до которых скорее всего пере- перебор не должен и доходить. С этой точки зрения тот выбор решающей дуги, который описан выше, обладает высокими вычислительными достоинствами. Что же касается политики ветвления, то ясно, что трудно построить вычислительный процесс, в котором количество крупных записей о возможных продолжениях процесса менялось бы и могло сильно вырастать. Так, в нашей задаче о коммивояжере каждый элемент разбиения Аа представлен информацией о принятых решениях, оценкой и матрицей получившихся стоимостей. Часть этой информации не яв- является необходимой — она может быть восстановлена по другим данным, но удобна для проведения вычислений. Например, вместо матрицы можно хранить несколько линей- линейных массивов и первоначальную матрицу с \М, М]. В том случае, когда элемент разбиения выбран для дальнейшего дробления и требуется его матрица, она может быть вос- воссоздана по этой информации. Однако такое сокращение необходимой информации при- приводит к увеличению вычислительной работы. Для того чтобы реже переходить с одной матрицы на другую, можно использовать более устойчивые политики выбора дробимых множеств. Один из таких вариантов, оказавшийся очень эффектив- эффективным именно в задаче о коммивояжере, заключается в том, что в качестве дробимого элемента на каждом шаге выби- выбирается одно из подмножеств элемента, дробившегося на предыдущем шаге. После того как развитие этой линии закончено, оценка минимума оказалась слишком высокой или в рабочем элементе разбиения найдено оптимальное для него решение,—из остальных элементов разбиения вы- выбирается элемент с наименьшей оценкой, информация о нем приводится в рабочее состояние и развивается новая линия. Другой вариант, который особенно удобен с точки зре- зрения хранения информации о вычислительном процессе, — это вариант одностороннего обхода дерева вариантов. В этом варианте при каждом разбиении рабочего элемента для продолжения выбирается один из получившихся «оскол- «осколков» так же, как и раньше, но при завершении работы над
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 219 осколком происходит возвращение к предыдущему шагу для исследования второго осколка (или к ближайшему из пре- предыдущих шагов, где еще сохранилась альтернатива). Рис. 64. Пример для иллюстрации ветвлений. В рассмотренном нами примере это соответствует после- последовательному рассмотрению следующих вариантов: 0 — ветвление, 1 — ветвление, 11 — ветвление, 111 —ветвление, 1111 — ветвление, 11111 — получено допустимое решение со значением 16 (рекорд), переход к альтернативе, 11112 — оценка хуже рекорда. Возврат на один шаг с переходом к альтернативе, 1112 —то же действие, 112 —то же действие, 12 — то же действие, 2 — ветвление, 21 — ветвление, 211 — оценка не лучше рекорда. Возврат с переходом к альтернативе, 212 —то же действие, 22 — оценка хуже рекорда. Альтернатив нет. Конец перебора.
220 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ Для того чтобы сопоставить описанные три политики ветвления, рассмотрим пример, изображенный на рис. 64. Здесь показано полное дерево вариантов, в котором вер- вершины самого нижнего уровня'— допустимые решения, а все прочие вершины — элементы разбиения. Номера вершин являются значениями целевой функции для до- допустимых реггений и оценками для элементов разбиения. Для краткости мы будем писать РА, когда появляется новый рекорд со значением А, О (А, В) — когда отменя- отменяется несколько элементов (А, В), А = В + С, если А де- делится на В и С. Итак, ветвление «полным фронтом»: 11 = 17 + 20, 17=19 + 28, 19 = 23 + 59, 20 = 21+27, 21=31+25, 23 = 41+32, Р32, 0D1, 59), 25 = 29 + 83, 083, Р29, 031, 27 = 40 + 61, ОD0, 61), 28 = 36 + 42, 0C6, 42). Ветвление «побегами»: 11 = 17 + 20, 17=19 + 28, 19 = 23 + 59, 23 = 41+32, Р32, 0D1, 59), 21=25 + 31, 25 = 29 + 83, 25 = 29 + 83, 083, Р29, 031, 27 = 40 + 61, 0D0, 61), 28 = 36 + 42, 0C6, 42). Односторонний обход дерева: 11 = 17 + 20, 17=19 + 28, 28 = 36 + 42, 36 = 58 + 37, Р58, Р37, 04, 19 = 23 + 59, 23 = 41 + 32, 041, Р32, 059, 20 = 21+27, 21=31+25, 31 = 76 + 38, 0G, 38), 25 = 29 + 83, Р29, 083, 27 = 40 + 61, 0D0, 61), Как мы видим, политика полного фронта дает меньше всего ветвлений, а односторонний обход — больше всего. Это общая закономерность (что легко показать). Однако в вычислительном отношении метод одностороннего обхода представляется настолько удобным, что мы опишем здесь общую схему его реализации. Чтобы упростить запись введем сразу некоторые обя- обязательные переменные — целочисленную переменную level указывающую уровень перебора — количество звеньев в пу
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 221 ти от корня дерева до текущей вершины, гее — «рекорд» — наилучшее из встретившихся значений целевой функции, est — оценка минимума на текущей вершине дерева. Состоянием мы будем называть информацию о вершине вместе с информацией о возможности продолжений. Обозначим через bestsol лучшее из встретившихся до- допустимых решений (/ {bestsol) — гее), через solinit — на- начальное допустимое решение, через sol — допустимое реше- решение, встречающееся в ходе работы алгоритма. На начальных шагах работы над алгоритмом полезно использовать полуалгольскую запись вычислительного про- процесса, заменяя еще не готовые части алгоритма словесными вставками (квазиоператорами). С помощью такой смеси схема одностороннего .обхода примет следующий вид: bestsol: = solinit} rec: = / (solinit); level: = 0; определение состояния соответствующего корню; mkest: вычисление est; if найдено допустимое решение sol с f(sol)=esl then begin if est < rec then begin bestsol: = sol; rec: = est end end if est ^ rec then go to mkback; tnkforw: выбор продолжения; изменение состояния; level) = level + 1*, go to mkest; mkback: if level > 0 then begin изменение состояния отменой последнего продолжения; level: = level— 1; go to mkback end else begin изменение последнего продолжения; go to mkest end; mkfin: Ниже приводится процедура, в которой эта схема реали- реализуется для задачи о коммивояжере. Для запоминания ре- решения выделен вектор sol [1 : т], в котором sol [i] = j, если из i нужно перейти в /. На промежуточных шагах процесса мы имеем «частичное решение» — граф, состоящий из нескольких отдельных путей. Число этих путей обозна- обозначено через тс, их концы выписаны в векторе ш [1 : тс], их начала (в другом порядке) — в векторе nj [1 : тс].
222 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ Для того чтобы связать начала с концами вводится вектор концов end [1 : т], в котором end It] — конец пути, начинающегося в i. Такой смысл имеют только те компонен- компоненты, которым соответствуют начала из массива и/. Аналогич- Аналогично вводится массив начал beg [1 : т]. Для того чтобы матрица с[1 : т, 1 : т] оставалась неизменной, вычитаемые по строкам и столбцам можно хра- хранить в отдельных массивах (ai и aj). Наконец, траектория ветвления запоминается в магазине st, где на каждый шаг ветвления приходится по два числа — номера строки и столбца перехода, по которому производится ветвление. При этом номер строки хранится со своим знаком, если пере- переход запрещается, и со знаком минус, если переход включа- включается в решение (это — условность, могло быть и наоборот). nst показывает заполненность магазина: procedure travsal (m, с, solinit, gz, bestsol, red); value m, gz; integer m, rec, gz; integer array c, solinit, bestsol; begin integer i, j, ib, jb, ic, jc, me, nst, level, est, /1, /2, /3, /4; integer array ni, nj, ex, ej, ai, aj, beg, end, sol [ 1 : m\, st[l :2 x m x mj; rec: = est: = level: — 0; me: = m; nst: = 1; for i: = 1 step 1 until m do begin ni [i]: = nj[i]: = end ft]: = beg[i\. = i; ai[i]:=aj[i]: = 0; c[i, i]:=gz; j: = bestsol[i]: = solinit ft]; rec: =*rec + c[i, j) end; mkest: for ic: — 1 step 1 until me do begin t: = rtt[tc]; f\:=gz; for jc: = 1 step 1 until me do begin j: = nj[jc]; /2:=ф\ j] — ai[i] — aj[j]\ if /2</l then fl:=f2 end; ai[i]: = ai[i] + fl; est:=est+fl . end ic; for jc: = 1 step 1 until me do begin /: = n/l/c]; /2: =/1: =gz; for ic: = 1 step 1 until me do begin i: = rttftc]; /3:=с(г, j]-ai[i]-aj[j]; if /3</l then begin /2:=/l; /l:=/3 end else if /3</2 then /2:=/3 end ic; aj[j]:=aj[j] + fl; est:=est+n± L] end jc;
§ 3. МЕТОД ВЕТВЕЙ И ГРАНИЦ 223 if me = 2/\rec>esl then begin rec:~est; sol[ni[\]]:—beg[ni[2]]; sol[ni[2]]: = beg[ni[i]]; for t: = l step 1 until m do bestsol[i]: = sol[i] end; if est S= rec then go to mkback; /4:=-l; for ic: = 1 step 1 until me do begin /: —m|7c]; fl:=f2: ~gz; for /c: = 1 step 1 until me do begin /: = nj [jc]; /3: = с [i, /] - at [i] - a/ [/]; if /3</l then begin /2:=/l; /l:-=/3 end else if /3</2 then /2:=/3 end jc; ei[i]:=f2:=f2-fl; for jc: — 1 step 1 until me do begin j: = nj[jc]; if c[i, j] — ai[i] — aj[j] = 0 then begin /3:=/2+ <?/[/]; if /3</4 then begin i: = /c; /6: = /c; /4: = f3 end end end end ic; i: = ni[ib]; st[nst]:— — i; st[nst+\]: — j: = nj t \; ni [ib]: = ni[me]; nj[jb\. = nj [me]; me: — mc—\; sol[i]: = /; /4: = beg[i]; /1: = end[/]; end[f4]:=fl; beg[fl]:=f4; c[f\, /4]:=c[/l, /4]4-^2; /eye/: = levels 1; go to mkest; mkback: if level >0 then begin nst: = nst — 2; i:=st[nst]; j: = st[nst-{-1]; if i>0 then begin c[/, /]:=с[г, j] — gz; 1 /eye/: = level— 1; go to mkback end else begin s/ [ns^]: = /: = — i; /4: = beg[i]; /1: = end[/4]; c[/, /]:=c[/, /] + gz; end[fi]: = i; end[j]:=fl; c[fl, /4]:=c[/l, f4]-g2; teg[/l]: = /; mc: = mc+l; ni[mc]: = i; nj[mc]:=j;nst: = nstJr2; go to mfees/ end end end travsal В следующих параграфах мы с разной степенью дета- детализации опишем применение метода ветвей и границ еще в нескольких экстремальных задачах.
224 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ § 4. Размыкание контуров в графе Вот характерная комбинаторная задача, которая хорошо решается методом ветвей и границ. Задача о размыкании контуров. Заданы граф ( М, N ) и положительный вектор w [N] весов дуг. Требуется выбрать такой частичный граф (М, Nt ), который не имел бы контуров и имел макси- максимальный вес 1 [AM х w [/V,]. Можно говорить об удалении из графа некоторого мно- множества дуг N' таким образом, чтобы граф < М, N \ N' ) не имел контуров и чтобы суммарный вес удаленных дуг был минимален. Нам будет удобнее решать задачу именно в этой постановке. Для того чтобы применить в этой задаче метод ветвей и границ мы должны описать метод получения оценки и по- политику ветвления. При описании оценки полезно ввести одно обобщение нашей задачи — задачу о размыкании контуров с запрещением удалять дуги из некоторого под- подмножества R множества N. Обозначим минимальный вес, необходимый для размыкания контуров в этой задаче через w (N | R). Очевидно, что если N cr N_, то w (N \ R) -^ ==? w (N [ R) и если R cz R, то w (N | R) > w (N | R). Перейдем теперь к построению оценки снизу для w (N | R). Зафиксируем в графе (М, N) какой-либо кон- контур С. На этом контуре имеется дуга и*, входящая в опти- оптимальное множество N'. Естественно, что w [u*\ ^ min {w [и] | и <= С\ R}. (9) Имеем w{N | R)^min{w[u] \ и е= С\ R} + w (N\(C\R) \ R). Теперь алгоритм построения оценки выглядит так. Положим est := 0; U := N; 1° Если в графе (М, U) нет контуров, перейти к 4°. 2° Выбрать какой-либо контур С. 3° est: = est + min {w [и] \ и s С \ R}; U : = U \ (С \ R). Перейти к 1° i° Взять est в качестве оценки для w (N \ R).
§ 4. РАЗМЫКАНИЕ КОНТУРОВ 2^5 Разумеется, величина оценки est будет зависеть от того, как выбирались в 2° контуры С. Политика ветвления может быть различной. Проще всего при данном множестве R дуг, которые нельзя размы- размыкать, и множестве дуг Q = N \ R, которые можно раз- размыкать, найти какой-либо контур С, выбрать ту из его дуг й, на которой достигался минимум в (9) и рассмотреть две возможности: 1) дуга й удаляется из графа, 2) дугу й запрещается удалять из графа. При этом полезен контроль за тем, чтобы в множестве R не появлялось контуров (для этого нужно, чтобы в каждом контуре оставалась хотя бы одна дуга из Q). В каждом промежуточном состоянии N' можно проводить дополнительный анализ свободных дуг Q. Те дуги, которые содержатся в транзитивном замыкании графа (M,R), могут прямо включаться в R, дуги, которые замыкают контуры при добавлении их в R, должны прямо уда- удаляться. Дальнейшие вычислительные детали здесь не представ- представляют интереса, целесообразнее рассмотреть возможные применения этой задачи. Прежде всего начнем с сетевых графиков. Может пока- показаться очень удачным применением для нашей задачи упоминавшееся размыкание контуров при построении сете- сетевого графика. Нужно предостеречь от такого приме- применения. Составление сетевого графика должно основываться на правильных представлениях о последовательности работ, механический выбор в контуре той связи, которая должна быть отменена, совершенно противопоказан! Вот более серьезное применение. Задача о круговой расстановке станков. Имеется множество станков М, которые должны быть расставлены по кругу, на котором имеется т = \ М \ мест. Расположение станков задается, таким образом, отображением Т : М -*¦ 1 : т. На станках должны обра- обрабатываться детали различных типов из множества ти- типов К- Для каждой детали задана последовательность операций, причем каждой операции отвечает свой станок 8 И. В. Романовский
226 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ из М. Деталь выходит из кладовой (между m-м и первым местом) и движется по кругу в фиксированном направ- направлении от одного станка к другому. При каждом распо- расположении станков Т каждая деталь 1геК проходит целое число кругов / (k, T). Требуется выбрать такое расположение станков, при котором достигался бы ми- минимум величины Ф (Т) = Zftejfffl* X / (k, Т), A0) где со* — некоторые веса, зависящие от частоты встре- встречаемости и от физического веса деталей. Для того чтобы формализовать эту задачу,, нужно яснее •представить себе, от чего зависит / (k, T). Последователь- Последовательность операций ilt L2, ..., ir переводится отображением Т в последовательность целых чисел из 1 : m Tiu Ti2, ..., Tirk. Назовем главными инверсиями последовательности пары соседних чисел, расположенные в убывающем порядке. Так, в последовательности 3,8,5,9,4,1,4,5,9,2 главными инверсиями будут (8, 5), (9, 4), D, 1) и (9, 2). Число главных инверсий в последовательности s обозначим через / (s, T). Легко видеть, что число кругов, которые -деталь k должна проделать при ее обработке, равно / (sk, T) -f 1. Вычитая из A0) постоянную ?*exw*. мы приходим к задаче минимизации Хъелю/, х / (s*, T). Рассмотрим пару станков i, j e M. Положим a»I(i,/)l = ?*<=««>* xrk (i,j), A1) где rk (i, j) — количество непосредственных переходов от станка / к станку / в последовательности обработки /г-й детали. Рассмотрим теперь граф (К, N), в котором множество дуг — это множество пар (/, /), которым соответствует поло- положительный вес w [(/, /)]. Каждое упорядочение вершин этого графа можно представить как два действия: разрыв контуров и затем доупорядочение получающегося частич-
§ 5. КРАТЧАЙШЕЕ ЧАСТИЧНОЕ ДЕРЕВО 227 ного порядка. Очевидно, что главные инверсии определя- определяются лишь выбором дуг, которые будут противоречить устанавливаемому порядку, и мы приходим к задаче о раз- размыкании контуров. § 5. Кратчайшее частичное дерево В этом параграфе мы вернемся к задаче, которая была сформулирована в § 5 гл. 4. В ней требовалось найти крат- кратчайший связный частичный подграф^Л^, Л^) графа(М, N), содержащий множество вершин Мо. Очевидно, что этот подграф должен быть деревом. Опишем характерные черты метода ветвей и границ в применении к этой задаче. Прежде всего — оценка. Рассмотрим следующий про- процесс, являющийся модификацией процесса Прима — Кра- скала из § 5 гл. 4. Выберем произвольно вершину i0 e Мо и будем присоединять к ней последовательно вершины с инцидентными им дугами по одной. Получающуюся ком- компоненту связности мы будем называть основной. В отличие от собственно алгоритма Прима — Краскала, если на каком-либо шаге мы сможем присоединить к ос- основной компоненте вершины из М \ Мо, мы будем присое- присоединять их в первую очередь, считая длины соответствую- соответствующих дуг нулевыми. В отношении вершин из Мо будет в точности сохраняться алгоритм Прима — Краскала. Процесс завершится, когда все вершины из Мо будут присоединены к основной компо- компоненте связности. Обозначим полученный граф через (М*, N*). Теорема 5. Сумма длин дуг множества N* при сделанной оговорке относительно дуг, которыми присоеди- присоединялись вершины из М* \ Мо, является оценкой снизу для минимума в задаче о кратчайшем частичном дереве. 'Доказательство. Мы повторим по существу рассуждения, делавшиеся при доказательстве теоремы 5 гл. 4. Перенумеруем дуги и вершины графа (М*, N*) в порядке их включения в основную компоненту связности, после чего произвольно продолжим нумерацию на все остальные дуги из N и вершины из М. Пусть теперь (Ж!, Nt) —оптимальное частичное дерево. Мы будем последовательно изменять это дерево, не увели- 8*
228 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ чивая его длины, так, чтобы в результате получилось де- дерево, содержащее (М*, N*). Пусть к — наименьший из номеров дуг множества N* \ Nv Одна из граничных вершин дуги ик имеет номер k, другая — меньший номер и, следовательно, принадлежит Му Если ik ф Mlt то ik <? Мо Дуга ик имеет в этом случае нулевую длину и ее добавление (вместе с вершиной ik) к графу (Mi, Л^} не увеличивает суммарной длины дуг. Предположим, что ik e Мх. В этом случае добавление ик к (Mi, Nj) приводит к появлению цикла. В этом цикле должны быть дуги с номерами, большими чем к, и, в част- частности, такая дуга а, одна из граничных вершин которой имеет номер меньше чем к. Замена этой дуги дугой ик по определению ик может лишь уменьшить сумму длин дуг графа, оставив его связным. Повторяя эту процедуру дальше, мы получим некоторый граф, содержащий (М*, N*) и, следовательно, имеющий разве лишь большую сумму длин дуг. А Описанная процедура дает достаточно простую и эф- эффективную систему оценки. Ветвление будет проводиться следующим образом: выб- выбрав какую-либо вершину i е М \ Мо, мы в одной альтер- альтернативе включим ее в Мп, а в другой удалим (вместе со всеми инцидентными ей дугами) из графа. В обоих случаях мы получаем новые задачи такого же типа и можем в них воспользоваться алгоритмом Прима — Краскала. При этом можно пользоваться этим алгоритмом в режиме «досчета», сохраняя от предыдущего расчета все дуги и вершины с номерами меньшими, чем у вершины ветвления. § 6. Задача об оптимальном раскрое В конце гл. 2 в связи с обсуждением метода генериро- генерирования столбцов нам встретилась следующая экстремальная задача, которая может рассматриваться как задача линей- линейного программирования с целочисленными коэффициентами. Задача о наилучшем раскрое. Задано конечное множество N, положительные век- векторы с [N] и / [/V] и число /0. Требуется найти неотрица- неотрицательный целочисленный вектор х [N], удовлетворяющий
§ 6. ЗАДАЧА ОБ ОПТИМАЛЬНОМ РАСКРОЕ 229 условию UN] X х IN] < /0 A2) и максимизирующий с [N] х х [N] Будем решать эту задачу методом ветвей и границ с одно- односторонним обходом дерева вариантов. И в этой задаче не представляет труда организовать процесс ветвления так, чтобы каждый элемент разбиения представлял собой такую же задачу о раскрое. Поэтому достаточно, если мы сможем оценить максимум целевой функции в исходной задаче. Если расширить задачу, отказавшись от условия цело- численности, мы получим очень простую задачу линейного программирования — с одним ограничением: Максимизировать с [N] x х \N] по неотрицательным х [N], удовлетворяющим A2). Легко видеть, что решение этой задачи таково: нужно выбрать /0 е N, на котором достигается максимум отноше- отношения с [/]// [/], и положить х [/0] = 10/1 [/„], х Ш — /0] = О Ш — /0], так что оценкой максимума в исходной задаче будет Ю х с [/„]// [/„]. Ветвление вариантов мы будем проводить, выбирая число экземпляров самой выгодной детали (детали с наибольшим отношением с [/]// [/]) и выбирая в первую очередь вариант с наибольшим возможным числом экземпляров, а затем последовательно его уменьшая. Как ни странно, в этих немногочисленных фразах содер- содержится все описание работы алгоритма. Шаг вперед состоит в том, что выбирается самая выгодная деталь, а затем она отрезается столько раз, сколько поместится, и для остатка делается то же самое (рекурсия), а шаг назад заключается в том, что отменяется одна из последних отрезанных деталей (последний экземпляр последней отрезанной детали), оце- оценивается максимум и в случае целесообразности продол- продолжения делается шаг вперед (для оставшихся деталей), а при нецелесообразности делается шаг назад. На этой простой задаче удобно наблюдать, как выраба- вырабатывается экономная запись о состоянии вычислительного
230 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ процесса. Зная действие алгоритма в принципе, проследим за решением небольшого примера Пусть мы имеем сырье длины 100 и пять деталей с длинами 40, 9, 21, 37 и 20 и соответственно ценами 45, 10, 23, 40 и 20 (отношения длин к ценам равны соответственно 1.125, 1.111, 1.095, 1.081 и 1.000). На первом шаге оценка максимума равна 100 X 45/40= 112.5. Первых деталей может уместиться в этом сырье не больше двух. В качестве на- начального решения отрезаем две первые детали. Получаем выручку 90 и остаток сырья 20. Шаг. 2. Оценка остатка 20 X 10/9 = 22.222 Оценка всего вари- варианта должна учитывать накопленную выручку 90+ 22.222= 112.222. Вторых деталей можно уместить две. Накопленное решение B, 2), вы- выручка ПО, остаток сырья 2. Из этого сырья ничего не выкроить. Следует сделать шаг назад, отказавшись от одного экземпляра детали 2. Накопленное решение B, 1), выручка 100, остаток сырья 12. Учи- Учитывая, что деталь 2 вырезать уже нельзя, этот остаток никак не исполь- использовать, следует сделать еще шаг назад. Накопленное решение B, 0) выручка 90, остаток 20. В этом остатке может уместиться только деталь 5, что дает оценку и значение целевой функции 110. Поскольку решение со значением ПО уже имеется, сле- следует сделать новый шаг назад. Накопленное решение A), выручка 45, остаток сырья 60. , Оценка варианта 45 т 60 X 1.11= 111.667, накопленное значение A, 6), выручка 105, остаток 6. Шаг назад: A, 5), 95, 15. Шаг назад: A, 4), 85, 24 Оценка варианта 85 + 24 х 23/21 = = 111.286. Шаг назад: A, 4, 0), 85, 24, оценка 109 (по детали 5). Шаг назад: A, 3), 75, 33, оценка 111.143 (по детали 3). Шаг вперед: A, 3, 1), 98, 12, оценка 98. Шаг назад: A, 3, 0), 75, 33, оценка 108 (по детали 5). Шаг назад: A, 2), 65, 42, оценка 111 (по детали 3). Шаг вперед: A, 2, 2), 11!, 0 — вот новый рекорд! Шаг назад: A, 1), 55. 51, оценка 110.857 (по 3). Шаг назад @), 0, 100, оценка 111.111 (по 2) Шаг вперед: @. 11), ПО, I. Шаг назад: @, 10), 100, 10 Шаг назад: @, 9), 90, 19. Шаг назад: @, 8), 80, 27, оценка 109.571 (по 3). Следующий шаг назад невозможен, и перебор этим завершается с наилучшим решением: A, 2, 2, 0, 0). В ходе решения примера у нас выработалась приемлемая запись, состоящая из вектора х [N], накопленной выручки у, остатка сырья Я и оценки est. Дополнительно к этому желательно иметь k — номер последней включенной в ре- решение переменной и информацию о рекорде: х* [N] и гее — рекордное значение целевой функции.
§ 7. ЗАДАЧИ С БИВАЛЕНТНЫМИ ПЕРЕМЕННЫМИ 231 В терминах этой записи легко описать процесс вычисле- вычислений, лишь в незначительных деталях отличающийся от проводившегося. Начальная запись: х* [N] = х [N] = О IN]; k = 0; к ~ = /0; у = 0; гее = 0. Пусть N = I : т. Правила переработки записей мы приведем в виде ал- гольского текста. Общая структура этого текста примерно соответствует схеме, описанной в § 3. Однако есть некоторые отличия. Так как решается задача максимизации, то знаки нера- неравенств направлены в другую сторону. Так как любой из промежуточных раскроев дает допустимое решение, немного переставлены действия после вычисления оценки: mkest: if k — m then go to tnkback else k:=k-\-\; if l[k]>lam then go to mkest; est:—gam + lam x с [&]//[&]; if est sS rec then go to tnkback; x [k]: = entier {lam 11 [k]); lam: = lam — x[k] x / [k]; gam:=gam-{-x[k]xc[k]; if res<gam then begin rec:—gam; for /: = 1 step 1 until m do bestsol[i]:=x[i] end; go to mkest; tnkback: k: — k— I; if x[k]>0 then begin x[k]: = x[k]—\; lam: = lam-\-l[k\; gam: = gam — с[k]; go to mkest end else if k > 1 then go to mkback Отметим, что этот алгоритм работает тем лучше, чем больше различия в отношениях с [/]// [/]. Для задач, в кото- которых с \N] = / \N], он сильно уступает другим методам, которые встретятся нам ниже. § 7. Задачи с бивалентными переменными Мы уже отмечали, что многие дискретные задачи опти- оптимизации легко сводятся к задачам линейного программиро- программирования, в которых переменные принимают значения 0 или 1. Очень легко приспособить для решения таких задач метод ветвей и границ. Простейший такой метод под названием «аддитивный алгоритм» был предложен Э. Балашем.
232 ГЛ. 5 МНОГОЭКСТРЕМАЛЬНЫК ЗАДАЧИ Рассмотрим задачу линейного программирования с бива- бивалентными переменными. Бивалентная линейная задача. Найти вектор х [N], компоненты которого принимают значения 0 и 1, удовлетворяющий условию а [М, N] X x[N\^b \M\ A3) и минимизирующий с IN] х х IN]. Делая, если нужно, замены переменных, можно привести эту задачу к эквивалентной задаче, в которой все с [/] не- неотрицательны. В дальнейшем мы будем предполагать, что необходимые замены уже сделаны и с [N] ^ О [N]. Каждый элемент разбиения будет определяться фикса- фиксацией значений нескольких компонент вектора х [N]. Для оценки минимума по оставшимся переменным можно, вос- воспользовавшись неотрицательностью векторас, всегда братьО. Таким образом, в каждом элементе разбиения мы будем задавать частичное решение — набор значений переменных на некотором подмножестве N' множества N и стараться продолжить это частичное решение до полного решения нулями. В тех случаях, когда это продолженное решение окажется допустимым, т. е. удовлетворяющим условию A3), оно будет оптимальным среди допустимых решений данного варианта. Если же это продолженное решение не является допустимым, т. е. если вектор Р [М] = а [М, N']x X х [N'] — Ь \М\ ' имеет отрицательные компоненты, то следует проверить, имеются ли у данного частичного реше- решения допустимые продолжения. Во всяком случае для существования таких продолжений необходимо, чтобы для любого i е М~ = {г | C [г1] <; 0} выполнялось неравенство ZleNfi ii, /1 + Р Ш > 0, A4) где N, = {/ | / ф N', a U, /] > 0} Если для какого-либо i это неравенство не выполняется, то данный вариант должен быть отброшен. Если же оно выполняется для всех таких индексов, то вариант должен быть развит. Для этого рекомендуется выбрать один из индексов отрицательности i е М~ и в множестве Nt выб- выбрать индекс /, при котором с [/] имеет наименьшее значение.
§ 7. ЗАДАЧИ С БИВАЛЕНТНЫМИ ПЕРЕМЕННЫМИ 233 По значению компоненты решения х [/] и следует произвести ветвление. При варианте перебора, соответствующем односторон- одностороннему обходу дерева, рекомендуется в первую очередь иссле- исследовать вариант, в котором переменной приписывается зна- значение 1. Для полного детального описания алгоритма нам не достает только способа задания информации о дереве ва- вариантов. Удобный метод задания этой информации был предложен А. Джеффрионом. Вся информация задается целочисленным вектором g IN], в котором g [N \ N'] = = О [N \ N'], g [/] = k, если х [/] было k-n по счету еди- единицей в текущем частичном решении (отмененные единицы здесь не учитываются), g [/] = — k, если х [/] было сделано нулем между назначением (к — 1)-й и k-и единицы в данном частичном решении. Запись в алгоритме состоит из информации о рекорде: значение целевой функции гее и вектор х* [N\; информации о текущем решении: вектор Джеффриона g IN), количество k единиц, зафиксированных в частичном решении, вектор Р [М], накопленное значение целевой функции у. Начальное значение записи: k = О, ?>{М] = — Ь Ш], у = 0, g IN] = х* [N] = О IN], rec=l+dJVlxl [N]. Правила переработки записей: 1. Образовать множество М~ — {i \ P li] < 0}. Если это множество пусто, записать новый рекорд гее := у; х* [/] : = б (g [/] > 0) для каждого /eJV и перейти к п. 5. 2. Для каждого i e М~ образовать множество Nt и проверить выполнение неравенства 2/ew,я U, /] + Р [t] ^ 0. Если для какого-либо i неравенство не выполняется, перей- перейти к п. 5. 3. Выбрать какое-либо i е М~ и / е Nit на котором достигается минимум с [/]. Если у + с [/] > гее, перейти к п. 5. 4. Увеличить k на единицу, пересчитать запись: Р Ш] := (l[Af] + fl Ш, /1; у:=у + с [/];. g [/] := Л. Перейти к п. 1. 5. Если k^ 1, то сделать шаг назад, отменив послед- последнюю единицу и назначенные после нее нули. Для этого
234 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ пересчитать запись: lor /eJV do if g[j] = — (k+l) then g[j]:=O else if g[j] = k then begin /1: = /; g[j\- = — k end; ?:=&—1; beta[M]: =beta[M] — a[M, jl]; gam: =gatn — c[jY\ и перейти к п. 1. 6. В случае если процесс дошел до этого пункта, в х* [N\ содержится оптимальное решение (причем, если гее > > с [N] х 1 [N], задача допустимых решений не имеет). Обоснование этого алгоритма вряд ли требуется — оче- очевидно, что он эквивалентен (по поисковым способностям) полному перебору. Рассмотрим небольшой пример. Пусть требуется мини- минимизировать 3Xi -4- 4хг + дх3 + 2х4 + Ъхь при условиях — 2х3 — Зх4 — Ъхъ + х3 — 4л;4 + Зх3 2. Результаты преобразования записей от шага к шагу будут сведены в табл, 17. В последних двух графах таблицы ука- указывается номер причины пересчета и комментарий к этой причине. Таблица 17 Л"» 0 1 2 3 4 5 6 7 8 9 10 1 -1 2 —3 3 —3 2 8 2 — 1 5 — 1 2 2 —4 ] 3 —1 —4 0 —4 —2 2 о ft 0 1 2 3 2 1 2 1 0 1 0 1 2 0 0 1 0 I 0 1 3 1 —3 1 0 1 2 1 -2 — 1 0 —1 1 1 i 3 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 5 0 0 2 2 2 —2 —2 —2 0 0 0 cst 0 3 6 10 6 3 7 3 0 4 0 rec 19 19 19 10 10 10 7 7 7 4 4 1 0 ( 2 3 ) 0 0 0 0 0 0 0 1 I 1 1 1 1 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 1 1 1 0 0 0 0 0 n 4 4 4 5 3 4 5 3 4 5 6 Пояснения 1=1,/=1 i=2,/ = 5 ( = l,/ = 2 1 = 2,1 = 2 i=l,/ = 2 Из примера хорошо видны достоинства и недостатки метода: его легко осуществить, он не требует сложных вычислений и объемов памяти. Однако этот метод плох тем,
$ 7. ЗАДАЧИ С БИВАЛЕНТНЫМИ ПЕРЕМЕННЫМИ 235 что мало сокращает перебор в сравнении с полным, исполь- использует слабые оценки, примитивный отсев и не дает доста- достаточно аргументированной стратегии ветвления. Многие из этих недостатков устраняются при исполь- использовании вспомогательных задач линейного программирова- программирования. Чтобы не усложнять дело техническими деталями, мы покажем, как выглядит это использование, на специаль- специальных задачах более простого вида. Прежде всего следует назвать простую задачу, имеющую большое сходство с задачей наилучшего раскроя. Задача о ранце. Имеется множество N (множество предметов) и два положительных вектора с [N] — стоимостей предметов и w [N] весов предметов. Требуется найти такое подмно- подмножество N' cz N, чтобы 1 IN'] х w W] < куО (вес отобранных предметов не превосходил заданного) и достигался максимум стоимости 1 W] х с W]. Для характеристического вектора х [N] множества N' мы получаем соответственно неравенство w IN] X'x IN] <ы'О A5) и значение целевой функции с \N] x x \N]. Реализовать в этой задаче метод ветвей и границ даже проще, чем в задаче линейного раскроя — не надо вычислять максимальное количество /-х предметов, которые могут умес- уместиться в остаток веса, можно взять не больше одного пред- предмета. Сложнее оказывается вариант этой задачи, в котором вместо A5) имеется целый набор ограничений. Многомерная- задача о ранце. Заданы множества М и N, положительные векторы b \М] и с IN] и неотрицательная матрица а Ш, N]. Требуется найти вектор х [N], удовлетворяющий усло- условиям *[/] е=0: 1, jeN, A6) а [М, N] х х IN] < Ь Ш\ A7) и максимизирующий с [N] x x [N].
236 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ На этой задаче мы и будем демонстрировать использо- использование линейного программирования. Если в многомерной задаче о ранце заменить условие A6) условием 1 IN] > х IN] > 0 [jV], мы получим задачу линейного программирования, двой- двойственная к которой выглядит следующим образом. Двойственная оценочная задача. Найти v [М] и v 1 [N], минимизирующие v Ш] X Ь Ш] + vl [Nl X 1 [N] при условиях 0 [Ml, vl Ш\ > 0 IN], u [M, N] + vl IN] > с IN]. Когда мы находим оптимальное решение непрерывного расширения многомерной задачи о ранце, то одновременно находятся оптимальные векторы v* [М] и vl* [N] из двой- двойственной задачи, и для оптимального х* [N] мы имеем по соотношениям двойственности х* [/] = 1 при vl* [/]>0, v* [М] х а \М, /] + vl* [/] = с [/] A8) при х* [/] > 0. Если обозначить у IN] = v* [M] х а Ш, N], то A8) можно переписать так: у [j] sg; с [/] при х* [/] =1, у lj] ^ с [/] при х* (}] - 0 и у [/] = с [j] при 0 < х* [/] < 1. Это небольшое отступление в линейное программирова- программирование потребовалось нам вот зачем: нам недостаточно для получения оценок избавиться от условия целочисленное™. Задача линейного программирования общего вида —• слиш- слишком громоздка, чтобы ее решать на каждом шаге вычисли- вычислительного процесса. Мы упростим и эту задачу, заменив огра- ограничения A7) одним ограничением (v Ш] х а Ш, N]) х х Ш] «с (v Ш] х Ь Ш\), где v [M] — любой неотрицательный вектор. Имеется много наводящих соображений в пользу того, чтобы в качестве v [M] взять v* [M]. Мы не будем здесь описывать эти аргу- аргументы — они не носят вполне определенного характера, главное соображение — вычислительные удобства, которые будет целесообразнее обсудить после описания алгоритма.
§ 7. ЗАДАЧИ С БИВАЛЕНТНЫМИ ПЕРЕМЕННЫМИ 237 Итак, введя, кроме вектора у [N], число р = v* [М] х х b Ш\, мы рассмотрим следующую задачу линейного программирования. Оценочная задача. Максимизировать с IN] x х [N] при условиях y[N] x НМ>р\ ( ' Решение этой задачи х IN] выглядит следующим обра- образом: х [у] = 1 при у [у] < с [/] и х [у] = 0 при у [/]>с [у], остальные значения выбираются произвольно с соблюдением ограничений A9). Однако, поскольку нас будет интересовать эта задача и при других значениях р, а также при уменьшенном множестве N, мы опишем общий алгоритм получения оптимальных решений в таких оценочных задачах. Идея состоит в том, что нужно выбрать такое /0 е N, что, разбив множество N на Nlt Nu и /0 по следующему принципу: Nl с {/ | с Щ/у (/] > с [/0]/Y ty0]}, Л/о с {/ | с [/]/Т [/] < с [/0]/т [/0]} и положив х [лд = 1 [yvj, х w0] = о [yv0], х [/„] = р - у [iV,] x 1 [Л/J, мы получили бы допустимое решение. Если это решение будет допустимым, то оно будет и оптимальным, так как z = с ljo]/y [у0] и vl [у] = с lj]/y [у] — г, / е Л/х дают соответствующее решение задачи, двойственной оце- оценочной. Нужный индекс /0 легко найти, расположив элементы по убыванию отношения с [j]/y [j]. При таком расположении можно, просматривая индексы, последовательно увеличи- увеличивать до единицы значения x-lj] и переходить к следующему индексу или, если ограничение A9) будет мешать, взять максимальное возможное значение х [j] и на этом прекратить процесс. В частности, если элементы уже расположены
233 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ в таком порядке и N = 1 : п, мы можем описать решение этой задачи следующим образом: /: = 0; rem: — beta; for /: == / + 1 while gam [/] < rem do begin *[/]: = 1; rem:— rem — gam[j\ end; x[j]: = rem/gam[j\; for /: = /-{-l step 1 until n do x[/]:=0 Однако точно придерживаться такого расположения пере- переменных оказывается неудобно. Подчеркнем поэтому, что нам важно лишь, чтобы к моменту выбора заключительного индекса /0 все индексы с большим значением отношения с [j]/y [/] были уже просмотрены. Итак, для оценки будет решаться оценочная задача. Ветвление будет проводиться простым и естественным об- образом — будет выбираться переменная х [/] и в одной альтернативе мы положим х [/] = 1, а в другой х [/] = 0. Политика выбора переменной для ветвления заслуживает отдельного разговора. Из неотрицательности матрицы а Ш, N) и положитель- положительности векторов Ь [М] и с [N] следует, что по оптимальному решению линейной задачи х* [N] мы можем построить до- допустимое решение исходной задачи х [/] = entier (x* [/]). Значение целевой функции этой задачи будет оценкой снизу для максимума, а оценкой сверху будет максимум оценочной задачи, который будет равен с IN] X х [N\ + с [Nb] x x* [Nb\ = = с IN] X х [N] + (P - у IN] X X IN]) (как уже указывалось в оценочной задаче, получающейся вначале, р1 = v* [М] х b [М.]). Таким образом, речь идет о сравнительно небольшом добавлении к значению целевой функции б = (р — у [N] хх [N]). Отказ от каждой единицы / е Nx, где N^ = {/ | с [/] > > у [/]}, приводит к потере части этого возможного прира- приращения, именно к потере не меньше чем с [Д] — у f/J (поскольку х [/J будет заменяться переменными с отноше- отношением с lj]/y [/], не превосходящим единицы). По этой при- причине ценность элементов множества А^ полезнее мерить не отношением с \j]fy [/], а разностью с [/] — у [/]. Ветвление с крупными значениями этой разности полезно проводить
§ 7. ЗАДАЧИ С БИВАЛЕНТНЫМИ ПЕРЕМЕННЫМИ 239 на самых верхних уровнях дерева, чтобы альтернативы получались по возможности неперспективные. Наконец, при одной и той же разности с [/] — у \j\ более высокое место должны занимать переменные с боль- большим значением. Действительно, при отказе от переменной с большими затратами ресурса возрастает количество пере- переменных, которые получают значение 1 в оценочной задаче, а следовательно, привлекаются переменные с худшим зна- значением с [j]/y [/] и теряется большая.часть возможного при- приращения целевой функции. Читателю, безусловно, видна вся нестрогость и прибли- приблизительность этих рассуждений. Это — рассуждения ' не математика, а проектировщика вычислений, учитывающего различные характерные свойства проектируемого процесса, проводящего эксперименты для проверки тех или иных рабочих решений и не имеющего времени дождаться, когда будет поставлена и решена задача о выборе наивыгоднейшей политики ветвления для решения многомерных задач о ранце данного класса. Итак, конструируя свой метод решения этой задачи, мы выберем следующее расположение переменных: i<j=EEC [i] s== gam [i] /\ (с [i] - gam [i]>c j /] - gam [j] \/ \/(c[i]-gam\i] = c[j]-gam[j]/\c[i]>c[j]))\J с [i] < gam [i\/\c[i\lgam [i] =э= с [j]/gam [j] (сначала множество Nlt затем Nb, затем No, элементы Ni U Nb расположены в порядке убывания с [/] — у [/), а при одинаковых значениях разности по убыванию у [/], элементы No — по убыванию с lj]/y [/]). Каждый элемент разбиения множества допустимых ре- решений будет состоять из всех решений, продолжающих не- некоторое частичное допустимое решение, т. е. в каждом таком элементе а будут фиксированы некоторое число ka и вектор ха И '¦ ka], и в этот элемент будут входить все допустимые решения у [1 : п], для которых у [1 : ka] = = ха [1 : ka]. Информация о состоянии вычислительного процесса будет состоять из информации о рабочем частичном решении: числа kl, векторов х [1 : И] и Ь Ш] : = Ь \М\ — а Ш, 1 : '. kl] х х [I : kl], k2 — номера переменной, после которой останавливается решение оценочной задачи, est — оценки
240 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ максимума, полученной из решения этой задачи, с\ = = с [1 : П] X х [1 : И] и rem — значения х \k2 + 1] х X да [&2 + 1], а, кроме того, из обычной информации о рекорде bestsol [N] — наилучшее допустимое решение и гее = с [N] X bestsol [N]. Теперь мы можем прямо описать этот метод в виде ал- гольской процедуры. Решение двойственной задачи v [M] будет считаться заданным. Примем М = 1 : т, N = 1 : п. procedure multiknapsack (т, п, а, Ь, с, v, bestsol, rec); value т., п; integer m, n; real rec; integer array a, b, bestsol; array c, v; begin integer i, j, k, k\, k2; real rem, c\, g\, d\, ci, gi, di, est, el; integer array b\ [1 :m], x, nom[l : n]; array gam [1 : n]; rec: = rem: ==0; for i: — \ step 1 until m do rem: = rem-\-b[i] x v[i]; for k: = 1 step 1 until n do begin g\: = 0; x[k]: = bestsol [k]:=0; for /: = 1 step 1 until m do gl:—gl+a[i, k] x y[t]; l[A] rfl ll [*]l for j:=k— 1 step —1 until 1 do begin t: = nom[j]; ci: =c[i]; gi: =gam[i]; di: =ci/gi; if cl>gl/\(cl-gl>ci-gi\Jcl-gl = = ci — gi[\c\>ci) \Jc\ ^g\f\(d\>di\Jd\ =*di/\c\ >ci) then пот [/ + 1 ]: = пот [/] else begin nom[j+l]: = k; go to mkk end end /; пот [I]: =k\ mkk: end k; cl:=est:=0; k\:=k2: = 0; mkest: for k:=k2-\-\ step 1 until n do begin j:=nom[k]; gl:=gam[j]; if gl^rem then begin es^: =es/-f-c[/]; rem: = rem — g\ end else begin k2:~k— 1; г\: = гет X c[j]/g\; go to /n/tel end end /г; ^2:=«; el: = 0; : if est + el <:Гвс then go to mkback; for &: = /fel + l step 1 until k2 do begin j: — nom[k]; k\:=k;
§ 7. ЗАДАЧИ С БИВАЛЕНТНЫМИ ПЕРЕМЕННЫМИ 241 for i: = l step 1 until m do begin bl[i]:=b[i] — a[i, /]; if M[/]<0 then go to tnkzero end; for i: = 1 step 1 until m do &[i]: = fcl[/]; cl: = cl+c[/]; x[k]: = l; if cl>/-ec then begin rec: = c\\ for /: = 1 step 1 until n do bestsol [nom[j]]:=x[j] end end &; if k2<n then begin ?2: =?2+1; x[k2]:=0; Jfel: = A2; if k'Kn then go to mfees^ end; mkback: for ?: = &1 step —1 until 1 do if x[&]=l then begin }: = nom[k]; k\\ — k\ cl: = cl-c[/]; for i: = 1 step 1 until m do b[t]:=6[t] + a[t, /]; go to tnkzero end k\ go to mkfin; tnkzero: x[k]: = 0; rem: = rem-\-gam[j\, est: = est — c[j]; go to mkest; mkfin: end Аналогичный метод может быть предложен и для задачи с бивалентными переменными общего вида, а при некоторых модификациях и для общей задачи линейного программиро- программирования с условием целочисленности всех или некоторых пе- переменных. Отметим, что многие комбинаторные задачи, похожие на уже встречавшиеся, можно свести к задачам с бивалент- бивалентными переменными. Однако непосредственное «шаблонное» сведение приносит мало пользы. Нужно помнить, что метод улучшенного перебора по сути дела дает лишь идею алго- алгоритма. Его реализация может оказаться и очень плохой, и очень хорошей в зависимости от оценок, политики и спо- способа ветвления, формы представления данных, причем насколько удачны эти все параметры процесса определяется не только задачей, но и сочетанием исходных данных. Например, уже отмечалось, что алгоритм нахождения наилучшего раскроя окажется неудачным при c[N] — I IN]. В только что описанной процедуре ее трудоемкость сущест- существенно зависит от того, насколько велик разброс в значениях с ii]/y [i] (чем больше разброс, тем лучше) и разброс в зна- значениях у [i] (чем меньше, тем лучше).
242 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ Для комбинаторных задач лучше использовать воз- возможности организации перебора непосредственно в тер- терминах исходной задачи. Рассмотрим, например, задачу о нахождении числа внутренней устойчивости из § 1. Мы можем просто пере- перебрать с помощью одностороннего обхода дерева все внут- внутренне устойчивые множества, включая или не включая в них очередной элемент. Для оценки здесь удобно исполь- использовать число элементов накопленного множества плюс число элементов, с которыми не связан очередной элемент. Информацию о графе при такой оценке удобно предста- представить в виде набора списков вершин, не связанных с данной вершиной и имеющих больший номер, чем она. В начальной части процедуры такое представление информации гото- готовится по традиционному представлению графа в виде раз- размеченного списка концов дуг. Списки вершин содержатся в массиве а, а в Л содержится его разметка. Массив t используется для магазинного хранения кандидатов во внутренне устойчивые множества для раз- различных уровней перебора, в /[0 : т—1] хранится раз- разметка этого массива, а в / [0 : т — 1] — степень использо- использования списка кандидатов каждого шага. integer procedure intstab (m, 1st, /); value m; integer m; integer array 1st, j; begin integer i, i\, 12, /1, fp, k, rec, est; integer array /, /, П [0 : m — 1], a, t[l :mx (m— 1)/2J; fp: -=m x (m—1)/2; k:=m + m — 4; for i: = 1 step 1 until fp do a[/]: = l; for i: = 1 step 1 until m do begin t[i\. — i; for /f: = /s*[t--l]+l step 1 until 1st[i] do begin tl: = /[/l'j; if i\<i then begin i2: = tl; i\:=i end else /2: = i; a[(k + i2) X i'2/2-f П]: = 0 end end i; /l[0]:=/p:=0; il: = 0; for i: = 1 step 1 until m do begin for /2: =/-1-1 step 1 until m do begin il: = i\ + 1; if a[i\] = 1 then begin [p:=fp + l;a[fp]: = # end; end; l\[k]:=fp end i;
5 8. ЗАДАЧА РАЗМЕЩЕНИЯ ПРОИЗВОДСТВА 243 /p:=m+l; /*[0]:=l; ?: = w:=0; /[0]: =est: = т; mkest: if es^ «s rec then go to tnkback; il: = t[f№ «2:=/[*]+l; /1:-/1 [il - П; /[*+!]: =/p; for t: = i2 step 1 until l[k] do begin for /1: = /1 + 1 while a[jl]<t[i] do if /1 >/l [/1] then go to mkf; if a[/ll>/[f| then /1: = /1-/ else begin t[fp]:—a[j\]; fp:=fp-\-\ end end i; mkf: k: = k+l; l[k\:=fp~\; est: = k + fp~f[k]; if k> rec then rec: — k; go to mkest; tnkback: if ?>0 then begin *: = A-1; /[/г]: =/[*]+ 1 ; /p: ==/[*]+1; es/:=A4-/p —/[A]; go to mkest end; intstab: = rec end intstab § 8. Задача размещения производства Мы рассмотрим здесь один из простейших вариантов задачи размещения производства и на нем продемонстри- продемонстрируем, что и схема одновременного ветвления имеет доста- достаточно удобные реализации. Задача размещения производства. Пусть М — 1 : т — множество пунктов, в которых могут располагаться заводы, производящие некоторый однородный продукт, а N — т-{-\: т + п — пункты потребления этого продукта. Заданы объемы потребления b \N], матрица стоимостей перевозки ct\M, N], а кроме того для каждого i e M задано множество вариантов строительства завода D*. Пусть D = \jieMDi. Каждому rfeD сопоставляются две величины — объем произ- производства a [d] и стоимость осуществления этого варианта eld]. Требуется найти такой набор вариантов строитель- строительства d [М] и такой план перевозки х [М, N], чтобы достигался минимум суммарных затрат (с и ct считаются приведенными к единым измерителям) 1 [М] X с Ы [М]} + Zi^M.j^Nct li, у] X х [I, /1, B0)
244 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ причем х[М, АЧ>0 Ш, N), B1) d li] е= Dh i е= Л*, B2) 1Ш] X хШ, N] = fc- [TV], B3) v Ш, jV] x 1 [jV] й= a [d МП. B4) В этой задаче метод одностороннего обхода не дает обычно хороших результатов из-за большого числа примерно рав- равноправных вариантов, разница между которыми начинает чувствоваться лишь при больших уровнях ветвления, поэ- поэтому схема одновременного ветвления здесь "предпочти- тел ьнее. В качестве частичных решений будут рассматриваться векторы d [1 : k], где k < т, удовлетворяющие условию B2). Решение, продолжающее d [I : k], описывается век- вектором d Ik -¦- 1 : т] и матрицей х [1 : т, N], удовлетво- удовлетворяющей B1), B3), B4). Для построения оценки на множестве продолжений d [I : k] мы будем решать следующую расши- расширенную задачу. Найти d [k + 1 : т] и х Ш, N], удовлетворяющие условиям B1), B2), B4), х li, N\^b IN], B5) ИМ] х х Ш, N] х 1 [/V] = 1 [N] х Ъ [N] = р B6) и максимизирующие B0). Будем, кроме d \M], выбирать вектор объемов произ- производства у \М], удовлетворяющий условиям у\М]^а Id [МЛ, ИМ] х у Ш] = р. B7) Тогда мы сможем переписать нашу задачу B5), B6) следую- следующим образом. Найти d [k + 1 : т], у [М] и х Ш, N1, удовлетво- удовлетворяющие условиям B1), B2), B6), B7) и х Ш, N] X HN] = у [М\ B8) и минимизирующие B0). Отметим, что при фиксированном у li] поиск х li, N] превращается в этой задаче в линейное расширение задачи о ранце, встречавшееся нам в § 4 гл. 1 и в § 7 этой главы,
§ 8. ЗАДАЧА РАЗМЕЩЕНИЯ ПРОИЗВОДСТВА 245 Мы можем решить эту задачу предварительно и сопоставить каждому i и каждому значению yeO: max {a [d\ \ d e= D;} некоторое число с\ (i, у). Тогда наша оценочная задача будет выглядеть так: Оценочная задача. Найти d Ik -'- 1 : т] и у [М], удовлетворяющие B2), B7) и минимизирующие XteM-i:md (r\ y\i\). B9) Для решения этой задачи мы сведем ее к эквивалентной задаче о кратчайшем пути. Пусть М' — множество всех пар (t, /), где i g 0 : я, jeO: р1. Проведем из (i — 1, /) в (t, /') дугу стоимости с\ (i, /' — /), если 0 ^ I' — I ^ r (i), где г (i) = max {a Id] | d e D;} при i> k к г {i) ~ a [d [i\\ при i «s; k. Легко видеть, что кратчайший путь из @, 0) в (т, Р) как раз и дает решение оценочной задачи. Мы описали способ оценки. Способ ветвления будет таков: выбрав вариант с наименьшей оценкой, возьмем вектор d [1 : пг\ из оценочной задачи и найдем для полу- полученного набора решений оптимальный план перевозки. Полученное допустимое решение надо, разумеется, сравнить с рекордом. Затем образуем т альтернативных вариантов — при каждом k е 1 : т зафиксируем d [I : k — 1] и запретим использовать d Ik]. Таким образом, каждый из элементов разбиения множества решений будет описываться вектором d П : k] и набором запретов в множествах Dh i e 1 : k + 1. Пусть теперь множества D,- — непересекающиеся отрезки натурального ряда, [}Di = 1 : ndec, 1st [0 : т] — вектор разметки этого множества, векторы а, с [1 : ndec] таковы, как они были описаны в задаче размещения производ- производства, N = т -\~ I : т -{- п, Ь [N] — вектор потребностей, ct [1 : т, т -f 1 : т + п] — матрица стоимостей перевозки. Опишем наш алгоритм в виде процедуры на алголе-68 с необходимыми комментариями: proc EtneliKomlik = (ref[ \ int a, b, с, d, 1st, jt, xt, ref[,] int ct, int cost, costt) void: begin int m~upb 1st, n = upb b, ndec = upb a; mode cand = struct (ref cand next, ref ban f, int est, [ 1 : m] int d)
^46 ГЛ. 5. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ со это структура для описания вариантов. Главное — век- вектор решений d и оценка est. next используется для цепных списков. Имеется ссылка на запрет ban, который сам будет ссылаться на другие запреты, составляющие иерархическое дерево. Пройдя по этому дереву от f до корня, мы найдем все запреты данного варианта со; mode ban = struct (ref ban pre, int dec, fol); со dec —это сам запрет, fol — число ссылок на данный запрет (которое нужно, чтобы утилизировать ненужные запреты). Мы не будем для экономии места включать в эту про- процедуру блоки нахождения кратчайших путей со ban zeroban: = (nil, 0, 0); со это корень дерева со ref ban fban: — n\\, со jban — начало списка пустых мест со be, bc\, newb; cand candO: = (nil, zeroban, 0, skip); ref cand fcan: = nil, со тоже список пустых мест со first: = candO, cand, candl, cand2, cd, cd\\ int rec: =maxint, btot: = 0, a2, аЪ, с2, c2>, dmin, d\, il, i2, min; for i from m + 1 to n do blot +: = b [i] od; [1 : ndec] bool p; [0: m] int d, a\; shortest path {1, candO) ; со эта процедура находит кратчайший путь и записывает его в d of cand 0, а его оценку в est of cand 0 со while lin first do if est of {cand: = head first) < rec then study {cand, jt, xt, rec, costt); со эта процедура формирует по варианту cand данные для транспортной задачи, решает ее и, если суммарные затраты меньше рекорда, записывает в // и xt оптимальный план, в costt — транспортные затраты, новый рекорд в гее и век- вектор решений в d of cand. Теперь будем строить альтернатив- альтернативные варианты со for / to ndec do p [/]: = true od; il: = ndec; bc:=f of cand; cl[0]: = al[0]: = c2: = c2: = 0; for i to m do cl[i]: = c2 + :=c[dl: = {d of cand)\i]\; al[i]: = a2 + : = a[dl]i p[d\]: = false od; со запрещаем то, что использовалось в нашем варианте.
§ 9. ВЫБОР НАИЛУЧШЕГО РАЗБИЕНИЯ 247 Обратите внимание, как производится вырезка из мульти- значения, являющегося полем в структуре. Массивы с\ и а\ нам потом пригодятся со for i from m by —1 to 1 do bc\: — bc; i2\ — i\; rl: = /s/[t-l]; while{d\: = dec of bc)>i\ do p[dl]: = false; bc: = pre of be od; tnin: = maxint; d\: = (d of cand)[i]; for dO from fl-f 1 to /2 do if p[dO] then (cf of cand)[i]:=dO; shortest path (i, cand); if est of cand<min then min:=est of ш/гс/; best: = d of caftd fi fi od; if /iiifi < rec then randl: = if lin fcan then head /ca« else heap cand//; newb: = U lin /&on then head /dan else heap ban fi; ref ban(newb): = (bc\, d\, 0); fol of bcl + : = l; ref cand(candl): = (nil, мешЬ, mi'n, fees/;; со мы образовали новый вариант, который сохраняет все запреты варианта cand в пунктах 1 : г и, кроме того, имеет собственный запрет d\ = (d of caiid) [i]. Место для нового варианта и нового запрета берется из «мусора» или генери- генерируется заново. «Наследование» записей достигается тем, что новый запрет newb сразу «прицепляется» к первому из запретов cand в п. L Далее новый вариант включается в цепной список first так, чтобы сохранялось неубывание оценок (см. процедуру inclel в первой главе) со if lin first then inclel {first, cand) else first: = candl fi fi od fi; to теперь осталось только собрать мусор со bc:=f of cand; fcan cons cand; while fol of be = 0 do fban rob be; fol of be—: — 1 od od end § 9. Выбор наилучшего разбиения В этом параграфе мы рассмотрим одну задачу построения наилучшего разбиения множества. Интересен метод, кото- которым будет решена эта задача — в нем метод ветвей и границ сочетается с наивным и на первый взгляд совершенно непер-
248 ГЛ. 3. МНОГОЭКСТРЕМАЛЬНЫЕ ЗАДАЧИ спективным подходом. Однако алгоритм получается чрез- чрезвычайно эффективным. Будет рассматриваться следующая задача. Задача о куче камней. Имеется множество камней N, каждому из которых / сопоставлено положительное число — его вес w [/']. Тре- Требуется разделить это множество на заданное число куч m таким образом, чтобы вес самой тяжелой из куч был мини- минимален. Иными словами, требуется найти такое разбиение У1: N — Uiei-.mNi, которое'минимизирует max {1 ШЦ х w Ш,] | i e= 1 : tn). C0) Пусть нам требуется решить задачу: | Минимизировать f (х) по х s Л Предположим, что мы имеем два числа est и гее, для которых известно, что est < max {/ (л;) | х е 1} <; гее. Выберем какое-либо число z e (est, rec) и рассмотрим задачу: z-з а д а ч а. j Найти хе/1, для которого / (z) sg; z. Если нам удастся найти решение этой задачи, то z можно взять в качестве нового значения гее, после чего можно повторить процесс. Если мы покажем, что г-задача решения не имеет, то z можно взять в качестве нового зна- значения ей и также повторить процесс. Главная трудность здесь разумеется лежит в способе решения получающейся z-задачи. Оказывается в некоторых случаях, в том числе и в задаче о куче камней, можно искать решение г-задачи методом ветвей и границ. Действительно, 2-задача, соответствующая задаче о куче камней, выглядит следующим образом. Найти разбиение У1 : N — [jiei-.m^i, при котором 1 [Nt] х wWi}^z, ieliffl. C1) Будем решать эту задачу методом ветвей и границ с односторонним обходом дерева вариантов. Можно пред-
§ 9. ВЫБОР НАИЛУЧШЕГО РАЗБИЕНИЯ 249 ставить себе т «ящиков» для камней, каждый из которых ¦ имеет вместимость z. Таким образом, в ящиках должно оставаться свободное место slack = z X т — 1 [TV] x w \N]. Будем укладывать камни в ящики, последовательно запол- заполняя один ящик за другим и стремясь каждый раз уложить в ящик самый большой из оставшихся (и помещающихся) камней. Остающееся в ящике свободное место будет вычи- вычитаться из остатка свободного места slack, а этот остаток дол- должен будет в течение всего вычислительного процесса оста- оставаться неотрицательным. Если slack станет отрицательным, мы вернемся и отменим последнее из назначений, как это и полагается делать при одностороннем обходе. Покажем действие этого алгоритма на небольшом примере. Пусть исходная куча состоит из 16 камней: 72, 70, 69, 64, 58, 54, 52, 49, 36, 35, 34, 31, 29, 23, 21, 20, суммарный вес которых 717. Пусть т —¦ 4, таким образом, максималь- максимальный вес должен быть больше чем 179. Оценка сверху для минимума максимального веса есть 717. Явно, что эта оценка завышена, поэтому г мы выберем поближе к 180. Попробуем решить эту задачу с г= 183. Свободное место составляет 183 X 4 — 717 = 15. Заполняем первый ящик. Будем записывать наши действия двумя строками, в верхней — остаток места в ящике, в нижней — выбранный камень. Итак, 1 ящик. 183, 111, 41, 5, остаток свободного места 15 — 5— 10. 72, 70, 36 Аналогично 2 ящик. 183, 114, 50, 1, остаток 10 — 1 = 9. 69, 64, 49 3 ящик. 183, 125, 71, 19, слишком большой остаток, 58, 54, 52 отменяем назначение 52 и назначаем следующий камень 35. Итак, 3 ящик. 183, 125, 71, 36, 2. 58, 54, 35, 34 Четвертый ящик можно не заполнять — в него уместится все остальное со свободным местом 7. Теперь мы знаем, что минимум лежит между 180 и 183. Попробуем решить z-задачу с 2= 181. Первоначально stack = 7, ' 1 ящик. 181, 109, 39,3, stack = 4. 72, 70, 36 2 ящик. 181, 112, 48, 13. 69, 64, 35 После ряда попыток получаем 2 ящик. 181, 112, 48, 25, 4, slack = 0, 69, 64, 23, 21 и также после перебора 3 ящик. 181, 123, 69, 34, 0. 58, 54, 35, 34 Читателю предбетавляется возможность найти решение г-задачи с г = = 180.
250 ГЛ. 5. МНОГОЭКСТРЕМЛЛЬНЫР.ЗАДАЧИ При реализации этого алгоритма на ЭВМ существенно организовать информацию- так, чтобы достаточно просто производился выбор наибольшего из оставшихся камней, вес которых не превосходит свободного места в ящике. Мы сделаем справочник, указывающий для каждого размера w наибольший камень pi Ы, а для каждого камня будем помнить ссылки на левого и правого соседа. При этом правая ссылка будет указывать на очередного мень- меньшего невычеркнутого соседа у всех камней, а левая ссылка— только у невычеркнутых. Такая организация позволяет просто восстанавливать информацию при возвращении кам- камней из ящиков. Значение г на первом шаге определяется как est -f- d, где d — параметр процедуры. В дальнейшем в качестве г принимается полусумма est и гее. Результат получается в массиве res [1 : п], в котором последовательно выписаны элементы множеств разбиения, причем первые элементы помечены знаком минус. procedure best partition (я, с, т, A, res, s); value n, m, d; integer n, m, d, s; integer array с, res; begin integer i, /, k, II, n\, r, r\, sim, sp, sum, slack, (ait; integer array list, t, rt, t [0:n-\-\], jst [\:m\, for i: = 1 step 1 until n — 1 do for /: = i + l step 1 until n do if c[i]<c[j] then begin k: = c[i]; c[i\. =c[/]; c[j]: — k end; n\: — n-\-1; begin integer array pl[\ :c[l]]; /: = c[lj; sum: = 0; for i: = 1 step 1 until n do begin r: = c[i]\ sum:=sum + r; for k: = / step — 1 until r do pi [k]: = i; j: = r— 1 end; for k: — j step—1 until 1 do pl[k\. = n-\-\\ sim: = (sum — 1) -:-m; sp: = sum; s:~sim-\-d; mks: if s^ssp then begin s: = (sim-\-s)/2; go to mks end; for i: = \ step 1 until n+l do begin U[i]: = i—l; rt[i — \]: = i end; slack: = sxm — sum; A:=0; /: = 1; mknew: k: = k+ 1; fst[k]: = j; list [j]: = r. = rt [0]; /:=/-fl; tail: = s-c[r]; It [rt [r]]: = 0; for г: = 0 step 1 until r-1 do rt[i]: = ri[r]; if j = n+l then begin t[k\: = tail; go to mk 6 end;
§ 9. ВЫБОР НАИЛУЧШЕГО РАЗБИЕНИЯ 25! mkd: if tail^c[lt[n+l]\ then begin r: = if tail > с [I] then 0 else if pl[tail]>r then (pi[tail]— 1) else r; mkl: r:=rt[r]; if r = n+l then go to mko; list[j]: = r; /: = /+l; tail: = tail-с [r]; lt[rt[r]]: = lt[r]\ for /: = /*[/•] step 1 until r-1 do rt [i]: = rt [r]; if j — n-\-l then begin ^[/e]:=to7; go to tnkb end; go to mkd end else if slack > /ш7 then begin slack: = s/ac? — tail; t \k\. = to7; if k<im—\ then go to mknew end else begin /: = /'— 1; if / = /s/[?] then begin k: = k— 1; r: = /isf[/]; /:=/— 1; [ [[]] for i: = //[r] step 1 until r—1 do rt[i\:=r; if /г = 0 then go to mAl else foi7:=/[?] end; r: = /i"s/[/J; Я[г/[г]]:=-а; to7: = tail + c[r]; for г: = //[r] step 1 until r-1 do rl[i]: — r; go to mkl\ mk\: end; тйб: if k — 0 then begin sim:—s; if sp = sum then begin s: = s -)- d; go to m?6 end end else begin fst[k+ 1]: ==/'; ^ [m]: =sZac?; t: = 0; for i: = r/[t] while t'<n+l do begin /is< [/]: = ("; /: = /+l end; for i: = 1 step 1 until n do res[/]: = с [list [г]]; for t: = 1 step 1 until k-\-\ do res [fst [i]]: = — res [/s/ [г]]; for г: = й step—1 until 1 do if slack > / [i] then slack: = / [г]; sp: = s — s/ac/г; if sp > sim + 1 then go to mks end; s: = sp end end bpart
ГЛАВА 6- РЕКУРРЕНТНЫЕ МЕТОДЫ (МОДЕЛИ ДИНАМИЧЕСКОГО ПРОГРАММИРОВАНИЯ) § 1. Линейная задача раскроя В этой главе будут рассматриваться главным образом модели, в которых удается использовать рекуррентные соот- соотношения типа соотношений, вводившихся при решении за- задачи о кратчайшем пути. Мы начнем с уже знакомой нам задачи наилучшего линейного раскроя. Итак, как и в прошлой главе, требуется найти целочисленный вектор, удовлетворяющий условиям xll : fllSsO [1 : и], / [1 : п] X х [1 : я] </0 A) и максимизирующий с [ 1 : п] х х [1 : п]. Теперь мы пойдем в решении этой задачи другим путем. Будем для простоты считать все / Ш и /О целыми числами. Это позволит ограни- ограничиться в дальнейшем рассмотрении конечным множеством различных размеров сырья. Рассмотрим граф (М, N} с множеством вершин 0 : 10. Каждой вершине этого графа i сопоставим множество дета- деталей Ni, которые можно отрезать от заготовки длины Nt = {/ е= 1 : п | / [/] < О, а каждой из таких деталей / сопоставим дугу, ведущую из i в вершину i — / [у] и приносящую доход с [у]. Добавим, кроме того, в каждой из вершин ie 1: /0 дугу, по которой можно из i перейти в i — 1 с нулевым доходом. Покажем, что исходная задача о наивыгоднейшем ра- раскрое эквивалентна задаче о нахождении пути наибольшей длины в построенном графе. Действительно, каждый такой путь можно интерпретировать как последовательность дета- деталей, отрезаемых от единицы сырья. С другой стороны, каж- каждому раскрою — набору отрезаемых деталей — можно со- сопоставить (не единственным способом) последовательности
§ 1. ЛИНЕЙНАЯ ЗАДАЧА РАСКРОЯ 253 в которой эти детали отрезаются и, следовательно, путь от вершины /О до вершины 0 в графе (ММ). Поскольку в графе (М, А') нет контуров, то задача о поиске пути наибольшей длины имеет смысл и может ре- решаться методами, описанными в гл. 4. При этом каждой вершине ig 1: /О сопоставляется исходящая из нее дуга kt (деталь kh отрезаемая от остатка сырья длины i, — в тер- терминах нашей задачи политика кроя). Принимая v [0] = 0, мы можем при данной политике кроя вычислить набор потенциалов v [1 : /0] v [i] = с [kt\ + v[l — l lk,]\. Для того чтобы эта политика кроя была оптимальной, необходимо и достаточно, чтобы эти потенциалы удовлет- удовлетворяли условиям v Ш + с Ш < v U + / [ife]]. B) Потенциалы здесь имеют ясный смысл: v [i] — доход (а в оп- оптимальном решении максимальный доход), который можно получить при раскрое сырья длины t. Сопоставляя A) и B), мы получаем для оптимальных v [i] уравнение v Ш = max {с Ik] + vli — l Ik]] | k e= A'J C) Это уравнение называется функциональным уравнением Р. Беллмана или функциональным уравнением динамического программирования. Если мы сможем решить это функцио- функциональное уравнение и одновременно для каждого i выберем управление, на котором в C) достигается максимум, мы получим оптимальную политику кроя. Фактически уравнения Беллмана нам встречались и раньше, когда речь шла о кратчайших и самых длинных путях в графе. В этой главе мы будем систематически иметь дело с такими уравнениями. В рассматриваемой сейчас задаче имеется простой спо- способ решения уравнения Беллмана: достаточно вычислять v U] последовательно от v [1] до v [10], запоминая управле- управления, на которых достигался максимум. В примере, рассматривавшемся в предыдущей главе, мы получаем табл. 1 значений v [i] и управлений (в число Деталей включена деталь длины 1 с нулевой ценой). В этом
254 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ примере хорошо видна характерная особенность реше- решения — кусочное постоянство v [i] как функции от i и мо- монотонное неубывание этой функции, Можно воспользоваться этим обстоятельством и сократить информацию, необходи- необходимую для задания приведенной таблицы, ограничившись лишь строками, в которых не используется деталь 1 (табл. 2). Таблица 1 p. о (Г! И 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 .23 24 25 ГО X 3 о 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 20 20 20 23 23 23 23 23 j. S J.0 Ч 1 1 1 1 J 1 ] 1 9 9 9 9 9 9 9 9 9 9 9 9 21 21 21 21 21 О. 3 S 0. 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 4! 42 43 44 45 46 47 48 49 50 ТО Я 0) О 23 30 30 30 33 33 33 33 33 33 40 40 40 43 45 45 46 46 46 50 50 50 53 55 55 j. га JO Ч 21 9 9 9 21 21 21 21 21 21 9 9 9 21 40 40 21 21 21 9 9 9 21 40 40 сх о г 3 а. 5! 52 53 :Л 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 ТО X ¦§ о 56 56 56 60 60 60 63 65 65 66 68 68 70 70 70 73 75 . 75 76 78 78 . 80 80 80 83 к ч 21 21 21 9 9 9 21 40 40 21 40 40 9 9 9 21 40 40 21 40 40 9 9 9 21 О. ! ? 76 77 78 79 80 81 82 83 81 85 86 87 88 89 90 91 92 из 94 95 96 97 98 99 Г СО X h о 85 85 86 88 90 90 91 91 93 95 95 96 98 100 100 101 101 103 105 105 106 108 ПО ПО 111 ч 40 40 21 40 40 9 40 40 21 40 40 21 40 40 9 40 40 21 40 40 21 40 40 9 40 Более того, оказывается возможным построить вычисли- вычислительный процесс таким образом, что в нем будет получаться непосредственно эта сокращенная таблица. Мы будем за- задавать ее списком, каждый элемент которого состоит из размера сырья, получаемого из этого сырья дохода и детали, которую следует отрезать от сырья этого размера. Список
§ 1. ЛИНЕЙНАЯ ЗАДАЧА РАСКРОЯ 255 будет предполагаться упорядоченным по возрастанию раз- размеров сырья. При этом он должен оказаться строго упоря- упорядоченным и по доходам. Действительно, записи, в которых сырья тратится больше, чем в других, а доход получается меньше, интереса не представляют. Мы будем говорить, что запись с размером сырья Хх и доходом yt доминирует запись с сырьем Х2 и доходом у.г, если А,д «s; i2 и Yi > уг. Таблица 2 а го га а. 9 18 21 27 30 36 39 40 42 45 48 49 51 54 3 а О 10 20 23 30 33 40 43 45 46 50 53 55 56 60 л "^ 9 9 21 9 21 9 21 40 21 9 21 40 21 9 1 & 1 Н ; Я ! а 1 ¦ I 57 58 60 61 63 66 67 69 70 72 75 76 78 79 га О 63 65 ОС) 68 70 73 75 76 78 80 83 85 86 88 ¦ н О ч 21 40 21 40 9 21 40 21 40 9 21 40 21 40 Р, О 2 а 80 82 84 85 87 88 89 91 93 94 96 97 98 100 X X си о 90 91 93 95 96 98 100 101 103 105 106 108 ПО 111 Л ч 40 40 21 40 21 40 40 40 21 40 21 40 40 40 На каждом шаге к самой первой из имеющихся в рабо- рабочем списке записей будет прибавляться каждая из дета- деталей: размер сырья будет при этом равен сумме размера в ис- исходной записи и длины прибавляемой детали, доход будет равен сумме имеющегося дохода и цены прибавляемой детали, в качестве отрезаемой детали будет указана эта прибавляемая деталь. Полученный набор новых записей вливается в рабочий список с соблюдением условий упоря- упорядочения: по длине и по доходу записи, которые домини- руются другими, из списка исключаются. Записи, в кото- которых размер сырья превосходит /0, в список также не вклю- включаются. Использованная уже первая запись рабочего спи- списка передается в архивный список, а процесс повторяется До исчерпания рабочего списка.
256 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ Проследим на нескольких шагах того же примера работу этого алгоритма. Шаг Рабочий список Новый список 1 0, 0, 0 (9, 10, 9), B0, 20, 20), B1, 23, 21), C7, 40, 37), D0, 45, 40) 2 9, 10, 9 A8, 20, 9), B9, 30, 20), C0, 33, 21) 20, 20, 20 D6, 50, 37), D9, 55, 40) 21, 23, 21 37, 40, 37 40, 45, 40 3 18, 20, 9 B7, 30, 9), C8, 40, 20), C9, 43, 21), 21,' 23, 21 E5, 60, 37), E8, 65, 40) 29, 30, 20 30, 33, 21 37, 40, 37 40, 45, 40 46, 50, 37 49, 55, 40 После завершения третьего шага рабочий список состоит из B1, 23, 21), B7, 30, 9), C0, 33, 21), C7, 40, 37), C9, 43, 21), D0, 45, 40), D6, 50, 37), D9, 55, 40), E5, 60, 37), E8, 65, 40), а архив — из записей @, 0, 0), (9, 10, 9), A8, 20, 9). Отметим, что для задачи линейного раскроя можно, изменяя множество состояний, писать различные варианты уравнения Беллмана, соответственно разнообразя вычисли- вычислительную схему. Например, считая состоянием пару из длины сырья i и наибольшего номера детали k, разрешен- разрешенной к отрезанию, мы получим функциональное уравнение v li, k] = max {с Ш х г + v И — г х / [k\, k — 1] 10 < г < entier {ill Ш)}, D) v [0, k] = v [I, 0] = 0. Нас интересует v [10, п]. Нетрудно представить себе вычислительную схему, соответствующую этому уравне- уравнению (здесь используется dec — целочисленный массив
¦ § 1. ЛИНЕЙНАЯ ЗАДАЧА РАСКРОЯ 257 решений, принимаемых в состояниях процесса, х — вектор раскроя): for г:=0 step I until /О do и[0, i]: = 0; for k: = 1 step 1 until n do begin ck: = c[k]; lk: — l[k]; for i: = 0 step 1 until /0 do begin max: = v [k — I, (']; d: = 0; for r: = 1 step 1 until entier (i/lk) do if max < ck x r + v [k — 1, t — r x Ik] then begin max: =ckxr-\-v [k— 1, i —rx/A]; d:=r end; u[&, /]:=max; dec[k, i]: = d end / end &; d:= Ю; for k: = n step—1 until 1 do begin x[k]: = dec[k, d]\ d: = d — x[k]xl[k] end Бросается в глаза вычислительная нерациональность этой схемы. Во-первых, из матрицы v на каждом шаге фак- фактически используются две строки, причем можно обойтись и одной, если сменить направление в цикле по i. Во-вторых, можн,о написать более удобный в вычислительном отноше- отношении вариант уравнения D) max {v [i, k - 1], с [k] + v [i -1 [k], k]\ при i^l[k\ E) k] = v[i, k—l] при i Его решение реализуется способом, использующим вместо матрицы v вектор, в котором последовательно получаются все строки этой матрицы: for f: = 0 step 1 until /0 do begin y[i]:=0; dec[i]: = 0 end; for k: = 1 step 1 until n do begin ck:=c[k]; lk:=l[k]\ x[k]:=*0; for /: = Ik step 1 until /0 do if v[i-lk] + ck>v[i] then begin v[i]: = v[i — lk]-\-ck; dec[i]:—k end end k; d: = /0; for i: = dec[d] while i>0 do begin x[i]: =x[i]-\-1; d:=d — t[i] end 9 И. В. Романовский
258 ГЛ. й. РЕКУРРЕНТНЫЕ МЕТОДЫ Для случая, когда в памяти машины нетрудно разме- разместить одновременно массивы v [0: /0] и dec [0: /0], этот алго- алгоритм, по-видимому, является одним из наиболее эффек- эффективных. Но возможен его вариант (тоже достаточно экономный) и в форме переработки списка основных со- состояний. Переработкой списка удобно заниматься, пользуясь возможностями языка алгол-68 — структурами, связан- связанными в цепной список и возможностями генерирования новых экземпляров из кучи. Несколько пояснений: state —структура, включающая запись списка (решение й, длина /, стоимость с) и ссылку р на следующую запись; dom —операция, сравнивающая записи (a dom b вырабатывает булевское значение «а до- доминирует b»), lin, как обычно, вырабатывает значение «ссылка не есть nil». На каждом шаге алгоритма (в цикле по /) мы имеем три цепных списка: входящий список, полученный на предыду- предыдущем шаге, ссылка на его начало записана в in, выходящий список — его начальная ссылка в out, а конечная — в outf,— и рабочий список с началом в w и'концом в wf. Для того чтобы генерировать новые записи, используется оператор loc state. Освобождающиеся места от доминирующих запи- записей объединяются в четвертый цепной список, действующий как магазин. Начало этого списка запоминается ссылкой free, при необходимости создания новой записи берется запись, на которую ссылается free. Если же такой записи нет, то используется loc. При выработке результата окончательный список обра- обращается, после чего за один просмотр накапливается решение. proc Icutch = (int m, 10, ref [ ] real с, ref [ ] int /, res) void: begin mode state = struct (ref state p, int d, I, real c); int i, /1; ref state in, out, outf, w, wf, cur, free; prio dom== 1; op dom = (ref state a, b) bool: / of a sc / of b Д с of а Зг с of b; op lin — (ref state a) bool: a isnt nil; w: = loc state: = (nil, 0, 0, .0); free: ^w: = ml; t: = l; mkil: res[i]:=0; out: =outf: —wf: = nil; т.к. if lin in then cur: — in;
§ 2. ДЕТЕРМИНИРОВАННОЕ УПРАВЛЕНИЕ ЗАПАСАМИ 259 mkl: if lin да then if cur dom w then free rob да; go to mkl elif да dom cur then /ree rob m; go to mk elif / of w < / of cur then шг: = head да; go to т&да fi; in: = p of ш fi elif lin да then смг: = head да else go to mki fi; т&да: y'om (out, outf, cur); if (/1: =/[;"] + / of cur) > 10 then go to mk fi; if lin /ree then cur: = head /ree; go to m&/ fi; сиг: = loc state; mkf: join (да, да/, сиг); ref state (cur): = (nil, г, Л, c[i]-\-c of cur); go to mfe; mA/: in: = out; if (/ + : = 1) ^.m then go to mki\ fi; in: = listinuert (in); l\: = l of w; while lin in do if /1=/ of in then /1 — : = / [d of m]; res [d of m] + : = 1 fi; in: = p of m od end Мы использовали здесь операции head и rob и проце- процедуру join (и, следовательно, операции cons и join), опи- описанные в § 4 гл. 1, применительно к структурному виду state со ссылочным полем р. Разумеется, все их описания наравне с описанием lin должны быть включены в про- программу, причем для двуместных операций должен быть ука- указан их приоритет (как для dom). § 2. Детерминированная задача управления запасами Применим теперь тот же подход к новой задаче. Рассмотрим предприятие, которое для своего нормаль- нормального функционирования должно получать в моменты вре- времени t e: 1.: t\ некоторый продукт (сырье или топливо) в количествах г [/]. Эти количества известны и неотрица- неотрицательны. Известно также наличие продукта s [0] на складе в момент времени 0. Считается, что продукт можно запасать заранее и неограниченное, время в неограниченном размере хранить на складе, неся лишь некоторые убытки, завися- зависящие от объема хранимого продукта. Требуется для каждого 9*
260 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ момента f е ! : /1 определить объем закупок продукта у \i\ так, чтобы запас продукта s It] в каждый момент вре- времени t, равный по очевидным балансовым соображениям s[(]=s[t-i]+y[t]-r[q = = s[0]+Vxei:t(y[T]-r[T]), F) был неотрицателен и чтобы достигался минимум общих затрат. Эти затраты включают затраты на приобретение и хранение продукта, и их обычно представляют в виде s[t])), G) где ср и у — заданные неубывающие функции, описывающие зависимость затрат соответственно от объема закупок и от объема запаса. Таким образом, мы приходим к следующей задаче. Детерминированная задача управ- управления запасами. Найти неотрицательные векторы у [1 : t\] и s [I : t\\, удовлетворяющие условию F) и минимизирующие зна- значение целевой функции G). Если все у [т] и s [т] считать целыми числами, то и эту задачу можно свести к задаче о кратчайшем пути в графе. Состояниями в этом графе будут состояния склада, т. е. пары (t, а), где t — момент времени, а о — количество про- продукта на складе в этот момент. Для того чтобы не рассмат- рассматривать всех мыслимых состояний неограниченного склада,, можно считать, что a sg; R, = ?т>гИт]. При t = 0 доста- достаточно рассмотреть о = s [0], а при t = t\ — только а = 0. Дуга в каждом таком свстоянии будет соответствовать воз- возможному решению о закупке продукта, т. е. из состояния (t, о) можно перейти в любое состояние (/I 1, а'), где . а — г It 4- 1] <а' < RM. Длина такой дуги принимается равной Ф/+1 (a' -a + rlt+ П) 4- Y/+i Ю- Легко видеть, что каждому пути от @, s [0]) до (И, 0) в этом графе отвечает допустимая политика закупок, затраты при которой совпадают с длиной пути и, следовательно, задача о выборе кратчайшего пути эквивалентна задаче о выборе наилучшей политики закупок.
§ 2. ДЕТЕРМИНИРОВАННОЕ УПРАВЛЕНИЕ ЗАПАСАМИ 261 Вводя в задаче потенциалы, мы получаем для них, как раньше, функциональное уравнение v И, /1 = min (v, (/) + ф, (/г) + v И — 1, / — k + г [/]]), (8) где минимум берется по всем неотрицательным k, удовлет- удовлетворяющим условию k s? / + г [/]. Если принять v [О, s [0]] — .= 0, то потенциал v [i, /], вычисленный из уравнения, оказывается равным минимальным затратам, необходимым для того, чтобы при удовлетворении потребности в продук- продукции в моменты от 1 до i включительно после i-ro момента на складе оставался запас /. Так как и в этом графе нет контуров, потенциалы могут вычисляться последовательно, слоями для i = 1, 2 и т. д. Отметим, что при некоторых дополнительных предполо- предположениях детерминированная задача управления запасами может быть сильно упрощена. Например, пусть Тт (х) = g х х при всех т (9) и фт (х) = hx у 8(х>0)+сХ х. Это соответствует случаю, когда затраты на приобретение продукта состоят из платы за продукт, пропорциональной объему заготовки и не зависящей от момента времени, и из «организационных расходов». Сумма слагаемых, пропор- пропорциональных объему, не зависит от политики закупок, и ее можно не учитывать при сравнении политик, т. е. принять с = 0. В этом случае оказывается, что заготовку можно произ- производить каждый раз на несколько моментов времени пол- полностью, т. е. ни в какой момент не делать закупок, если продукция для этого момента была частично закуплена раньше. Исключение может составить лишь закупка, первая от начала процесса Теорема 1. При предположениях (9) оптимальная политика такова, что для всех моментов, кроме разве лишь первого, из у [i] > 0 следует s [i — 11 = 0. Доказательство. Покажем, что любую поли- политику закупок, не удовлетворяющую условию теоремы, можно улучшить. Пусть существует такое i, что у Ы > 0, 5 U — 1] > 0 и ix — последний момент времени перед /, когда делалась заготовка Уменьшим у UJ на s [i — 1] и увеличим на то же число у [i] При этом политика заку- закупок останется допустимой, затраты на закупки разве лишь
262 гл. 6 рр.КУРРЕНТНЫЕ МЕТОДЫ уменьшатся (если закупка в момент i± станет равной нулю), затраты на хранение уменьшатся на g * sli — 1] х х (i — ij). А Рассмотрим граф Г, с множеством вершин 0 : t\ + 1 и дугами, идущими из любой вершины i в любую вершину /, где / ^ max {i I 1, /1} и i > 0. Из вершины 0 дуги будут идти только в вершины / е 1 : /1, где /1 определяется ус- условием 2* е 1: пг [i] > s [0] 5г ?, s ,: „ _ , г [i]. Длиной с It, /] дуги (t, /) будем считать затраты на хране- хранение и покупку продукта, купленного в момент i и полностью обеспечивающего потребности в моменты i : / — 1 (затраты на покупку в момент 0 принимаются равными 0). Теорема 2. При предположениях (9) задача управ- управления запасами эквивалентна задаче о кратчайшем пути в описанном выше графе. Доказательство. Рассмотрим какую-либо поли- политику запасания, удовлетворяющую условию, описанному в теореме 1 Пусть /,, t2, .., ik — точки, в которых у [/] > > 0. Поставим в соответствие этой политике путь 0 -> !\ -, i2 -» ... -> lh -* t\. A0) Легко видеть, что t'2^/l, и по"этому такой путь принад- принадлежит графу Также очевидно, что длина этого пути равна затратам, связанным с исходной политикой запасания. С другой стороны, каждый путь вида A0) порождает политику запасания, в которой вершины пути являются моментами пополнения запасов- и затраты в которой равны длине пути. ^ Теперь мы можем перенести на задачу о запасах методы нахождения кратчайшего пути. Обозначим через v [t] минимальные затраты, необходи- необходимые для обеспечения продуктом до момента i — 1 включи- включительно. Тогда, так как эти v [i] являются потенциалами в задаче о кратчайшем пути, мы получаем v [/] = min {с П, /] 4- v U] | i < /}. A1) Вычислительный процесс может строиться здесь так же, как и в предыдущих случаях — последовательным вычисле- вычислением v [г] для i = 1, 2, ..: Отметим, что вычисления могут быть существенно сокращены благодаря отбрасыванию неко-
§ 3. ОБЩАЯ СХЕМА 263 торых дуг. Так, например, заведомо нецелесообразно заго- заготавливать в момент ( продукт для момента / > i, если g х г [/] х (/ - 0 > hh A2) В следующей главе мы рассмотрим другие, более слож- сложные варианты этой задачи, в которых спрос на продукцию случаен (с известной функцией распределения). Отметим еще, что уравнение A1) могло быть написано в другом варианте: вместо дерева кратчайших путей от вершины 0 мы могли строить дерево кратчайших путей к вершине t\ -|- 1. Тогда v [/] имело бы смысл минимальных затрат, необходимых для обеспечения продуктом с момента / включительно, и для v [/] мы получили бы уравнение v [i] = min {с [i, /] + v [/] | / > i]. A3) Такая форма уравнения Беллмана со счетом «с конца» процесса часто оказывается более удобной, особенно для случайных процессов. § 3. Общая схема динамического программирования. Детерминированный случай Мы рассмотрели две экстремальные задачи, которые оказались частными случаями задачи о нахождении наи- наилучшего пути для некоторых специальным образом по- построенных графов. В обеих этих задачах оказалось возмож- возможным придать четкий смысл вводимым потенциалам вершин графа, и в обеих задачах решение первоначальной задачи оказалось замененным решением целого семейства однотип- однотипных задач, в которое первоначальная задача входит в ка- качестве одного из элементов. Впрочем, то же самое верно и по отношению к задаче о кратчайшем пути. Более того, можно отметить еще и весьма тесную связь задач каждого семейства: например, зная кратчайшие пути до всех вершин, непосредственно предшествующих вершине i, мы можем найти кратчайший путь и до i (перебирая для этого всех ее предшественников и наращивая их кратчайшие пути, пе- переходами до г). Такие же действия мы проводили факти- фактически при любом последовательном нахождении потенциалов в других задачах. В этой главе мы опишем те общие свойства и особенно- особенности моделей, которые позволяют использовать технику
264 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ рекуррентного решения задачи. Мы будем говорить о про- процессе с множеством состояний М. Этот процесс будет пере- переходить из одних состояний в другие под воздействием управлений или решений (какого-то лица или каких-то лиц). Переход из состояния в состояние может быть детер- детерминированным — в таком случае он однозначно опреде- определяется управлением — или случайным — в этом случае мы будем считать, что управление и задает на М распреде- распределение вероятностей ри \М\ и при выборе этого управления и случайный механизм в соответствии с распределением ра \М\ выбирает новое состояние процесса. При этом ре- результат работы этого случайного механизма стохастически не связан с его действиями на предыдущих шагах и целиком определяется выбором управления Впрочем, в этой главе мы будем заниматься исключительно детерминированной схемой, а к стохастической обратимся в следующей. В предыдущем абзаце неявно сделано несколько важных предположений об изучаемом процессе. Подчеркнем эти предположения: Мы считаем, что в процессе выделены такие состояния, а каждому состоянию сопоставлены такие управления, что управление, выбранное в данном состоянии при любой преды- предыстории процесса, определяет (в детерминированном случае полностью, а в стохастическом случае с точностью до выбора некоторого случайного воздействия) следующее со- состояние процесса. Выбор таких состояний и управлений не всегда возмо- возможен, а когда возможен, то часто неоднозначен, и от успеш- успешности этого выбора существенно зависит эффективность применения методов динамического программирования в конкретных задачах. Итак, пусть каждому состоянию i е= M поставлено в соответствие множество управлений Л/,- и каждому управ- управлению и «= Ni соответствует / (и) е М — состояние, в ко- которое процесс попадает в результате использования и. Пусть процесс находится в состоянии /0. Выбор и0 «= iV,-0 переводит процесс в состояние it = / (и0), выбор щ <= Nit — в состояние и = / (нх) и т. д. Мы получаем последователь- последовательность пар ('о. "о), (h, «i), .... где для всех k uk «ее Ntk, ik+1 = / (uk). A4)
§ 3. ОБЩАЯ СХЕМА 265 Такая последовательность называется траекторией про- процесса. Траектория может быть конечной (и в этом случае она заканчивается не парой из состояния и управления, а отдельным состоянием, которое будет называться концом траектории) или бесконечной. В некоторых случаях нам придется предполагать, что бесконечные траектории у рас- рассматриваемого нами процесса невозможны, или добиваться этого искусственно. Задачи, которые мы будем решать в этой главе, выгля- выглядят примерно следующим образом. Типовая задача. Задана функция / на множестве траекторий Т. Тре- Требуется выбрать траекторию t e T, на которой дости- достигается минимум (или максимум) функции /. Функции f, о которых будет идти обычно речь, будут функциями из довольно узкого класса, который нам уже встречался в § 4 гл. 1. Мы можем рассматривать траекторию как список пар (/, и). Очевидно, что после отделения от траектории t начальной пары (t0, u0) остаток траектории tail (/) сам может рассматриваться как траектория с началом в состоя- состоянии f, = / («0). Потребуем от множества Т, чтобы из I e T следовало tail (t) e Т. Будем предполагать, что функция /, заданная на Т, удовлетворяет условию: если траектория t e T представлена в виде t = (head (t), tail (t)) = ((i, u), t'), A5) то f (t) = с (и) + p (и) x f {Г), A6) т. e. / (t) рекуррентна в смысле § 4 гл. 1. Будет предпола- предполагаться, что Р ^ 0. Множество траекторий будет определяться способом выбора управлений в состояниях процесса. Наиболее общий способ задания правила для выбора управления состоит в том, что задается решающая функция. Рассмотрим функцию d, определенную для всех конеч- конечных траекторий. Обозначим конец траектории t через tip(t). Функция d называется решающей функцией (или решающим правилом), если для всех 1еТ d (t) 6= Ntlm. A7)
266 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ Будем говорить, что траектория / определяется реша- решающим правилом d, если для любого k справедливо соотно- соотношение uk = d (tk), где 4 = (('о. «о), (h, «i), •••, (h-i, «fc.i). h — конечная траектория, совпадающая с началом траекто- траектории t. Множество траекторий, определяемых произвольными решающими правилами, обозначим через Т°. Назовем решающее правило стационарным, если d (t) = d (lip @), A8) т. е. если управление зависит только от конца пройденной части траектории. Стационарные решающие правила будут называться также политиками. Множество траекторий, определяемых политиками, обозначим через Тр. В некоторых случаях мы будем ограничивать число ша- шагов в траектории, в других — траектории будут конечными по смыслу задачи без особых предположений. В рассматривавшихся нами задачах всюду р = 1 и траектории конечны. Условие конечности траекторий про- процесса может быть легко интерпретировано в терминах тео- теории графов. Действительно, описанному нами процессу можно сопоставить граф Г с множеством вершин М и множеством дуг N = (J Nh причем дуга и, принадлежащая множеству Ni, имеет в качестве начала вершину i и в ка- качестве конца вершину / (и). Траектории процесса, оче- очевидно, сопоставляется путь в этом графе. Таким образом, в случае конечного графа для того чтобы процесс динами- динамического программирования не имел бесконечных траекторий, необходимо и достаточно, чтобы соответствующий ему граф не имел контуров. Пусть мы решаем задачу максимизации функции / на траекториях множества Т, начинающихся из /. Обозначим множество таких траекторий через Т (i), а множество тра- траекторий, начинающихся с пары (/, м), через Т (i, и). Положим v Ш = max {/ @ | I €= T (i)}. A9)
§ 3. ОБЩАЯ СХЕМА 267 Так как Т (i, и), и е #,- образуют разбиение множества Т @, то v li) = max { max {f (t) \t e T (i, и)} \ и s= N,}. B0) Но для траекторий из Т (i, и) справедливо A6), и поскольку первое слагаемое для всех траекторий одинаково, его можно вынести за знак максимума. Точно так же можно вынести и неотрицательный множитель р" (и). Оставшийся максимум будет максимумом по некоторому подмножеству траекторий из Т (/ (и)). Если оно совпадает с Т (/ («)), то этот максимум в соответствии с A9) будет равен v [/ (и)]. Таким образом, мы имеем окончательно: если множество Т таково, что для любого i Т @ = U T d, и), Т (i, и) = {(i, и), t'\t'^T(j (и))}, B1) то v li] = max { с [и] + р[«]хо [/ (и)] | и е= #,}, B2) v [f] = f \i] при Nt = ф. Уравнение B2) называется уравнением Беллмана или урав- уравнением динамического программирования. Разрешимостью этого уравнения в общем случае мы займемся в следующей главе, а здесь ограничимся рассмотрением нескольких важных частных случаев. Предложение 1. Множество Т° удовлетворяет условию B1). Доказательство следует из того, что любой путь в графе можно разбить на начальную дугу и остаток пути, и, нао- наоборот, присоединение к концу дуги некоторого пути обра- образует путь, идущий из начала дуги. Определенные нами решающие правила таковы, что любой путь в графе переходов процесса может соответство- соответствовать некоторому решающему правилу. Отметим, что множество Тр условию B1) не удовле- удовлетворяет. В дальнейшем мы всюду будем рассматривать задачи максимизации f на Т°, но, как правило, оптимальное решаю- решающее правило будет политикой.
268 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ § 4. Достаточные условия разрешимости уравнения Беллмана Здесь мы рассмотрим два вида достаточных условий. В первом будет использована конечность траекторий, обес- обеспечиваемая отсутствием контуров в графе переходов, во втором существенно используется возможность наклады- накладывать условия на множитель р в представлении A6). Теорема 3. Если в графе переходов Г, соответству- соответствующем рассматриваемому процессу динамического програм- программирования, нет контуров, то уравнение B2) имеет един- единственное решение и набор управлений, на которых дости- достигается максимум в B2), порождает для любого начального состояния траекторию, на которой достигается макси- максимум функции /. Доказательство. Разрешимость и единствен- единственность решения уравнения B2) очевидны. Для Мо = = {/ | N; = (!':} значения v [i] известны. Поэтому можно вычислить v [i] для тех i, из которых процесс на следую- следующем шаге обязательно попадает в Мо. Обозначим объеди- объединение Мо из этого нового множества через Mv Теперь можно вычислить v \i] для состояний, из которых процесс попадает на следующем шаге в Мх. Так как граф не имеет контуров и конечен, то за конечное число таких итераций будут ис- исчерпаны все его вершины. Сопоставим теперь каждому i <ф Ми управление Ht <= jV;, на котором достигается максимум в B2). Тогда v Ш = с (а,) + р (п,) х v [/ (й,)] B3) v Ш > с (и) + р (и) х v [/ (и)] для и <= Nt. B4J Рассмотрим какую-либо траекторию t, ведущую из вер- вершины i (i, u0), (iu uL), ... Складывая вдоль по траектории неравенства B4), взятые с такими множителями, чтобы взаимно уничтожились сла- слагаемые с v [tft], мы получим v И) > с («0) + Р (и0) х (с («х) + + Р(и,) х (с (и2) + ...)) = «*). Вместе с тем на траектории /, порожденной управлениями
§ 4. РАЗРЕШИМОСТЬ УРАВНЕНИЯ БЕЛЛМАНА 269 п, ввиду равенств B3) мы будем иметь V [»] = f (I), что и доказывает теорему, а Теорема 4. Если существует такое Р > 1, что для всех aeiV справедливо р {и) ^ р, то уравнение B2) имеет единственное решение и набор управлений, на кото- которых достигается максимум в B2), порождает для любого начального состояния траекторию, на которой достига- достигается максимум функции /. Доказательство. Нам часто потребуется по вектору х [АЛ строить вектор хх [АЛ, где х1 [i] = max { с (и) + р (и) х х [/ (и)\ | и е Af,} B5) (применять к х преобразование Беллмана). Мы будем в та- таком случае писать x1 = Bel(x). B6) Рассмотрим теперь два произвольных вектора v [АЛ и до Ш] и построим по ним векторы vx = Bel (v) и w1 = = Bel (до). Для разности этих векторов мы имеем V1[i]-W1[i] = = max {с (и) + р (и) х v [/ (и)] j ы е Mt\ — — max {с (и) + р (и) х w [j {и)] | ы е Л/г} < sg max {с («) + р («) х у [/ (ы)] — - (с (ы) + р (и) хш [/(«)]);« еЛ/,| = = max {р (ы) х (v[j (и)] - w [/ (и)]) | и е Л^,}, так как разность максимумов не превосходит максимума разности. Отсюда 11»! U3 — Дох U'l | < < max { р (и) х | и [/ (и)] — w [/ (а)] 11 и е Л^,} < <р х тахиел. I у [/ (и)] ~ w [} (и)] \ < <Р х тах/еЛ|| v [/] — до [/] |, и, следовательно, Л! | v1 [i] — w1 [i] | «^ fJ х тах,еМI о [j] — до Ш |. B7) Из этого неравенства вытекает невозможность двух раз- различных решений уравнения A8): векторы, вычисленные по этим решениям в соответствии с B1), должны с ними совпа- совпадать, а максимум разности компонент этих векторов а
270 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ должен по B2) удовлетворять неравенству 0 < в < Р X а, что невозможно. Рассмотрим теперь последовательность векторов vk [М\, где v0 \M] — произвольный вектор, а ик - Bel (vk 0, к < 1. B8) Если t'o \M] выбрать так, чтобы выполнялось неравенство I v0 Ш | < с/(\ - Р), B9) где с = max { | с (u) | | и е N}, to этому же неравенству будет удовлетворять любой из векторов vk [M]. Действи- Действительно, предполагая, что B9) выполнено для ufc_1( мы полу- получаем из B8) и B5) I vk Ш К max { | с (и) + р (и) х ^^ [/ (и)] | | и е= Л^,-} < — Р) = с/(\ - р). Следовательно, при выполнении неравенства B9) последо- последовательность {vk \М]} ограничена. Взяв v Ш] = vk \M\, w \М\ — yft+] [M], мы заключаем из B2), что она сходится в себе и, следовательно, имеет предел. Этот предел, очевидно, удовлетворяет уравнению B2). Отметим, что из сходимости такой последовательности следует и сходимость последовательности с любым началь- начальным вектором v0 [M]. Вторая часть доказательства очень похожа на рассужде- рассуждения в теореме 3. Обозначим через п,- управление, на кото- котором достигается максимум в уравнении B0). Для й имеет место равенство B3), и, кроме того, справедливы неравен ства B4). Для любой траектории t (Io) = (i0, «о), (l1( Uj), ... значение / (t (г0)) в силу сделанного в теореме предполо жения является суммой абсолютно сходящегося ряда ic(uk) х n/e0:*-iP(wz). C0 Из B4) имеем с (и) ^ v [i] - р («) х v [/ (и)] для и е Nt
§ 4. РАЗРЕШИМОСТЬ УРАВНЕНИЯ БЕЛЛМАНА 271 и, следовательно, f (t (/о)) < ST- о (v [ik] - р (ик) X v [ikJA]) X X ILeO:ft-lP («f) = .S*5*oa[tfc]xIL<HO:*-1 Р («/) ~ — 2ft > 0 f [/ft nl X I L e 0 : k P ("/) = U [*o], причем для {йг} здесь выполняется равенство. А Введенные в этом доказательстве последовательные при- приближения для потенциалов v [M] могут быть использованы и для численного решения уравнения B2), причем и в ус- условиях теоремы 3. Эффективность алгоритма последова- последовательных приближений существенно зависит от удачного выбора начального приближения. Отметим, что если v0 [M] удовлетворяет неравенству уо>ВеЬо C1) или неравенству v0 < Bel v0, C2) то последовательность vh [M] удовлетворяет соответственно неравенству vk [АЛ > vk+1 [АЛ C3) или vk Ш] < vkn [Mi C4) Оба неравенства доказываются просто и совершенно оди- одинаково по индукции. Действительно, например, для C3) имеем vk [/] = max { с (и) -|- р (и) х vk_v [/ (ы)] | ы <= TV,} > > max {с (и) + р (м) х vk_2 [/ (и)] \ и е Л^,} = vk_t [/]. Имея вектор и0 [М], удовлетворяющий C1) или C2), можно, таким образом, построить монотонную последовательность К шц. Особенно удачный метод имеется для нахождения функ- функции, удовлетворяющей C2). Зафиксируем какую-либо поли- политику иО [М] и решим систему уравнений w [/] = с («О [/])+ Р («О Ш) х w [/ (иО [/])]. C5) Выполнение C2) для так определенного w [M] очевидно. Более сложным вариантом этого подхода является посте- постепенное расширение множеств Л';: если в каждом непустом Nt выделить непустое подмножество N't и затем решить
272 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ уравнение w \i] = max {с (и) + $ (и) х w [/ (и)] \ и <= Щ}, C6) то его решение будет также удовлетворять C2). Настолько же универсальный метод построения реше- решения неравенства C1) неизвестен. В конкретных задачах успех достигается расширением множеств Л/,- (за счет про- произвольных дополнительных управлений) и увеличением с (и) па имеющихся управлениях. § 5. Асимптотическое поведение последовательных приближений Естественно, что должно существовать много процес- процессов, в которых последовательность vk \M] не сходится, Оставляя в стороне полную классификацию возможны; случаев, рассмотрим один полезный класс таких процессов Ограничимся сейчас для простоты случаем, когда во Ni т4 ф. Если бы нам потребовалось найти траекторию / начинающуюся из вершины i, состоящую из k переходов i максимизирующую f (t) + v0 [ik], то, как легко убедиться искомый максимум как раз и равнялся бы vk U]. Легко представить себе процесс, который на каждо!) шаге приносит доход, в точности или приблизительно рав ный некоторому к > 0. Для такого процесса vk \i] должн< расти пропорционально k. Более точно эта ситуация описывается следующей тео ремой. Теорема 5. Пусть E (и) = 1 и граф переходов про- процесса вполне связен. Пусть К — максимум отношений суммы доходов с (и) на контуре к числу дуг контура, найденный на контурах графа переходов. Тогда: а) найдутся такие константы а{ и а.г, что для всех i е М и всех k = 1, 2, ... выполняется неравенство ах <»ilil-Axl< aa; C7) б) найдется такая константа г, что при любом k оптимальная траектория будет состоять из обходов кон- контуров с максимальным отношением и еще не более г пере- переходов;
§ S АСИМПТОТИКА РЕКУРРЕНТНЫХ СООТНОШЕНИЙ 273 в) система v Ш = max {с (и) — К + v [/ (и)] \ и е= N,}, i e M C8) имеет решение. Доказательство. Мы опробуем в этом доказа- доказательстве технику использования неравенств C1) и C2) и начнем его с п. в). Как мы знаем из § 9 гл. 3, в задаче об оптимальном контуре всегда есть оптимальное решение, а следовательно, и оптимальное решение (X, z \M]) двой- двойственной задачи Это решение удовлетворяет неравенствам г U] + К > с (и) + z [/ (и)] для и <= N,, i e= M, C9) что эквивалентно C1). Вместе с тем, если зафиксировать какой-либо базис, состоящий из оптимального контура и выходящих на него путей, мы получим некоторую политику п [М], для которой разрешимо уравнение C5) для двойственных переменных w [/]+¦ Я = с (п Ш) + w [/ (п li])\ (действительно, на оптимальном контуре эта система раз- разрешима, а все остальные переменные вычисляются по най- найденным ранее). Эта система разрешима с точностью до по- постоянного слагаемого. Выберем такое решение, чтобы w [М] ^ z [М], и построим по w0 = w последовательность {wk Ш\) wk \i] — max {с (и) — Х-\- wk^ 1/ (и)] \ и е /V,-}. D0) Из монотонности этой последовательности и из wk [M\ =^ ^ z [M] мы получаем ее ограниченность wk+1 [i] = max { с (и) — к + wk [/ (и)] | и е Л^;} «S < max {с (и) — l + z [/ («)] | и ё I?,} = z tt]. Последовательность сходится к некоторой функции w [M\, являющейся решением уравнения C8). Вместе с w \M] решением этого уравнения будет любой вектор w \M\ + + а х 1 [М]. Выберем а, и а2 так, чтобы w Ш] + а, х 1 [Ml < v0 [M] =ss w [M] + a2 x 1 [M\. Докажем теперь, что для любого k > 0 справедливо неравенство w Ш] х а, х 1 Ш\ ss vk Ш\ — k х I х 1 Ш] < а2 X 1 Ш]
274 ГЛ. б. РЕКУРРЕНТНЫЕ МЕТОДЫ Пусть оно верно для какого-либо к ^г 0. Соотношение vk+1 [/] = max {с (и) + vk [/ («)] | и е iV,} можно переписать в виде vk+l [»] - (к + 1) X Я = = max {с («) — Я 4- (р* [/ («)] — & х Я) | и е Л/*}. Воспользовавшись индукционным предположением, убеж- убеждаемся, что неравенство имеет место и для к -\- 1. Из этого неравенства уже легко получить (подправляя а, и а2) требуемое неравенство C7). Для доказательства п. б) рассмотрим оптимальную к -шаговую траекторию. Эта траектория, представляющая собой путь в графе переходов, может быть разбита (неод- (неоднозначно, это для нас несущественно) на путь без самопе- самопересечений и на некоторое число простых контуров. Путь состоит из гг (не более чем из | М | — 1) переходов, и полу- получаемый на нем доход не превосходит с -j- гъ где с = max с (и). Среди простых контуров возможно некоторое число неоп- неоптимальных. Если обозначить через Я' вторую по величине после максимальной характеристику простого контура, то доход, получаемый на этих контурах, можно оценить сверху величиной Я' х г2, где г2 число переходов, попавших в неоп- неоптимальные контуры. Доход на оптимальных контурах бу- будет равен {к —-гх — г2) X Я. Итак, vk [i] ==S (k — rt — r2) X Я + с X rx -i- + Я' x г.г -f max {v0 [/] | / e M); Используя левую часть C7), получаем flj — max {v0 [/] | / e M) =sc (c — Я) x ry — (Я — %') x r2. Отсюда r2 < (max {v0 [j] | / e Af} — gj + + (c-X) X (\M |- и в качестве г можно принять эту оценку для г2, увеличен- увеличенную на | М | — 1. а Пункт б) доказанной теоремы известен под названием «теорема о магистрали» (в слабой форме). Его можно истол- истолковывать следующим образом: самый выгодный путь почти целиком состоит из движения по «магистрали» — грубо
§ 5. АСИМПТОТИКА РЕКУРРЕНТНЫХ СООТНОШЕНИЙ 275 говоря, скоростному пути, на который траектория должна выйти и с которого она должна сойти в конце. Вообще говоря, по различным причинам у траектории могут быть отклонения от такой структуры, но при допол- дополнительных предположениях о процессе удается установить, что она имеет в точности такой вид. Условия, наложенные в следующей ниже теореме, воз- возможно выглядят несколько искусственно, но это впечатле- впечатление обманчиво — они существенно связаны с природой задачи. Теорема 6. Если частичный подграф (М', N') гра- графа переходов, включающий только дуги, входящие в опти- оптимальные контуры, вполне связен и ОНД длин оптимальных контуров равен 1, то для достаточно больших k и любого i0 <= М' vk Ш = г И] -Ь k х I + w, i s= M, D1) где z[i] — максимальный доход, получаемый на пути от i до i0 (считаем с' (и) = с (и) — X доходом на дуге и), w = max {w, [i0] | I > 1}, D2) а последовательность {да,} определена соотношением D0). Доказательство. Прежде всего отметим, что z \i\ и w существуют. Значения z [i] получаются, например, методом потенциалов при нахождении наилучших путей, и метод применим, так как по выбору к контуров с положи- положительным доходом с' в графе нет. Максимум в D2) достига- достигается. Действительно, так как доход, получаемый на конту- контурах, не положителен, то можно ограничиться траекто- траекториями, не имеющими самопересечений, а число таких тра- траекторий конечно. Далее вместо D1) мы можем доказывать эквивалентное равенство wk [i] = z U3 + ш. Покажем сначала, что wk [i] eg г [г] + w. Рассмотрим тра- траекторию, на которой достигается доход wk \i]. По теореме 5 при достаточно большом k в этой траектории найдется вер- вершина t'x е М'. Если в траектории не участвует i0, то можно добавить путь от J, до i0 и от i0 до tj (такие пути существуют вследствие того, что граф (М1, N') вполне связен). Сум- Суммарный доход, получаемый на этом добавленном пути, ко- который составлен из оптимальных контуров, равен нулю и,
276 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ следовательно, доход на получившейся траектории такж равен wk [i]. Разобьем теперь эту траекторию на части до i и от ?0 до конца. Доход на первой части не превосходи г [Л, а на второй не превосходит w. Построим теперь траекторию, доход на которой равен wk [i]. Началом этого пути будет траектория, на которой достигается z [i], концом — траектория, на которой дости- достигается w. Середина будет представлять собой замкнутый путь от i0 до !0, составленный из оптимальных контуров, Как отмечалось в § 3 гл. 3, во вполне связном графе с об- общим наибольшим делителем длин контуров, равным 1, можно выбрать замкнутый путь любой достаточно большой длины с началом и концом в данной точке. Так как доход, получаемый в начале пути, ргвен г ii], на конце к1, а середина пути представима в виде суммы опти- оптимальных контуров и поэтому доход на ней равен 0, общий доход на траектории действительно равен wk [i]. A Более сложные случаи существования и несуществования решений уравнений Беллмана и асимптотического поведе-! ния функций vk мы отложим до следующей главы, где изу] чаются произвольные уравнения с 0 ;<с р (и) =с 1. Ниж^ будут рассмотрены варианты уравнений Беллмана для неко- некоторых задач, не входящие в это общее рассмотрение. Но прежде приведем еще несколько примеров, в которых возни- возникают уравнения в точности рассмотренного типа. § 6. Задача замены оборудования Предположим, что требуется обеспечить присутствие на некотором производстве работоспособного станка в мо- моменты времени 1 : t. Станок может выдержать не более s моментов. От его возраста (который измеряется целым чис- числом из 0 : s) зависят эксплуатационные затраты. Пусть за- заданы с Ik] — затраты на эксплуатацию в течение единицы времени станка возраста k. Задана также стоимость нового станка сО. Для сопоставления затрат, производимых в раз- различные моменты времени, обычно используется приведение затрат — затраты в момент т считаются меньше затрат в момент 0 и для сопоставления умножаются на некоторый множитель, называемый коэффициентом приведения. Обычно коэффициент приведения из экономических соображений принимается равным Рт, где Р — заданное число, 0 < р <; 1
§ 6. ЗАДАЧА ЗАМЕНЫ ОБОРУДОВАНИЯ 277 Состояние этого процесса естественно описать возра- возрастом станка (г s I : s и временем, оставшимся до конца процесса т е 0 : 1 При т = 0 предстоящие затраты равны 0. Управление во всех состояниях (/г, т), где k < s, одно и то же: купить новый станок или оставить старый (переход в A, т — 1) с затратами сО + с 10] или в {к -f 1, т — 1) с затратами с [k]), в состоянии (s, т) возможна только по- покупка нового станка (переход в A, т — 1) с затратами сО + с [0]). Для этого процесса мы, естественно, получаем функцио- функциональное уравнение v [k, т] = min {сО + с 101 -Ь р х v 11, т — 1], с \k] -г Р х v \k + 1, т — 1]} при k < s, и U, т| = сО + с [0] + Р х v [1, т — 1], D3) v Ik, 0] = 0. Это уравнение может рассматриваться как рекуррентное соотношение для последовательных приближений, сходя- сходящихся (по теореме 4) к решению функционального урав- уравнения v [к] - min {сО + с [0] + р х v [1], сШ + РхНН 1]}, D4) v Is] = сО + с 10] + р х v Ш. Здесь, очевидно, и [k] имеет смысл минимума приведен- приведенных затрат на бесконечно про- продолжающийся процесс, начинаю- начинающийся с состояния к. Структура оптимальной поли- политики для D4) легко устанавли- вается по графу переходов данного процесса (рис. 65). Состояние 1 в любом случае участвует в процес- процессе, исходящая из него траекто- траектория в каком-то состоянии k0 обя- обязательно возвращается в 1 И замы- Рис. 65. Граф переходов кает контур, только этот контур и представляет для нас интерес. Для этого контура мы получаем при i <.k0 и L*oJ = x »*•[!],
278 ГЛ. G. РЕКУРРЕНТНЫЕ МЕТОДЫ откуда »*'[l] = 2iSl:*.-lC[i]Xp' и окончательно Оптимальная политика здесь определяется выбором k0, при котором vk° [1] достигает минимума. Эта оптимальная политика и найденное по ней решение уравнения D4) могут служить хорошим приближением для /-шаговой оптимальной политики и решений уравне- уравнения D3). § 7. Задачи оптимального резервирования и надежности Многочисленные экстремальные задачи, приводящие к схеме динамического программирования, возникают так- также в связи с вопросом обеспечения максимальной надеж- надежности сложных устройств. В этом параграфе мы рассмот- рассмотрим несколько таких задач. Несколько схем обеспечения надежности можно объе- объединить следующей формулировкой. Рассматривается устройство, состоящее из множеств элементов N. Вероятность выхода из строя элемента /е равна р [/]. Устройство выходит из строя, есл выходит из строя какой-либо из его элементов. Таки\ образом, вероятность выхода из строя устройства равнг (в предположении независимости поломок элементов) 1 _ umN A-р [/]). Предположим, что р [/] зависит от некоторого параметра Ф [/] и можно выбирать набор параметров # [N] из неко- некоторого множества в. Естественно возникает задача: Минимизировать р @) = 1 - Ul&/ (l-p [/, * (/]]) .D5) по * = О Ш] е= в. Один из простейших параметров, управляющих на- надежностью, — число резервных элементов. Для каждого элемента в схему вводятся дополнительные его экземп-
7. РЕЗЕРВИРОВАНИЕ И НАДЕЖНОСТЬ 279 ляры, и элемент считается не вышедшим из строя, пока действует хотя бы один экземпляр данного элемента. При k дополнительных экземплярах /-го элемента принимается р (/, ft) = p l/]*+1 и p(*) = l-H/eW(l-/J[/ll"i"*')- D6) Такая форма зависимости возникает в схеме горячего ре- зервирования (все элементы находятся под нагрузкой). Минимизация р (§) эквивалентна максимизации вероят- вероятности исправной работы «7(в) = П/е*A-р[/]1+*>)- D7) Рассмотрим метод решения этой задачи с помощью рекуррентных соотношений Беллмана, задавая область 0 линейным неравенством ?/елги>/ХЛ/<® [48) (это может быть, например, ограничение по весу или по стоимости дополнительных экземпляров элементов). Пусть Л/ = 1 : п. В духе предыдущего рассмотрим задачу оптимального резервирования для схемы с N = 1 : v и w ~— со. Обоз- Обозначим через vv (to) максимум функции D7) при условиях D8). Тогда, очевидно, v0 (со) == 1, vv (to) = max {A — р (v]1+* ) х X uv_i (ы — k X O)v) | 0 < k sc; ca/ffi)v}. D9) По рекуррентным соотношениям D9), так же как и в пре- предыдущих параграфах, можно найти значения vv (со) и оптимальную политику для всех значений параметра. Однако и здесь можно воспользоваться идеями перера- переработки списка основных состояний. За счет этого удается избежать сложностей, связанных с непрерывной шкалой изменения параметра со, и построить метод даже для зна- значительно более сложного случая нескольких ограничений вида D8), практически не поддающийся исследованию с помощью обычных рекуррентных соотношений. Пусть, кроме D8), мы имеем еще ограничение ^C. E0)
280 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ В этом случае вместо уравнений D9) мы имеем у„ (со, у)= 1, y — kxcv)}. Рассмотрим на примере, как выглядит применительно к этой задаче метод переработки списка состояний. Пусть п — 3, р [1 : 3] = @.1 0.2, 0.3), w\l : 31 = C, 5, 4), с\\ : 31 = A, 1, 1), кЮ = 14, сО -= 4. Возможные состояния после выбора ?, таковы (первое число ky, второе Vy ((о, у), третье со, четвертое у): 0 @,0.9 , 0,0), 1 A,0.99 ,'3,1), 2 B,0.999 , 6,2), 3 C,0.9999 , 9,3), 4 D,0.99999,12,4). После выбора k2 получаем 11 состояний, из которых 4 оказываютй хуже других. Чтобы провести сравнение, они помечены буквами: а @,0.72 , 0,0), Ь A,0.864 , 5,1), с B,0.8928 ,10,2), d @,0.792 , 3,1), е A,0.9504 , 8,2), / B,0.98208 ,13,3), g @,0.7992 , 6,2), h A,0.95904 ,11,3), i @,0.79992 , 9,3), /' A,0.959904,14,4), k @,0.799992,12,4), Состояние b доминирует g и i, f доминирует /, с доминирует k. Из оставшихся 7 состояний выбором k3 получаем 16 состояний, и: которых 8 оказываются хуже других: а @,0.504 , 0,0), б A,0.6552 , 4,1), в B,0.70056 , 8,1), г C,0.714168,12,3), д @,0.6048 , 5,1), е A,0.78624 , 9,2), ж B,0.840672,13,3), з @,0.62496 ,10,2), и A,0.812448,14,3), й @,0.5544 , 3,1), к A,0.72072 , 7,2), л B,0.770616,11,3), м @,0.66528 , 8,2), н A,0.864864,12,4), 1 о @,0.687456,13,3), п @,0.671328,11,3). Вариант «н» оказывается наилучшим. Он соответствует вектор) резервных элементов A, 1, 1).
§ 7. РЕЗЕРВИРОВАНИЕ И НАДЕЖНОСТЬ 281 Отметим еще, что рассматриваемые 'нами состояния образуют дерево вариантов (рис. 66) — такое же, как в методе ветвей и границ, — и отличие метода переработки списка состояний заключается в том, что отбрасывание вариантов производится по результатам их попарного сравнения. Рис. 66 Дереио вариантов в задаче резервирования Другим часто встречающимся вариантом схемы резер- резервирования является схема холодного резервирования, в ко- которой резервные элементы включаются последовательно, по мере выхода из строя работающих элементов. Если требуемое время функционирования устройства равно t, а функция распределения времени безотказной работы /-го элемента F, (х), то р I/] = F, (О, Р (/, к) = F^ (О, где Fr — r-кратная свертка функции распределения F (х). Для решения задач оптимального холодного резервиро- резервирования, а также и оптимального смешанного резервиро- резервирования (для одних деталей — холодного, а для других — горячего) может использоваться тот же метод переработки списка состояний. Отличие будет лишь в способах пере- перехода от состояния к состоянию. В схеме холодного резервирования уже в большей степени проявляется процесс функционирования системы — в ней участвует время. Большое число задач надежности
282 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ связано со временем еще теснее — в них требуется опре- определить оптимальный реж-им контроля и профилактики системы. Несколько таких задач будет рассмотрено в сле- следующей главе. § 8. Поиск неисправности Здесь будет рассмотрена модель несколько иного типа. Именно, в ней значение потенциала будет находиться не по одному, а по нескольким предшествующим состояниям. Эта модель принадлежит к распространившемуся в последнее время классу моделей поиска неисправностей в сложных системах. Предположим, что требуется найти неисправность в агрегате, состоящем из множества эле- элементов М (М можно считать и множеством различных неисправностей). Будем считать, что в агрегате неиспра- неисправен ровно один элемент, причем вероятность того, что это элемент /, известна и равна р [i] (p [M] — вероятност- вероятностный вектор). Для обнаружения неисправности используются диаг-i ностические тесты. Множество тестов мы обозначим че^ рез N. Применение теста / приводит к появлению одного! из двух ответов (например, 0 или 1) в зависимости от того, какая неисправность имеется в агрегате. Обозначим через М) множество неисправностей, приводящих к ответу О для теста /, и через М) множество неисправностей, да- дающих ответ 1. Задание М] и М) для всех / <= N эквива- эквивалентно заданию матрицы а [М, N], составленной из ну- нулей и единиц. Естественно, что для разрешимости диаг- диагностической задачи необходимо, чтобы произведение раз- разбиений (M'j, M'j), /, e N, состояло из одноэлементных множеств. Легко видеть, что это условие эквивалентно тому, чтобы были различны все строки матрицы а Ш, N]. Каждому тесту / ставится в соответствие число с [/] — затраты на использование теста. Требуется выбрать диаг- диагностическую процедуру, при которой математическое ожи- ожидание затрат было бы минимальным. Нужно подчеркнуть, что сами затраты в реальном диагностическом процессе случайны и поэтому для сравнения диагностических про- процедур нужно выбирать какие-то характеристики, описы- описывающие процедуру в целом. В данном случае математическое ожидание затрат представляется достаточно удобной величиной.
§ 8. ПОИСК НЕИСПРАВНОСТИ 283 Диагностическая процедура представляет собой де- дерево, вершинами которого являются подмножества мно- множества М. Само М входит в дерево в качестве начальной вершины, а концевыми вершинами дерева являются одно- одноэлементные множества. Каждой неконцевой вершине соот- соответствует некоторый тест, которым множество, представ- представленное этой вершиной, разбивается на два подмножества, представленные двумя другими вершинами графа. Пример. Пусть М = 1 : 6, N = 1 : 9, с [N] -- C, 2, 4, 5, 6, 4, 4, 3, 3), р [М] = @.3, 0.2, 0.1, 0.2, 0.1, 0.1), Тесты задаются табл. 3. Таблица 3 12 3 4 5 6 7 8 9 Легко построить какую-нибудь диагностическую про- процедуру. Например, применение те- теста 1 делит 'М на Му = {1, 4, 5, 6} и Мг = {2, 3}. Далее Мх делится тестом 2 на «концевое» множество Мп — {1} и множество М1г = {4, 5, 6}. Множество М12 делится те- тестом 3 на М121 = {4} и М1гг — {5, 6}. Наконец, тестом 5 множество М122 делится на одноэлементные. Этим же тестом делится и множест- множество М2. Итак, получено диагности- диагностическое дерево, изображенное на рис. 67. Около каждой неконцевой вер- D A7 n ^ Рис. 67. Возможное де- шины записана вероятность ее появления и, следовательно, при- 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 ! 1 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 0 ] 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 03 рево проверок. менения соответствующего теста. Таким образом, ожида- ожидаемые затраты составят 3 -г 0.7 х 2 + 0.4 х 4 -г 0.2 х 6 + 0.3 х 6 = 9.
284 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ Для нахождения оптимального диагностического пра- правила обозначим через v (R) минимум ожидаемых затрат при условии, что неисправен элемент из множества В Тогда }, E1 В вычислительном отношении удобнее рассматривать функцию g (R) — рм (R) х v (/?), для которой рекур- рекуррентное соотношение E1) выглядит более просто v (R) = min {c[j] + pR (R П МЪ xv (R f] M)) + + pR(R(]M))xv(R(]M)) v(R)=0 при \R = 1, где g (R) = min {с []]хрм (R) +g (Д Л 1 п +g(R(] М)) Ч<=Щ. E2) Результаты вычислений по этой рекуррентной формуле для нашего примера представлены в табл. 4, а оптимальная диагно- диагностическая процедура изображена на рис. 68. Программная реализация этого алгоритма возможна только nps достаточно малых т = \ М \ (по рядка 10—15). В этих условия* возможно удобное представление состояний — в виде характеристи- характеристических векторов соответствующие подмножеств. Эти характеристичес- кие векторы в свою очередь могут рассматриваться как двоичные представления целых чисел и: 0 : 2т — 1. Поэтому в качестве состояний процесса можно взят! это множество целых чисел. Те стовые множества М) также мож но представить целыми числами и: этого же диапазона. Обозначим /-е число через test [/]. Нахождение по множеству R множеств R [) Щ у R П М) при таком представлении множеств достаточнс просто, хотя и выходит за рамки «чистого» алгола-60; 9--3 < 2 7 4 Рис. 68. Оптимальное де- дерево проверок (подлинная выдача из вычислительной машины).
§ 8. ПОИСК НЕИСПРАВНОСТИ 285 R 1 2 21 3 31 32 321 4 41 42 421 43 431 432 4321 5 51 52 521 53 531 532 5321 54 541 542 5421 543 5431 5432 54 321 6 рм <«) .3 .2 .5 .1 .4 .3 .6 .2 .5 .4 .7 .3 .6 .5 .8 .1 .4 .3 .6 .2 .5 .4 .7 .3 .6 .5 .8 .4 .7 .6 .9 .1 н и . 1 — 2 2 8 2 2 8 9 2 2 2 . 2 2 1 I 2 2 1 1 2 2 1 1 2 1 1 — 3 га о. то П .0 .0 1.5 .0 .8 .6 2.4 .0 1.0 .8 2.9 .9 2.1 1.9 4.0 .0 .8 .6 2.4 .6 1.6 1.4 3.5 .9 2.1 1.9 4.0 2.1 3.5 3.3 5.4 .0 R i 61 62 621 63 631 632 6321 64 641 642 6421 643 6431 6432 64 321 Р5 651 652 6521 653 6531 6532 65 321 654 6541 6542 65 421 6543 65 431 65 432 654 321 .4 .3 .6 .2 .5 .4 .7 .3 .6 .5 .8 .4 .7 .6 .9 .2 .5 .4 .7 .3 .6 .5 .8 .4 .7 .6 .9 .5 .8 .7 1.0 Табл 2 2 8 9 2 2 2 7 2 2 2 7 2 2 2 1 2 2 1 1 2 2 1 7 2 2 2 7 2 1 2 и ц а 4 3 О. н ТО .8 .6 2.4 .6 1.6 1.4 3.5 1.2 2.4 2.2 4.3 2.2 3.6 3.4 5.5 .6 1.6 1.4 3.5 1.5 2.7 2.5 4.6 2.2 3.6 3.4 5.5 3.5 5.1 4.9 7.0 нужно логически перемножить числа, соответствующие R и N), и получится число, соответствующее R (] N) (про- (процедура and в описанной ниже процедуре 1)). Для полу- получения числа, соответствующего R [) N'}, нужно резуль- результат просто вычесть из числа, соответствующего R. Потен- 1) Небольшая техническая подробность — для этого требуется еще, чтобы использовался транслятор, в котором целые цисла имеют пред- представление с фиксированной запятой.
286 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ циалы вычисляются в процедуре в массиве v [1 : 2т — 1], который первоначально используется для хранения ве- вероятностей рм (R). Результаты записываются в cost (минимум целевой функции, т. е. v [2т — 1]), и в двух целочисленных массивах dec, q [I : 2 X m — 1], задающих политику диагностики. В ячейке dec[l] записывается номер первого (корневого) теста. Если q li] равно нулю, то dec H] — номер состояния, в противном случае — номер проверки. В том случае, если в dec li] записан номер про- проверки, то при результате проверки, равном 1, следующее состояние становится равным i + 1, а при результате О следующее состояние q li]. Так, для дерева на рис. 68 значения компонент массива будут следующими: i 12345678 9 10 11 dec [i] 2 1 2 1 7 4 1 5 9 3 6 q[i] 5400709011 0 0 В приводимой процедуре test [I : m] — матрица те< тов, cost — .минимальная стоимость эксперимента, остал! ные обозначения соответствуют использовавшимся: procedure diagn (т, п, р, test, с, dec, q, cost, gz); value m, n, gz; integer m, n; real cost, gz; integer array test, q, dec; array p, c; begin integer i, i\, /2, /, k, ml; real pi, p2, min; array f[l : 2fm—1]; integer array r[l:2fm—1]; ml : = t'2: = l; for/e: = l step 1 until 2fm-l do begin v[k]: = .0; /-[&]: =0 end; for i:=0 step 1 until m—l do begin r[ml]: = i — m; tn\: = ml -f-ml end; for k: = l step 1 until m do begin pi: = p[k]; il: = t2; t'2: = /2 + i2; for j: = i2 step t2 until ml do for i: = j — il step 1 until /—1 do if r[i]^0 then v[i]: = v[i] + pl end k; for k: = l step 1 until ml - 1 do if r[k] = O then begin min: = gz; pl: = v[k]; il: = n+l; for i: = 1 step 1 until n do begin i2: = and (k, test[i]); if i2>0f\i2<k then begin р2:=с[/]хр1+ф2]-И[&-;2
§ 9. ПЛОСКАЯ ЗАДАЧА РАСКРОЯ 287 if р2 < nun then begin tnin :=p2; il: = i end end end i; v[k]:=min; r[k]: — il end k; П: = 1; /e: = ml — 1; for t: = l step 1 until 2xm-l do dec [i]: = q [ i]: -= 0; : /: = rl&]; if />0 then begin dec[il]: = j; i2:=and(k, test[j\); q[i\]: = i2 — k; k: = i2; tl: = /l + l; go to mk end; if tl<ffl + m-] then begin for i: = il step — 1 until 1 do if <?[i]<0then begin k:= — q[i\; q[i]: = il: = il + l; go to mk end end; cost: — v]n-{-m—l] end diagn. § 9. Плоская задача раскроя В задаче раскроя, которую мы рассматривали в конце гл. 2, было несущественно, что представляет собой мно- множество способов раскроя. Надо было лишь, чтобы на этом множестве было удобно решать вспомогательную экстре- экстремальную задачу, в которой выбирается наивыгоднейший раскрой. Такой подход позволяет решить многие другие задачи раскроя. Как практически важное обобщение задачи линейного раскроя часто рассматривается задача раскроя прямо- прямоугольного листа на прямоугольные заготовки сквозными резами, параллельными краям. Это условие объясняется технологией, при которой для раскроя используются так называемые гильотинные ножницы. Нам это очень удобно, так как позволяет обойтись рассмотрением прямо- прямоугольных листов и свести задачу к процессу динамического программирования, в котором состояние описывается па- парой целых чисел — длиной и шириной листа в выбранной единице измерения.
288 . ГЛ. б. РЕКУРРЕНТНЫЕ МЕТОДЫ Задача выбора наивыгоднейшего гильотинного рас- раскроя и будет нас сейчас интересовать. Задача гильотинного раскроя. Пусть заданы пара положительных целых чисел (ГО, wO) — длина и ширина исходного прямоугольного* листа и еще п троек чисел (/ \i], w \i], с Ш), где / [i], w It] — положительные целые числа, задающие длину и ширину заготовок, а с \i\ — стоимость такой заготовки, положительное вещественное число. Требуется выбрать политику раскроя, т. е. для всех размеров листа (/, w), где /е 1:10, » е 1 : и 0, указать способ раскроя — по длине или по ширине — расстояние резов от края так, чтобы сумма стоимостей получившихся из листа заготовок была максимальной. Прежде всего займемся исследованием рекуррентных соотношений Беллмана. Как обычно, наряду с исходной задачей мы будем решать такую же задачу со всеми мень- меньшими (целочисленными) значениями /О и w 0. Обозначив максимум этой суммы для листа (/, w) через v [/, w], мы получим для потенциалов v рекуррентное соотношение v[l, ш]= max {maxAeo:/ (v[/ — Я, до] + и[А,, w]), maxaeo;W(v[l, со]+ !>[/, w — со])}. E3) Это рекуррентное соотношение имеет много решений, от чего нас не спасает ни условие неотрицательности v ни условие на границе v 10, w] = v И, 0] = 0. E4) Условие v U Ш, w Ш] > с М E5) также не устраняет лишних решений (это видно, например, из того, что любое решение при умножении на множитель, больший 1, остается решением). Оказывается, для обес- обеспечения единственности нужно потребовать минимальность решения. Теорема 7. Пусть vt и v2 — два решения рекур- рекуррентных соотношений E3) — E5). Существует решение v, для которого v sg; vlt v sg % F6)
§ 9. ПЛОСКАЯ ЗАДАЧА РАСКРОЯ 289 Существует решение тех же рекуррентных соотношений, которое не больше любого другого решения, и по этому решению может быть построен оптимальный гильотинный раскрой. Доказательство, Пусть v3 I/, w] = min {vx [I, w], v2 [I, до]}. Поскольку из E3) следуют неравенства v[l, w]^v[l-k, w) + v[l, w], A,e=0:/, v[l, w]^v[l, w]-\-v[l, w — <o], и e 0 : ш, то из выполнения этого неравенства для v1 и v3 следует его выполнение для v3. Неравенство E7) является част- частным случаем неравенства C1). Выбрав v3 в качестве на- начального приближения, мы можем построить монотонно невозрастающую ограниченную снизу последовательность, которая сходится к функции, являющейся решением E3) и удовлетворяющей E6). (Такая структурная операция для решений уравнения Беллмана очень характерна. Мы вернемся к этому вопросу в следующей главе.) Рассмотрим множество F функций, удовлетворяющих условиям E4) — E7). Так как это выпуклое множество, которое содержит, в частности, функции, удовлетворяющие E3) — E5), в нем для любой пары (/, w) найдутся функ- функции с минимальным значением v [/, до]. Взяв функцию vu принимающую наименьшее возможное значение в точке (h>wi)> и функцию v2, принимающую наименьшее возмож- возможное значение в точке (l2, до2), построим по ним функ-. ЦИЮ V12, ДЛЯ КОТОРОЙ V12 Uj, Wl] = V1 [/ь Wy] И Wj2 [/2, W2] = = v2 \l2, w2]. Повторяя этот процесс нужное число раз," получим функцию из F, минимальную одновременно по всем компонентам. Эта функция, очевидно, является ре- решением E3). В противном случае по ней можно бьпо бы, как выше, построить решение E3), которое еще меньше. Покажем теперь, что это решение v для каждой пары (/, до) дает максимум стоимости деталей, которые можно выкроить из листа (/, w). Действительно, для каждой пары (/, до) либо найдется i e N такое, что / = / [/], w = w [Л, v U, w] = с \i], E8) либо максимум в E3) достигается при А, е 1 : / — 1 или при oeliai — 1. Если бы это было не так, то v [I, w] можно было бы уменьшить и получившаяся функция по- прежнему удовлетворяла бы E5) и E7). Используя ее 10 И. В. Романовский
290 . ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ в качестве начального приближения для монотонно не- возрастающей последовательности, мы получили бы, пе- переходя к пределу, функцию V, удовлетворяющую E3)—E5). Рассмотрит теперь произвольный гильотинный рас- раскрой листа (/ 0, w 0). В нем участвует некоторое множество листов с размерами (la, wa), причем для каждого а задан либо номер детали i (а), которая получается из этого листа, либо номера ах и а2 получающихся листов. В первом случае воспользуемся неравенством v[la, wa] 5з с [i (a)], во втором — неравенством V[la, Wa]^sb[lai, Wai] + V[la2, Wa,]. E9) Если эти неравенства просуммировать по всем проме- промежуточным листам, в левой части у нас останется v [10, w 0], а в правой части — сумма стоимостей получившихся де- деталей. С другой стороны, мы можем построить гильотин- гильотинный раскрой, сопоставляя каждому из встречающихся размеров либо разрез, на котором достигается максимум в E3) для функции v, либо номер детали из E8). Для этого раскроя в E9) всюду достигается знак равенства, и, сле- следовательно, значение vll-O,wO] равно сумме стои- стоимостей деталей, а Отметим, что единственности решения можно было сразу достичь, модифицируя уравнение E3) и полагая v[l, ay] = max {max>, тахш, max {c[i]\ l [!]</ш[|']<ю(, О}. F0) Однако мы хотели показать еще одно использование рас- рассуждений, основанных на неравенстве C1). В вычислениях, разумеется, следует брать за основу уравнение F0), решение которого можно, как обычно, находить последовательно, начиная от v [0, 0] = 0. Схема вычислений, в которой участвуют все пары из 1 : / 0 и 1 : w 0, особого интереса не представляет. Она просто реализуется, но очень трудна в практически интересных задачах, где /0 и w 0 обычно имеют значения порядка сотен. Между тем легко видеть, что в практически интересных случаях функция v ll, w] обладает хорошими свойствами,
§ 9. ПЛОСКАЯ ЗАДАЧА РАСКРОЯ 291 в частности, она монотонна по каждой из переменных и кусочно постоянна. Например, при т = 2, Ю = 10, даО = 5, Ml : 2] = = B, 3), w II : 2] = G, 3), с [1 : 2] = C, 2) эта функция будет иметь график, изображенный на рис. 69. Рис. 69. График функции Беллмана. Таким образом, чтобы задать функцию v, достаточно задать список основных точек — троек (la, wa, с„), соот- соответствующих скачкам функции (в нашем примере их во- восемь, включая @, 0, 0)). Мы опишем процедуру, в которой реализуется схема переработки списков, в общих чертах. Список будет стро- строиться «слоями» — для каждой интересующей нас ширины отдельно. Интересующие нас ширины будут также выписаны, в виде списка, в который вначале будут включены ширины исходных деталей, а затем этот список будет «замкнут» — в него будут включены все комбинации исходных ширин с натуральными коэффициентами. Для каждой ширины ее «слой» будет формироваться в два этапа — сначала будет задана исходная информация и начальные детали слоя, а затем, почти как в задаче ли- линейного раскроя, из начальных деталей будут сформиро- сформированы их комбинации. Исходная информация состоит из трех составляющих — детали данной ширины, список то- точек предыдущей ширины (который к этому моменту уже должен быть сформирован) и пары списков, соответству- 10*
292 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ ющке парам ширин, в сумме дающим рассматриваемую. На рис. 70 показано, какой именно список мы хотим де- делать из пары списков. w/ w2 tv/+w2 11 1 \d ! 17 17 c7 I IB 18 c8 2 C,2 12 13 1 13 c3 19 | 13 cU I С и 110 с Ю НО с/ с/+с7 cUcff c2+c8 сЗ+с8 сЗ+сЭ cf+cS Рис. 70. Схема соединения списков. Рассмотрим детали алгоритма на небольшом примере. Пример, т = 3, /0 = 205, wO = 100. Прежде всего образуем список основных ширин (табл. 5). Вначале в него входит три числа 31, 41, 51. После замыкания списка получаем 31, 41, 51, 62, 72, 82, 92, 93. 1 10 с 1 1 [i\ М Ш 1 аб 1 71 31 8 л и 2 31 41 5 ц а 5 3 81 51 16 Для ширины 31 мы имеем одну деталь с длиной 71 и пеной 8. Пре- Предыдущего списка здесь нет, пар ширин, в сумме дающих 31, тоже нет. Замыкание добавляет в этом списке удвоение первой детали. За- Запишем окончательный список так: 31 : G1, 8), A42, 16). Для ширины 41 получаем исходный список 41 : C1, 5). После до- добавления предыдущего списка 41 : C1, 5), G1, 8), A42, 16). После за- замыкания получим: 41 : C1, 5), F2, 10), (93, 15), A24, 20), A55, 25), A86, 30) (предыдущий список весь доминируется). Для ширины 51 выпишем прямо окончательный список 51 : C1, 5) F2, 10), (81, 16), A12, 21), A43, 26), A62, 32), A93, 87). Для ширины 62 в исходном списке, кроме списка 51, будет «удвоен- «удвоенный» список 31: 62 : G1, 16), A42, 32).
§ 10. СВЯЗЬ С УЛУЧШЕННЫМ ПЕРЕБОРОМ 293 Мы получим начальный список: 62 : C1, 5), F2, 10), G1, 16), A12, 21), A42, 32), A93, 37) и окончательный 62 : C1,5), F2, 10), G1, 16), A02, 21), A33, 26), A42, 32), A73, 37), B04, 42). Список 72 строится аналогично по 62 и 31 + 41. Последнее сочета- сочетание дает: 72 : C1, 5), F2, 10), G1, 18), (93, 23), A24, 28), A42, 36), A55, 41), A86, 46). В результате получаем тот же список. Теперь список 82 должен в качестве исходной информации брать списки 72, 41 :- 41 и 31 + 51, список 92 — списки 82 и 41 -г 51, спи-' сок 93 — списки 92 и 31 + 62 и т. д. Окончательно получаем: 82 : C1, 10), F2, 20), (81, 24), (93, 30), A12, 34), A24, 40), A43, 44), A55, 50), A74, 54), A86, 60), B05, 64), 92 : C1, 10), F2, 20), (81, 26), (93, 31), A12, 37), A24, 41), A43, 46), A55, 51), A62, 57), A86, 62), A93, 67), 93: C1, 10), F2, 20), G1, 24), (81, 26), (93, 31), A12, 37), A24, 41), A33, 44), A42, 48), A52, 50), A55, 51), A62, 57), A73, 58), A83, 61), A86, 62), A93, 67), B04, 68). ///////У///////////////////////////// 1 / ' / / г г '/////А У////А г г Рис. 71. Оптимальный раскрой. Наилучший раскрой, получающийся в этом примере, изображен на рис. 71. § 10. Связь динамического программирования и улучшенного перебора В этом параграфе мы хотим рассмотреть основную идею динамического программирования — идею рекурсии и вложения исходной экстремальной задачи в класс родст- родственных задач с другой точки зрения — с точки зрения улучшенного перебора. Пусть мы решаем (как в § 3 гл. 5) некоторую дискрет- дискретную экстремальную задачу. | Найти min, {/ (х) \ х <= А}. Пусть на каком-то шаге процесса мы получили разбиение Й множества допустимых решений А:
294 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ Назовем а-задачей задачу: | Найти min {/ (х) | х е Аа). Предложение 2. Если а-задача является рас- расширением ^-задачи, т. е. если существует отображение Т:А$-+Аа и I (*) > / (Тх) для х е= Лр, F1) /по существует оптимальное решение исходной задачи в множестве А \ Л р. Доказательство следует из того, что от рас- расширения задачи минимум разве лишь уменьшается. ^ Мы уже пользовались вычислительными возможностя- возможностями, которые нам представляет предложение 2. Так, напри- например, в задаче линейного раскроя рассматриваются «час- «частичные раскрои» — наборы деталей, использующие ка- какую-то часть сырья и дающие какой-то доход. В качестве множеств допустимых решений можно рассматривать рас- раскрои, продолжающие данный частичный раскрой. Частичный раскрой, в котором использована меньшая, чем у данного, длина сырья и получен большой доход, предоставляет больше возможностей для продолжения, поэтому откидывание доминируемых состояний в решении задачи линейного раскроя и является использованием предложения 2. Ситуация, с которой мы здесь встречаемся, весьма типична. Во многих задачах все элементы разбиения мно- множества допустимых решений могут быть охарактеризо- ваны сравнительно небольшой информацией, которую мь и называем состоянием процесса. Фактически, пользуяа рекуррентными соотношениями или уравнениями дина- динамического программирования, мы добиваемся того, чтобь в каждый момент вычислительного процесса было не болыш одного состояния процесса. В случае, если состояний процесса не очень много мы можем вести вычисления для всех состояний, есл1 их слишком много, можно попытаться ввести доминиро- доминирование на множестве состояний и удалить лишнее. Однако в действительно сложных задачах успех можи быть достигнут лишь при сочетании различных идей v подходов. Например, в задаче о поиске неисправности, где метод рекуррентных соотношений практически без-
§ 11. СХЕМА ВЕРТЕЛЕ-БРИОШИ 295 надежен при п порядка 20, оказывается целесообразным сочетать его с методом ветвей и границ для того, чтобы выбрать начальные разбиения множества неисправностей на достаточно малые подмножества. § 11. Схема исключения Вертеле— Бриоши Метод рекуррентных соотношений Беллмана допускает еще одну трактовку, которая позволяет значительно рас- расширить число задач, решаемых с его помощью. Рассмотрим следующую задачу. Пусть Т ~ 0 : t и для каждого i e T задано конеч- конечное множество X;. Пусть на произведении XUl x X,-, ['ё 1: t, задана функция с,-. Требуется каждому i e T сопоставить х [i] eE X; так, чтобы максимизировать 2«ie 1 :t Ci \X yi— 1J, X\l\). \y^) Эта задача легко сводится к схеме Беллмана, но не уступает ей в общности. Будем решать ее знакомым мето- методом рекуррентных соотношений: обозначим через vk (у) максимум при условии х [k] = у, мы получим рекуррентное соотно- соотношение u*+i (У) — max \cktx (X, JJtfiW/tAj), ,„ причем нас должен интересовать max {vt (у) | у е Xt}. Можно тот же подход трактовать иначе, как способ после- последовательного исключения переменных. Рассмотрим, напри- например, в целевой функции F2) переменную х (t). Она вхо- входит тблько в слагаемое ct(x[t—1], х [/]). Найдем при каждом х U—1] максимум по х U]. Мы получим неко- некоторую новую функцию yt-! (х) = max {ct (х, у) \ у eXt}, F4) которую теперь можно добавить к функции с^ (х, у). В получившейся целевой функции можно также исклю- исключить X \t — 1] И Т. Д. Теперь мы можем перейти к варианту этой задачи, кото- который уже не удается привести к классической схеме, рас- рассмотренной выше.
296 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ Задача максимизации на дереве. Пусть (М, N) —дерево, каждой вершине которого i сопоставлено конечное множество Xit а каждой дуге и — функция си на произведении Хци) X Xj{u). Тре- Требуется выбрать набор х [М], х Ш е Xh максимизи- максимизирующий Z,ue\ca(x[i(u)], а-[;(")]). В этой задаче мы можем применить ту же технику по- последовательного исключения переменных. Поскольку в дереве всегда найдется «висячая» вер- вершина, т. е. вершина, инцидентная лишь одной дуге, здесь всегда возможна предложенная выше редукция задачи. При исключении такой вершины и инцидентной ей дуги мы снова получим дерево и т. д. Сходство между этим процессом и процессом рекур- рекуррентного счета такое же, как между цепью и деревом, —' носледовательно исключая переменные, мы решаем всю задачу до конца. Если (М, N) состоит из одного цикла, исключение может быть проведено чуть иначе — каждая вершина i будет инцидентна двум дугам и, следовательно, х U] будет входить только в два слагаемых целевой функции. Мы получим, например (обозначения зависят от ориентации, которая здесь несущественна), Для каждой пары значений х [i (ut)], x [/ (иг)] можно выб- выбрать то значение х li], на котором достигается максимум этой суммы. Таким образом, сумма будет заменена неко- некоторой функцией cUiUt (xli («i)l, x [j (u2)]), а граф преобра- преобразуется в цикл с меньшим числом дуг. Те же рассуждения проходят для графа, состоящего из дерева и связанных им циклов. Если же два цикла имеют пересечение, то при исключении вершины, на которой эти циклы расходятся, мы получим функцию, зависящую от трех переменных,' которую в нашей графической интерпретации задачи сле- следовало бы изобразить треугольником. Таким образом, произвольный граф является не вполне удачным объектом для развития метода исключений и должен быть заменен произвольным комплексом остовов (или гиперграфом).
§ 11. СХЕМА БЕРТКЛЕ — БРИОШИ 297 Итак, рассматривается следующая задача. Задача Вертеле — Бриоши. Имеются два конечных множества М и N. Каждому и е N сопоставлено непустое множество Ма с М. Каж- Каждому i e M сопоставлено конечное и непустое множест- множество Xt. Задан набор функций са (х \Ми]). Требуется найти х [М], на котором достигается максимум I.u<=nc,,(x[Mu]). При решении этой задачи методом исключения пере- переменных производится следующая редукция комплекса: выбирается какая-либо из вершин i еМ и звезда этой вершины (так называется совокупность множеств Ми, содержащих i) заменяется объединением этих множеств, за исключением самого L Соответствующая этому новому множеству М * функция с * определяется по формуле с* (х[М*\) = max {?„, м^с(х[Ма]) \x\i\ е= Xt}. F5) При такой редукции мы снова получаем комплекс осто- остовов, и вид задачи сохраняется. Трудоемкость решения задачи Вертеле — Бриоши за- зависит от того, насколько сложно производить вычисления по формуле F5). Например, можно считать, что трудо- трудоемкость определяется размером наибольшей из встречаю- встречающихся таблиц, задающих функции с. Так мы приходим к задаче о выборе последовательности редукций, при которой задача Вертеле — Бриоши оказы- оказывается наименее трудоемкой. Авторы назвали эту задачу «вторичной задачей оптимизации». Вторичная задача оптимизации. Пусть задан комплекс остовов Ко = (М, N, {Ми}), и каждому i e M сопоставлено положительное число г [i] (r [i] — In ( | Xi | )). Назовем характеристикой ком- комплекса величину s (К) = max {I [MJ X г [Ми\ \ и е= N). F6) Требуется найти такую последовательность комплексов Ко, Ки ... , Km, F7) в которой каждый следующий получался бы из преды- предыдущего описанной операцией исключения вершины и
298 ГЛ. 6. РЕКУРРЕНТНЫЕ МЕТОДЫ достигался минимум максимальной из встречающихся в последовательности характеристик. Оказывается возможным применить при решении этой задачи динамическое программирование в его обычном виде. Эта возможность базируется на следующем факте. ПредложениеЗ. Комплекс Kj, получающийся на j-м шаге в последовательности F6), зависит от того, какие вершины были исключены на первых j шагах, и не зависит от последовательности их исключения. Мы опустим доказательство этого предложения, кото- которое достаточно просто. Из этого предложения следует, что для задания комплекса мы можем ограничиться мно- множеством его вершин. Обозначим минимум при решении вторичной задачи оптимизации для комплекса R сг М через v (R). Тогда, очевидно, v (/?) = max {s (R), min {v (R — i) | i e= R}}. F8) Это уравнение представляет собой обычное уравнение динамического программирования, которое уже встреча- встречалось нам неоднократно.
ГЛАВА 7 МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ § 1. Некоторые сведения о марковских цепях Эта глава несколько отличается по своей проблематике от предыдущих. Но неявно в них участвовали понятия и конструкции, которые становятся яснее и естественнее, если перейти к рассмотрению хотя бы простейших веро- вероятностных задач управления. Такие простейшие процессы — марковские цепи, в ко- которых выбором управляющих параметров можно влиять на законы распределения, — и будут рассмотрены в этой главе. Мы начнем с некоторых простых фактов, относящихся к обычным марковским цепям, Будем говорить, что задана (конечная однородная) марковская цепь, если заданы множество М состояний этой цепи, вектор р0 [М] начальных вероятностей (распре- (распределение вероятностей на М в начальный момент времени), матрица переходных (условных) вероятностей р [М, М]. При этом ро[М]^О[М], 1[М]хро[М] = 1, . р[М, М]5гО[М, М], р[М, M]xl[M] = \[M] ( ' (как мы уже говорили, вектор р0 Ш], удовлетворяющий этим условиям, называется вероятностным вектором, мат- матрица р [М, М]—стохастической матрицей. Отсюда и идет термин «бистохастическая матрица», встретившийся нам в гл. 4). Свяжем с матрицей р [М, М] матрицу г [М, М]: г U, /] = Ь{р U, /1 > 0). B) Эта матрица может рассматриваться как матрица смеж- ностей некоторого графа (М, N), называемого графом переходов марковской цепи. Этот граф переходов задает систему предшествований на М (в смысле § 1 гл. 4), в соот- соответствии с которой М разбивается на классы эквивалент-
300 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ ности. Рассмотрим граф (M,N), являющийся редукцией графа (М, N). В этом графе нет контуров и, следовательно, найдутся «концевые» вершины — вершины, из которых не выходят дуги. Множество М' а М называется эргодинеским классом марковской цепи, если р Ш', М'\ х 1 Ш') = 1 Ш') C) и никакое собственное подмножество М' этим свойством не обладает. Предложение 1. Классы эквивалентности, со- соответствующие концевым вершинам графа (М, N), и только они образуют эргодические классы марковской цепи. Доказательство. Если М' — класс эквивалент- эквивалентности, соответствующий концевой вершине, то для него выполнение C) очевидно. Так как в классе эквивалент- эквивалентности существует путь из любой его вершины в любую, это означает, что вероятность перехода из любого состоя- состояния в любое (за несколько шагов) положительна, и под- подмножество, обладающее свойством C), из М' не выделить. Если М' — эргодический класс, то р \М', М \ М'] — = 0 \М', М \ М'\. Следовательно, в М \ М' нет эле- элементов, которым предшествовали бы какие-либо элементы из М'. Значит, М' состоит только из вершин, входящих в «концевые» классы эквивалентности, причем каждый такой класс может войти в М' только целиком. Но по уже доказанному каждый такой класс эквивалентности сам представляет собой эргодический класс и, следовательно, совпадает с М'. А Состояния, не входящие в эргодические классы, мы будем называть переходнымиа). Классы эквивалентности переходных состояний частично упорядочены, их можно разбить на уровни, приписав нулевой уровень эргодичес- ким классам и (k -f- 1)-й уровень классу эквивалент- эквивалентности, из которого можно попасть в класс /г-го и меньшего уровней. Таким образом, мы задаем на М функцию lev [M], удовлетворяющую соотношению (это тоже рекуррентное J) В литературе по марковским цепям, к сожалению, распространен термин «несущественные состояния». Этот термин мало удобен в тех многочисленных задачах, где только эти состояния и существенны.
§ 1. НЕКОТОРЫЕ СВЕДЕНИЯ О МАРКОВСКИХ ЦЕПЯХ 301 соотношение динамического программирования) D) = 0 при Ni = 0, lev[i]= I + max {lev[j (u)]: и е NT}. Пример. Пусть М = 1 : 8. В табл. 1 и 2 выписаны матрицы риг. Таблица 1 12 3 4 5 6 7 8 1 2 3 4 5 6 7 8 0.4 0.8 0.7 1 0.1 0.9 0.2 0.3 0.3 0.4 0.6 1 0.2 0.3 0.3 0.1 0.4 Таблица 2 12 3 4 5 6 7 8 1 2 3 4 5 R 7 8 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 Граф переходов и редукция этого графа представлены на рис. 72 и 73. Около классов эквивалентности (вершин графа на рис. 73) написаны их уровни. Легко видеть, что любая траектория марковской цепи переходит из состояния в состояние с понижением своего уровня и с вероятностью единица за конечное число шагов доходит до какого-либо эргодического класса. Поэтому все асимптотические рассмотрения для марковских цепей
302 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ проводятся именно для эргодических классов. Мы введем сейчас понятия, необходимые для будущего. Рис 72. Граф возможных переходов цепи. E) Рис. 73. Граф классов эквивалентности. Для каждого эргодического класса Ма можно рассмот- рассмотреть систему линейных уравнений п[Ма]х'р[Ма, Ма] = я[Ма], п[Ма]х\[Ма]=\. Предложение 2. Система E) имеет единствен- единственное решение, и это решение положительно. Доказательство. Известны многочисленные доказательства этого утверждения, как правило основы- основывающиеся на теореме Перрона о характеристических кор- корнях неотрицательных матриц. Мы здесь используем методы, более близкие по духу всему остальному изложению. В E) ограничений на одно больше, чем переменных. Однако, как это видно из C), между уравнениями первой группы имеется линейная зависимость, поэтому система E) всегда разрешима. Более того, так как преобразование Т : п -> я X р непрерывно отображает симплекс вероят- вероятностных векторов в себя, то по теореме Брауэра.сущест- Брауэра.существует непрерывная точка этого преобразования я, которая и является неотрицательным решением E).
§ 1. НЕКОТОРЫЕ СВЕДЕНИЯ О МАРКОВСКИХ ЦЕПЯХ 303 Вектор я[Ма] должен быть строго положительным. Действительно, если найдется непустое множество М' cz cz Ma, для которого л[М'] = 0[М'], то из E) следует, что р[Ма\М', М'] = 0[Ма\М', М'], и значит, Ма\М', вопреки предположениям, образует эргодический класс. Осталось доказать единственность решения. Пусть я0 и Kt — два различных положительных решения. Обозна- Обозначим через % Ша], где к — любое вещественное число, вектор к х пг [Ма] + A — к) х п0 [Ма], который, оче- очевидно, также является решением системы E). Выбором соответствующего к можно добиться того, чтобы вектор ла LMJ был неотрицателен и имел хотя бы одну нулевую компоненту. Между тем, как мы уже показали, это невоз- невозможно. Следовательно, неверно предположение о сущест- существовании двух различных решений E). ^ Вектор я \Ма], являющийся решением системы E), на- называется вектором стационарных вероятностей или ста- стационарным распределением эргодического класса Ма. (Если начальное распределение цепи р0 совпадает с л, то распре- . деление на каждом следующем шаге также будет совпадать с я.) Любое стационарное распределение исходной цепи должно быть сосредоточено только на состояниях из эрго- дических классов и, как легко убедиться, является выпук- выпуклой комбинацией стационарных распределений для эрго- дических классов цепи. Соответствующая E) неоднородная система у Ша\ X р [Ма, Ма] - Ь \Ма] + у [Ма] F) имеет (при условии 1 Ша] х b \Ма] = 0) однопарамет- рическое семейство решений у Ша] = р Ша] + у X я [Ма]. G) В качестве р 1Ма] выберем для определенности неотри- неотрицательное решение, обладающее свойством min { p [i] \ i e е Ма} = 0. Если на эргодическом классе Ма задать на- начальное распределение л0 Ша], решению р, соответст- соответствующему правой части Ь \Ма] = лп \Ма] — я0 [Ма], можно придать физический смысл потока вероятностей, переводя- переводящего распределение л0 в распределение я. В приведенном примере два эргодических класса Мх — = {1, 7} и Л1, = {2, 5}. Им соответствуют векторы я [Мг] = ~ @.6, 0.4)," п 1Л1а] = @.5, 0.5) и векторы у [MJ =
304 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ = (о, 2/3а + 1%61), уШ21 = (Р, Р + 2хЬ2). Таким образом, при я0 [1] > 0.6 имеем р WJ = @, @.6 —л0 [1]) X 10/9)), при я0 [Ц > 0.6 будет р [Mil = (C*o [И — 0.6) X 8/3, 0), два аналогичных варианта будет и у вектора р [М2]. Наряду с вектором стационарных вероятностей иногда целесообразно рассматривать матрицу стационарных без- безусловных вероятностей перехода я Ша, Ма] я [i, /] = я [i] х р U, /]. Для этой матрицы 1 Ша] х я Ша, Ма] = п [Ма, Ма] х 1 [Ма], (8) т. е. сумма элементов каждой строки равна сумме элемен- элементов соответствующего столбца. Матрицы, обладающие этим свойством, встречаются в задачах оптимизации, связан- связанных с марковскими цепями. Условие (8) фактически явля- является давно знакомым нам условием замкнутости потока — поток (вероятность), входящий в каждую вершину, равен потоку, выходящему из этой вершины. Полезно вспомнить по этому поводу задачу об оптимальном замкнутом потоке, которая встречалась нам в § 9 гл. 3, а затем использова- использовалась в § 5 гл. 6. Когда мы будем заниматься асимптотикой рекуррент- рекуррентных соотношений в марковских процессах решения, нам понадобится аналог задачи об оптимальном замкнутом потоке, и в этой задаче существенную роль будет играть условие типа (8). Теорема 1. Если общий наибольший делитель длин контуров в графе переходов (Ма, Ма) эргодического клас- класса Ма равен 1, то при любом начальном распределении на этом классе р0 1Мп] распределение рп [Ма] на п-м шаге (где рп Ша] = рпЛ [Ма] х р [Ма, Ма]) стремится к я \Ма] при п -*¦ оо. Доказательство этой теоремы такое же, как в известной теореме Маркова. Нужно только убедиться в том, что найдется такое k, что вероятность перейти из i в / за k шагов положительна при любых i, / e Ма. Оче- Очевидно, что по определению эргодического класса граф (Ма, Na) вполне связен. Поэтому к нему применимо пред- предложение 7 гл. 3, которое и гарантирует нам существование такого k.
§ 1. НЕКОТОРЫЕ СВЕДЕНИЯ О МАРКОВСКИХ ЦЕПЯХ 305 Далее, полагая у = min {pk [i, /] | i, j e= Ma) > 0, мы получаем max {j pn [i] - л [i] \\ie=Ma} = = max {; (pn.k [Ma] - л [MaJ) X Pk i'M^ l] 11' e Ma) < < A - y) x max {! pn-k [i] - л [/] !'| i e УИа}, откуда уже без труда следует утверждение теоремы, д Теорема 2. Пусть Ма — эргодический класс и i0, h> ••• , h — траектория марковского процесса, принад- принадлежащая Ма. Обозначим через k [i, j] число моментов време- времени, для которых it = i, i<+1 — /, а через v Ша, Ма] мат- матрицу, составленную из элементов k [i, j]/T. Тогда P{v[Ma, Ма]^л[Ма, Ма] при Т->оо} = 1. Эту теорему (которая называется эргодической теоре- теоремой Бирхгофа — Хинчина и имеется в стандартных кур- курсах по теории вероятностей) мы доказывать не будем. Естественно, что любая линейная комбинация частот v с вероятностью 1 сходится к соответствующей линейной комбинации стационарных вероятностей. В частности, если задана матрица «доходов» с [/И, М] и суммируются доходы по траектории, соответствующие переходам из состояния в состояние, то средний доход на траектории, принадле- принадлежащей Ма, с вероятностью 1 стремится к математическому ожиданию дохода на одном переходе в стационарном режиме ca=21t<=Ma. ieMac[i, j]xn[i, j]. (9) Если же начало траектории является переходным со- состоянием, то средний доход на траектории будет зависеть от того, в какой эргодический класс попадет траектория. Вероятности попадания процесса из данного переходного состояния i в эргодические классы Ма вычисляются, оче- очевидно из уравнений q U, а] = р \i, М] X q Ш, а], (Ю) где q [i, а] = 6 (Р = а) при i e Мл.
306 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ Предложение 3. Система A0) имеет единст- единственное решение, и траектория марковской цепи, начинаю' щаяся из i, с вероятностью q [i, а] попадает в Ма. Доказательство. Пусть М' — множество пере- переходных состояний. Для этих состояний система A0) може! быть переписана в виде q[M',a] — p{M',M'] xq\M',a) Нам достаточно убедиться в невырожденности матриць а Ш', ЛЛ = Е Ш', М'] — р Ш', АЛ. У этой матрицы на диагонали стоят положительные эле- элементы, все прочие элементы неположительны, сумма эле- элементов в каждой строке неотрицательна и хотя бы однг из этих сумм положительна. Допустим, что столбцы матрицы а[М', М'] линейнс зависимы, т. е. найдется Х[М'] Ф 0 [М'], для которого а[М', М']/Л[М']^0[М']. Не умаляя общности, можно считать, что max [K[i] i <= М'} = Х[го]>О. Пусть М+= = {ieM'|^[t]SsO}. Тогда O = a[to, M']xl[M']^a[i0, M+]xЯ[М ]^ Очевидно, во всех этих неравенствах достигается знаь раввнства. Покажем теперь, что М" = {t e Af' \X \i] = = k Uo]} содержит эргодический класс. Действительно, для любого i0 e M" мы по предыдущему имеем а Цо, М") х 1 Ш") = 0, что совпадает с C), и, следовательно, само М" либо мини- минимальное его подмножество, удовлетворяющее C), являете* эргодическим классом. Это противоречит определению М' и опровергает предположение о вырожденности матриць а\М', М'\. Матрица а \М', М'] имеет обратную матрицу а~ [М', М'], которая, очевидно, может быть представлена рядом а-[М\ М'] = Е[М', M'] + vft>iP*[^'. M'l (Мы всегда имеем право написать этот ряд формально. Его сходимость следует из существования матрицы а~[М\
§ 1. НЕКОТОРЫЕ СВЕДЕНИЯ О МАРКОВСКИХ ЦЕПЯХ 307 М'] и неотрицательности членов ряда.) Далее q[M', а] = сг[М', М']хр\М', Ма)х\[Ма] = = Y.k>\PkW, Ma]xt[Mal т. е. q[M', a) = ?k>iqk[M', а], где qk[i, а]-вероят- а]-вероятность попасть из i в Ма ровно за k шагов. Отсюда сле- следует второе утверждение теоремы, д Можно говорить о математическом ожидании среднего дохода на траектории, начинающейся из состояния i. Оно, очевидно, будет равно Yi = Ztf U, а] X са. A2) Однако в отличие от предыдущего у,- не будет равно пре- пределу среднего дохода на траектории, который должен совпадать с одним из са. Самостоятельный интерес пред- представляет случай, когда все эти са одинаковы и (для опре- определенности и для удобства) равны 0. Здесь естественно появляется новая система показателей, характеризующих относительную доходность состояний, родственная системе двойственных переменных для задач линейного програм- программирования и поэтому важная для понимания смысла по- показателей, возникающих при решении оптимизационных задач, связанных с марковскими цепями. Такого рода параметры марковской цепи изучаются в теории потен- потенциала для марковских процессов, некоторые понятия ко- которой приводятся в следующем параграфе. В заключение рассмотрим уравнение у Ш] х р [М, М]=--Ь [М] + у [М], A3) аналогичное F), но уже для всех без исключения состояний цепи. Примем b[M] = 2ap0[M]xq[M, а]хла[М]-р0[М]. [14] Здесь уменьшаемое имеет смысл математического ожида- ожидания предельного распределения вероятностей, и его связь с у,- из A2) аналогична связи ла [i] с са. Для переходных состояний уравнение A3) однозначно разрешимо, как это было установлено при доказательстве предложения_3. Зная у \М\ для множества переходных состояний М, получаем для каждого эргодического
308 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ класса Ма автономную систему у[Ма]хр[Ма, Ма] = у[Ма] + (Ь[Ма]-у[М]хр[М, Ма}), A5) совпадающую с F). Обозначим через р [АЛ вектор, состав- составленный из однозначно определенного у [М\ и решений систем A5), выбранных, как сказано выше. Отметим, что такой вектор можно построить по любому начальному распределению р0 [АЛ. Аналог системы A3) для оптими- оптимизационных задач встретится в § 6. § 2. Марковские цепи и потенциалы Мы ограничим себя самыми простыми моделями, которые в теории потенциала используются лишь как предваритель- предварительные для введения основных понятий и фактов. Рассмотрим вначале марковскую цепь с матрицей пере- перехода р [М, АЛ и единственным эргодическим классом, со- состоящим из единственного состояния i+ (состояния погло- поглощения). Пусть задана.матрица с [М, АЛ доходов при пере- переходах из состояния в состояние, причем с l/+, i+] = 0. Обозначим через / til математическое ожидание дохода, получаемого на бесконечной траектории, идущей из состоя- состояния L Значения / [/] для различных i связаны управлением f li] = S/GM (с И, ]] + f [/]) х р И, /]. A6) Естественно, полагая Пи = о, A7) мы можем однозначно разрешить эти уравнения. Действи- Действительно, A6) можно переписать в виде / Ш - р li, M] X f[M]=y Ш, A8) где у li] = ZjC [i j] x p \i, /]. Матрица системы для М'= М — i+ нам уже встречалась в доказательстве предложе- предложения 3, где было показано, что она невырожденная. Решение системы A8) можно представить в виде ряда f [АЛ = 2*>ОР* Ш, М\ х у [АЛ, A9) где р° Ш, М] = Е Ш, АЛ, р" Ш, М} = р [М, АЛ X рК'1 Ш, АЛ.
§ 2. МАРКОВСКИЕ. ЦЕПИ И ПОТЕНЦИАЛЫ 309 Матрица slM',M'\ = 2ft>o/>4M'f ЛЛ B0) называется резольвентой нашей марковской цепи. Эле- Элементы матрицы s имеют простой вероятностный смысл: s [г,/] — математическое ожидание числа попаданий в / бес- бесконечной траектории, начинающейся из i. Вектор f[M], удовлетворяющий системе A6), назы- называется потенциалом или, если у Ш\ > 0 [М], потенциалом заряда у. Функция f [i\, удовлетворяющая неравенству flM] > Р Ш,М] х f[M], B1) называется эксцессивной функцией. Предложение 4. Потенциал заряда является экс- цессивной функцией. Доказательст во следует непосредственно из A8) и B1). Предложение 5. Минимум из двух эксцессивных функций является эксцессивной функцией. Доказательство. Действительно, min {/ Ш, g [i]} > > min {p [i, М) X f Ш\, р И, М] х g IM}} > ^ Ич'емР U, /1 X min {/ [у], g [/]}. А Введем еще функцию / \М], удовлетворяющую условию f[M] = р Ш, М\ х f[M], . B2) и назовем ее регулярной. В рассматриваемом сейчас слу- случае функциями, удовлетворяющими B2), будут лишь кон- константы. В случае, когда р \Л4, М\ имеет несколько эргодичсских классов, потребуем, чтобы на каждом эргодическом классе Ма равнялось нулю математическое ожидание дохода за один шаг в стационарном режиме Са = Па \Ма\ X у Ша). B3) Сохраняя определения эксцессивной функции и регуляр- регулярной функции, назовем потенциалом функцию / \М], удовле- удовлетворяющую условию A6) и для каждого эргодического класса Ма условию я LA1J -х / IMJ = 0. B4)
310 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ Если при этом функция у \М\ неотрицательна (а следова телыю, равна 0 на любом эргодическом классе), f Ш] на зывается потенциалом заряда у. В заключение приведем несколько знаменитых свойст] потенциала заряда. Для краткости слово «заряд» буде в дальнейшем опускаться. Множество положительности за ряда назовем носителем потенциала. Обозначим через Ца U, /1 вероятность того, что Марков екая цепь, двигаясь из состояния i в качестве своего пер вого состояния в множество А будет иметь состояние / Таким образом, qA Ш, Л) > 0 \М, A], q [А, Л] = Е [А, А], qA Ш,А) х 1 [Л]< 1 \М]. . B5] Теорема 3 (Ф. Рисса). Любая эксцессивная функция однозначно представима в виде суммы регулярной функции и потенциала. Доказательство. Пусть f — эксцессивная функ- функция.- Умножив неравенства B1) на вектор стационарны^ вероятностей л \Ма], получим я [Л1а] X / Ша] > л Ша] х (р Ша, М] х / [Л1 ]) = = л Ша] X / [Ма], откуда следует, что на Ма неравенства B1) выполняются как равенства. Обозначим da = л [Ма] X / [Ма] и поло- положим g ti] = vaq Ц> a] x da. Очевидно (ср. (Ю)), g [»] = p [i, M] X g [M] и, следовательно, функция g [M] регулярна. Покажем, что функция h[M]=f\M\—g\M\ является потенциалом. Действительно, h \Ma] = 0 1Ма], так как на Ма функции / и g совпадают. Кроме того, h \М] — р\М,М] х h [М\ = = (f[M] — рШ, М]Х[1М\) - (g[M] — р\М,М] X х g[M]) >О \М]. Однозначность представления следует из того, что на эргодических классах g должна совпадать с /, а по значе-
§ 2. МАРКОВСКИЕ ЦЕПИ И ПОТЕНЦИАЛЫ 31! ниям на эргодических классах регулярная функция опре- определяется однозначно. А Предложение 6 (принцип максимума). Пусть п[М] — потенциал и А — его носитель. Тогда для любого h [г] =g max {h [j] \ j e A}. Доказательство. Очевидно, h [i] = qA U, A] X x h [А]. Отсюда и из B5) следует требуемое неравенство. ^ Предложение 7 (принцип доминирования). Если f Ш] и g Ш] — потенциалы, А — носитель потенциала g и f[A]>g[A], то /!M]>g[M Доказательство. Утверждение следует из того, что для ie/i , g Ш - qA [i, А) X g \A], f [i] > qA [i, A] x f \A] (к g \i] на пути из i в А ничего не прибавляется, а к / [{] добавляется что-то неотрицательное). ^ Предложение 8 (принцип выметания). Пусть g[M] — потенциал заряда у и A cz M — непустое множе- множество. Функция f [М] = Ца Ш, А] X g [А] обладает следую- следующими свойствами: а) / [М] — потенциал, б) flM]^g[M] и f[A] = g[A], в) носитель f содержится в А и однозначно определяется по этим свойствам. Доказательство. Равенство f [A] = g [А] оче- очевидно. Возьмем какое-либо i е М \ А. Значение g [i] может быть представлено в виде двух слагаемых — неотри- неотрицательного математического ожидания доходов до попада- попадания в множество А и математического ожидания доходов после попадания в А, которое равно ца U, А] X glA]. Таким образом, и утверждение б) доказано. Для i е М \ А имеем / Ш = с]А И, А) х g [A] = = р U, М\ х qA Ш, А] X g [А] = р Ц, М] X / [М], B6)
312 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ а { Для ш = = V П. ё 1-1 = А Ш = Y - р и, л \i\ + 1] X Р Я х g [Ml = - f Ш)) + р U, М] х / [ЛЛ = = у' Ш + р U, М] х / Ш], откуда следует, что / — потенциал неотрицательного за- заряда у' и его носитель содержится в А. Обратное утверждение следует из равенств f \A] = g [A] и B6). а § 3. Пример управляемого случайного процесса: стохастическая задача управления запасами Задача управления запасами уже встречалась в преды- предыдущей главе. Здесь мы рассмотрим более сложную и инте- интересную модель, в которой заранее неизвестен спрос на про- продукт в каждый момент времени. Этот спрос будет предпо- предполагаться случайным, причем вероятностные характеристики спроса будут считаться заданными. Модели, в которых создается запас, обеспечивающий этот случайный спрос с вероятностью единица, особого интереса не представляют. Чаще бывает нужна постановка задачи, в которой нехватка запаса допустима, но приводит к некоторым потерям — связанным с ожиданием этого запаса (и условным или реальным штрафом за потери) либо со срочной дополни- дополнительной постановкой. В любом случае будем считать, что нехватка запаса приводит к появлению некоторых допол- дополнительных затрат, соизмеримых с затратами на хранение и на пополнение запаса. Для простоты мы будем сейчас рассматривать задачи со стационарным марковским про- процессом спроса и уровни спроса будем считать дискретными. Итак, пусть задана марковская цепь с конечным множе- множеством состояний X, элементы которого суть неотрицатель- неотрицательные числа, т. е. заданы начальное распределение л0 [X] и матрица переходных вероятностей р [X, X]. Состояние xt этой цепи в момент времени / задает спрос на продукцию, предъявляемый складу в этот момент времени. Склад, имея запас продукции st, по возможности удовлетворяет этот спрос, т. е. в случае, если s, ^ xt, удовлетворяет спрос полностью и остается с запасом zt = st — х,, а в случае Si < xt остается с запасом zt = 0 и оставляет неудовлетво- неудовлетворенным спрос xt— St.
§ 3. СТОХАСТИЧЕСКОЕ УПРАВЛЕНИЕ ЗАПАСАМИ 313 Могут рассматриваться различные варианты удовлетво- удовлетворения остатка спроса. Здесь для простоты примера бу- будем считать, что этот спрос теряется, приводя к убытку гр (xt — S/), где i|j (*) — заданная функция г|з @) = 0. По известному остатку запаса zt и по состоянию xt марковской цепи в момент времени t производится попол- пополнение запаса. Пополнение его до уровня у требует затрат Ч> (У — zt), где ф — заданная функция. Общие затраты складываются из убытков от потерян- потерянного спроса, затрат на пополнение склада и затрат на хра- хранение остатка продукции, которые равны у (zt) (у @) — 0). Таким образом, от запаса st мы перешли к запасу s с затратами h = 1> ((xt - st)+) -f у ((s, - xty) + cp (s — (Sl - xty). B7) Когда рассматривается функционирование процесса в мо- моменты ieO: II, получается траектория из состояний Sq, su ..., sn с суммарными затратами, которые равны Эти суммарные затраты случайны. Нам уже встречались в предыдущей главе постановки задачи, в которых показа- показатель качества управления был случаен. Здесь это — одна из основных особенностей моделей. Мы пойдем по обычному (но далеко не единственному пути) и будем в качестве целевой функции рассматривать математическое ожидание затрат. С выбором целевой функции в какой-то мере связан выбор состояний описываемого процесса. В терминах s< и s мы не можем записать математическое ожидание затрат, так как они зависят от xt, а распределение xt_x в свою очередь зависит от xt. Кроме того, сам запас s мы должны выбрать в зависимости от xt, и поэтому нежелательно было бы прятать «внутренние переменные» перехода от st ks^ sM. Естественнее в качестве состояний процесса взять не sit а как раз эти внутренние переменные — пары t,t = = (xt, zt) — и описывать переход от пары t,t к паре ?,н. Представляется естественным формально ввести функ- функцию а (?), описывающую зависимость будущего запаса st+1 от пары t,t = (xt, z,). Зафиксировав эту функцию, мы полу- получим марковскую цепь с множеством состояний Z = X X S (где S — множество возможных уровней запаса — должне быть таким, чтобы s — (s — х)' <= S для любых seS,
314 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ х е X), матрицей переходных вероятностей р [Z, Z], где р [?, П = Р [х, х'] X б ((а @ - х'У = г') B8) и при переходе из состояния ? в состояние ?' возникают убытки с [5, ?'] = у (г) + Ф (a (?)) + г|> ((*' - а (g))+). B9) Изучение получившейся марковской цепи проводится обычным путем с помощью техники и понятий, описанных в предыдущих параграфах. Можно рассматривать эргоди- ческие классы цепи, вычислить на них стационарные рас- распределения, определить для каждого эргодического класса средние убытки на один шаг, а для каждого переходного состояния вектор вероятностей попадания в эти эргоди- ческие классы. Если вычесть средние убытки у из одношаговых убытков с [?, ?'], приносимых переходом из одного состояния в дру- другое, для измененных убытков 7' [?1 = 2С Р [?, а х с [?, ?'] -7, C0) мы получим возможность вычислить потенциалы v [?] = y IS1 + Р I?, 2] X v [Z], C1) характеризующие относительную «убыточность» тех или иных состояний цепи. Нас, однако, должно интересовать не такое описание, а оптимальное управление запасами. Здесь возможны две постановки задачи. При одной мы можем искать такую функцию a [Z], которой соответствуют минимальные сред- средние убытки за один шаг. При другой постановке, более характерной для способа рассуждений из предыдущей главы, мы можем управлять отрезком цепи ограниченной длины, меняя от шага к шагу управляющую функцию a [Z\. Эти постановки задачи различны и изучаются совершенно раз- различными методами, однако, разумеется, между ними имеется связь такого типа, как это было описано в § 3 гл. 6. Отметим еще, что при беглом взгляде на эти постановки задачи возникает два естественных (но несколько противо- противоположных по своему характеру) вопроса. Во-первых, когда в многошаговой постановке мы рассматриваем меняющиеся от шага к шагу функции управления, не может ли полу- получиться уменьшения ожидаемых затрат от учета предыстории
§ 4. ОБЩАЯ СХЕМЛ ПРОЦЕССА РЕШЕНИЯ 315 процесса? Ответ на этот вопрос отрицателен. Марковость процесса и рекуррентные свойства процессов динамического программирования оказываются здесь достаточными для того, чтобы можно было учитывать всю предысторию про- процесса заданием последнего состояния. Второй вопрос таков: если задание будущих спросов требует меньшей информации, чем последнее состояние процесса xt, нельзя ли ограничиться этой меньшей инфор- информацией? Например, нельзя ли вообще обойтись без этой информации в случае, когда спрос в последовательные про- промежутки времени образует независимые случайные вели- величины? А на этот вопрос следует ответить положительно. Мы требуем включения в состояние нашего управляемого процесса лишь той минимальной информации, которая позволяет описать вероятностные характеристики последую- последующего процесса, в том числе, конечно, и дальнейшее полу- получение самой этой минимальной информации. Ответ на оба эти вопроса будет дан в следующем пара- параграфе. § 4. Марковские и полумарковские процессы решения Здесь будет описан основной объект этой главы — управ- управляемый случайный процесс или процесс решения. Основой для определений будет марковская цепь или некоторое обобщение марковской цепи — цепь со случайными про- должительностями переходов из состояния в состояние. Такое обобщение называется обычно полумарковским про- процессом. Будет рассматриваться процесс с множеством состояний М. Каждому состоянию t e M сопоставлено непустое мно- множество управлений NL, доступных в этом состоянии. Каж- Каждому и (= Ni ставится в соответствие распределение вероят- вероятностей [хи на множестве М х R+ x R1, где R1 — веществен- вещественная прямая, a R+ — положительный луч. Предполагается, что при выборе управления и некоторый случайный меха- механизм, независимый от предыстории процесса, выбирает в соответствии с распределением \х,а случайную тройку (к, х, у), где к еМ — новое состояние процесса, т > 0 — продолжительность перехода из ( в* #, у — доход, получае- получаемый при этом переходе.
316 ГЛ. 7. МАРКОВСКИЕ ПР0Ц1ХСЫ РЕШЕНИЯ Математическое ожидание по ци будет обозначаться через Ец. Таким образом, си = Ел и 4 = Еат C2) обозначают соответственно математическое ожидание полу- получаемого при управлении и дохода и продолжительности перехода ,в следующее состояние. Функционирует этот процесс следующим образом: в на- начальном состоянии i0 выбирается управление и0 <= Nio. В соответствии с распределением [х„0 находится тройка , (г1; tl, с1), выбирается щ е Nilt находится в соответствии с [i,u тройка (г2, f2, с2) и т. д., пока процесс не оборвется в каком-либо состоянии ip. Получающаяся траектория может быть представлена списком где элемент списка rk состоит из состояния ik, управления uk и чисел tk и с*. Число р будет называться длиной траектории и обозначаться через Igh (r). Определенный таким образом процесс называется полу- полумарковским процессом решения, а в случае т = 1 при всех и— марковским процессом решения. Нас будут интересовать задачи выбора управления, при- приносящего наибольший ожидаемый доход. Определения по- понятия «управление» могут быть в этой схеме весьма раз- различными. Наиболее общий способ задания управления состоит в том, что управление определяется как функция и (г), заданная на всех конечных траекториях г. Пусть / (г) — последнее состояние траетории г. Если для всех г выпол- выполняется и (с) — ЛЛ(Г), функция и называется детерминиро- детерминированной решающей функцией (или просто решающей функ- функцией), если же значением х (г) является распределение вероятностей на ЛЛ/ф она называется рандомизированной решающей функцией (от английского random — случайный. Использование рандомизированных функций решения пред- предполагает, что лицо, принимающее решение, выбирает не кон- конкретное решение, а распределение вероятностей, в соответ- соответствии с которым некоторый независимый случайный меха- механизм — рандомизатор — уже и выбирает конкретное ре- решение).
§ 4. ОБЩАЯ СХЕМА ПРОЦЕССА РЕШЕНИЯ 317 Решающая функция общего вида — даже детерминиро- детерминированная — это чрезвычайно громоздкая конструкция. Есте- Естественно возникает желание рассмотреть более простые функции от траекторий, ограничиваясь некоторой рекур- рентно вычисляемой информацией о предыстории процесса. Отметим, что каждую траекторию г можно представить (если только длина траектории больше 0) в виде траекто- траектории на единицу меньшей длины и записи, состоящей из последнего управления, последнего полученного дохода, последней продолжительности перехода и последнего со- состояния г = (r#, tip (r)), tip (с) = (Я, t, с, I). C3) Естественно, при этом п е / (с'). Назовем функцию траектории ф (с) марковской стати- статистикой х) траектории, если ср (t) = х\> (ф (г'), tip (r)). C4) Примерами марковских статистик могут служить: длина траектории, последнее состояние процесса / (v), пара послед- последних состояний / (г), / (г'), накопленные суммы t (г) и с (г) величин /' и с' па траектории г. Можно упростить решающую функцию, потребовав, чтобы она зависела только от некоторой марковской ста- статистики траектории. Мы будем называть такие решающие функции марковскими решающими функциями. Ограничи- Ограничиваясь каким-либо классом решающих функций, мы сужаем задачу и, вообще говоря, уменьшаем максимум целевой функции. Будем говорить, что марковская статистика ср (с) является марковской достаточной статистикой для не- некоторого класса экстремальных задач, если в любой из этих задач сужение множества решающих функций до мар- марковских решающих функций, зависящих от ф (г), не умень- уменьшает максимума целевой функции. Как правило, в конкретных классах задач удается ука- указать марковскую достаточную статистику, и эта статистика обычно выглядит очень просто. Рассмотрим в качестве при- примера следующую задачу. 1) В математической статистике функция от наблюдении называется статистикой. Нам естественно использовать здесь эту терминологию, так как теория решающих функций первоначально возникла как раздел математической статистики.
318 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ Максимизация дохода на траекто- траекториях фиксированной длины. Найти решающую функцию, при которой математи- математическое ожидание дохода на траекториях длины п, начи- начинающихся из состояния г0, будет максимальным, Мы будем, естественно, рассматривать эту задачу с раз- различными п и /0. Теорема 4. Марковской достаточной статистикой в задаче максимизации дохода на траекториях фиксирован- фиксированной длины является пара (/„, п — Igh (r)). Доказательство. Возьмем какую-либо решаю- решающую функцию и (для простоты детерминированную; рассуж- рассуждения с рандомизированными решающими функциями про- проводятся так же, но более громоздки) и будем последова"- тельно превращать эту функцию в марковскую решающую функцию, не уменьшая при этом ожидаемого дохода. Вна- Вначале для любого состояния i e M обозначим через п (i) то управление из Nh на котором достигается максимум ожидаемого дохода 1и (см. C2)). Пусть ut — решающая функция, совпадающая с и при Igh (г) < п и равная п (/(г)) при Igh (г) = п. Так как доход с (г) на траектории г является марковской статистикой и с (v) = с (г') + с, то, обозначив через Е„ математическое ожидание функции от траектории, получающейся при использовании решающей функции и, мы получим Е„с (г) = Е„с (г') + Е„ с= ¦ = Е«с (г') + vteA(P/, (/ (г') = О X Е„ (у I / (г') = 0 ^ < Е„с <г') + ЯъмРа (/ (г') = 0 + cj,o = EHlc (с). C5) Таким образом, при отыскании оптимального управления можно ограничиться решающими функциями, значения ко- которых на последнем шаге процесса зависят от / (г). Предположим, что для некоторого k мы уже установили, что при отыскании оптимального управления можно огра- ничться решающими функциями, которые на траекториях г, Igh (с) ^ п — k принимают значения, зависящие только от / (с) и п. — Igh (v). Обозначим через vk (г) максимум математического ожи- ожидания дохода на /г-шаговой траектории, начинающейся из
§ 5. ФУНКЦИОНАЛЬНЫЙ УРАВНЕНИЯ БЕЛЛМАНА 319 i e M, и определим пк (г) как управление, на котором дости- достигается максимум, max {са + Euvk (х) \ и е= N{}. . C6) Траекторию г можно представить в виде (я — &)-шагового начала xik) и /е-шагового продолжения г(А). По предполо- предположению, Е„с (г) < Еис (r<*>) -f vk {/ (г<">)). Отщепляя, как в C4), последний элемент траектории г(А), мы получим Е„с (г) ^ Е„с (rft+1) + yft+1 (/ (r*+1)), и, следовательно, максимум дохода можно искать на решаю- решающих функциях, которые на траекториях с Igh (х) = п — k—1 совпадают с uk (i). Это завершает индуктивный переход, а. Такими же рассуждениями можно показать, что при суммарном ограничении на продолжительность процесса марковской достаточной статистикой будет пара (?, /). где / — остаточная продолжительность, а при движении до попадания в поглощающее состояние марковская достаточ- достаточная статистика состоит из одного лишь последнего состояния траектории i, и, следовательно, можно искать оптимальную решающую функцию в классе'стационарных политик. § 5. Функциональные уравнения и рекуррентные соотношения Беллмана для марковских процессов решения Введенные при доказательстве теоремы 4 функции vk (i) являются аналогами потенциалов, которые встречались нам при изучении детерминированных процессов динамического программирования. Из C6) легко следует, что v (ik) удовле- удовлетворяют рекуррентному соотношению Беллмана vk (i) = max {с„ + Ел_г (к) \ и <= N,}. C7) Мы будем здесь рассматривать случай бесконечных траекторий, предполагая, что будут сделаны ограничения, при которых доход на траектории остается конечным. Если обозначить максимум математического ожидания дохода на траекториях, начинающихся из i, через v (г), естественно
320 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ ожидать, что о (i) будет удовлетворять уравнению Беллмана, являющемуся пределом соотношений C7) v @ = max {cu + Euv (%) | и е= /V,}. C8) Теорема 5. Если существует v (М) = lim uA (M), то k—>oo v (M) удовлетворяет уравнению Беллмана C8). Доказательство. Так как решающих функций и [М] имеется лишь конечное число, то найдется решающая функция и [М], на которой максимум в C7) достигается при бесконечном числе значений к. Переходя к пределу по этим к, получаем v @ = спщ + E«[t| v (K) < max (с« + Е« v (*) I " е ^}- Вместе с тем, прямо переходя в C7) к пределу, имеем v (г) > max {с„ -~ Е„ v (х) | и е 7V?}, откуда и следует, утверждение теоремы, л В этом параграфе мы будем рассматривать вопрос о су- существовании и единственности решения уравнения C7). Однако прежде, чем будет сформулирован основной резуль- результат, мы обсудим, какие условия следует наложить на про- процесс, чтобы математическое ожидание дохода было конечным. Очевидно, что ни при каком управлении не должны появляться эргодические классы с положительным средним доходом. Действительно, при таком управлении система уравнений для потенциалов не имеет решения, а уравне- уравнение C7) и подавно. Вместе с тем должна быть возможность перейти из любого состояния в эргодический класс с нуле- нулевым средним доходом. Эти условия проще формулировать, если привести на- нахождение эргодических классов с максимальным средним доходом к экстремальной задаче. Введем предварительно еще одно определение. Назовем подпроцессом рассматриваемого марковского процесса такое множество состояний. М'сМ, что для любо- любого «е N (М') = U i<=M'Nt с вероятностью 1 состояние у. е М'. Оптимальный стационарный режим для подпроцесса. Пусть задан подпроцесс М' — М. Положим N' = = N (М'), р[и, /] = E,,6(x = i). Требуется найти вектор,
§ 5. ФУНКЦИОНАЛЬНЫЕ УРАВНЕНИЯ БР.ЛЛМЛНА 321 удовлетворяющий условиям х W] > О IN], I W) х х W'} = 1, C9) х [N,] X 1 [Nt] = х \N'\ X р №, i] D0) и максимизирующий c[N'] X *[ЛП. D1) Прежде всего опишем в естественных для марковских цепей терминах, что представляет собой базисное решение этой задачи. Пусть х [N'] — допустимое решение задачи, т. е. вероятностный вектор удовлетворяющий условию D0). Поставим в соответствие этому решению граф переходов (M\N+), где М* = {I | i 6= М', 1 [N,] х х Wt] > 0}, Л^+ = Ш, j) I I, / s М', л; [Л',1 х р [Nlt }] > 0}. ( ) Назовем допустимое решение элементарным, если этот граф вполне связен и для любого i e М+ ровно одна из компонент х [Nt] положительна. Элементарному решению естественно сопоставляется сто- стохастическая матрица q Ш+ М+], где q И, М+) = р [п,, М+|, D3) a Hi — то управление из Niv для которого х \щ\ > 0. Из свойств элементарного решения следует, что этой мат- матрице соответствует единственный эргодический класс М' а ЛГ и, следовательно, существует однозначно опре- определяемый вектор стационарных вероятностей я Ш ] > 0 Ш']. Отметим, что условие D0) принимает для элементарного решения вид х [щ] = Ц/ем'Х [Щ\ X р [Щ, г], D4) и, следовательно, векторы я Ш'\ и х [N'\ связаны равен- равенством я Ш = х [fl,], i e M'. • D5) Таким образом, каждое элементарное решение определяет некоторый эргодический класс некоторой марковской цепи, причем средний доход в этом эргодическом классе равен 11 И. В. Романовский
322 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ значению целевой функции D1) на соответствующем эле- элементарном решении. Теорема 6. Пусть х W] — допустимое решение за- задачи C9)—D1). Для того чтобы оно было базисным, необхо- необходимо и достаточно, чтобы оно было элементарным. Доказательство. Достаточность. Пусть элементарное допустимое решение х [N'\ представимо в виде выпуклой комбинации двух допустимых решений х W'] = - X Xl W] + ~ х х% W]. Граф, соответствующий решению х,- [N], обозначим через (М,, Ni). Очевидно, Nf cz N+, i = 1, 2, M\ U Mi = M+. Предположим, что нашлась вершина I^ M+\Mt. He умаляя общности, можно считать, что в графе (М+, N+) найдется дуга с концом I и началом i1 e М[. В векторе х [NiJ была отлична от нуля лишь компонента х [и,-,], которая в векторе *,-, [Л^,,] равна нулю, так как I <ф Mi. Следовательно, хх [iV,-J x I [jV,-J = 0, что, однако, противоречит определению Mi'. Таким образом, М{ = Ml = M+, а значит, N\ = Ni = = ,/V+. Множества М+ и N+ однозначно определяют решение х [N'] в силу отмеченной связи элементарных решений с эргодическими классами, и, следовательно, решения хх IN'] и х2 [N'] совпадают с х [N']. Необходимость. Пусть х [N'] — допустимое ре- решение. Если граф (М+, N+) не является вполне связным, то, как легко видеть, он разбивается на несколько компо- компонент связности. В этом случае можно каждой из компонент связности (Ма, А/ц) сопоставить допустимое решение ха Ш'] Ха [N'] = са X б (и <= Na) х х IN'], и исходное решение х [N'] будет выпуклой комбинацией решений ха IN']. Предположим теперь, что граф (М+, N+) вполне связен, но в некоторых из векторов х [Ni] больше одной компоненты отлично от нуля. Зафиксируем для каждого i e М+ какое-то управление п (i) такое, что х [п (i)] > 0. Рассмотрим сто- стохастическую матрицу q [M+,M+], где q U, /] = Р [й @, /1. Возьмем какой-либо из эргодических классов получив- получившейся цепи Ма, найдем соответствующий ему вектор ста-
§ 5. ФУНКЦИОНАЛЬНЫЕ УРАВНЕНИЯ БЕЛЛМАНА 323 ционарных вероятностей ла Ш+] и определим вектор ха IN'], полагая ха [й @1 = яа Ш, i <= Ма, а остальные компоненты считая нулевыми. Легко видеть, что ха [и] > 0 => х [и] > 0 и вектор ха W] допустим. Следовательно, х [N'] предста- представим в виде выпуклой комбинации ха IN'] и некоторого другого допустимого вектора, а Обозначим теперь для простоты максимум целевой функции в задаче C9)—D1) через у (М'). Теорема 7. Для того чтобы уравнение C7) имело решение, необходимо и достаточно, чтобы у (ЛГ) = 0 для любого процесса М'. Доказательство. Необходимость. Пусть система имеет решение v [М] и п Ш] — политика, составленная из управлений, на которых достигается мак- максимум в C7). Рассмотрим какой-либо подпроцесс М'. По определению подпроцесса матрица р \М', М'\, состав- составленная для политики п [М] по формуле D3), является стохастической. Пусть л Ш'] — вектор стационарных ве- вероятностей для какого-либо эргодического класса этой матрицы. Умножая систему C7) на я [М'\, получим я [ЛГ] X V \М'\ = Ьел*'Я Ш X спщ + + Ste«- " til х Р & ft], АЛ X v [М'\ или 2^„, я Ш х с-т = 0. Вектору я [М'] соответствует (ср. D5)) допустимое реше- решение х [N1] для подпроцесса М' и, следовательно, у Ш'] > 0. Рассмотрим теперь оптимальное базисное (и, следова- следовательно, элементарное) решение х IN'] задачи C9)—D5) для подпроцесса М' и соответствующую ему «частичную поли- политику» п Ш']. Из C7) мы имеем vli]>ckl] + p[u[i],M'] X v\M'X и, следовательно, v Ш'] х х [и [М'\] > у (М') + v [М'1 х % [й [Л1']]( откуда следует у {М') =^ 0, 11*
324 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ Достаточность. Прежде всего отметим, что си- система gli]>cu + р[и, М'\ X g[M'], u<=Ni, i^M' имеет решение. Действительно, если бы она не имела ре- решений, то, используя теорему отделимости (теорема 3 гл. 2), мы убедились бы в существовании неотрицательного вектора 2 W], для которого г [Ni] X 1 [Ni\ - г [N') х р [ЛГ, i] = О, и е Nit i e M', с W] X z IN'l > О, что противоречит предположению теоремы. Последовательность функций {fk [M]}, в которой /о Ш] = g Ш], D6) /* [i] = max {с [и] + р [и,-М] х /ft_! [M] | u e Л^,}, очевидно, невозрастающие (ср. рассуждения § 4 гл. 6). Покажем, что эта последовательность сходится к решению уравнения C7). Достаточно убедиться в том, что последо- последовательность имеет нижнюю границу. Мы построим эту границу, последовательно решая за- задачи C9)—D1). Прежде всего найдем оптимальное базисное решение этой задачи для М' = М. Это решение определя- определяется множеством «активных состояний» Т и набором управ- управлений п [Т]. Если в множестве М \ Т найдется подпроцесс М', повторим для него решение задачи C9)—D1), найдем новое множество активных состояний 7" а М' и б IT'], добавим Г' к Г и повторим действия, перечисленные в этом абзаце. В конце концов мы придем к некоторому Т а М, на котором определен набор управлений й [Т], причем мно- множество М \ Т подпроцессов уже не содержит. Доопределим набор управлений it [T] до политики п [М], выбрав на М \ Т произвольные управления, при которых с вероят- вероятностью 1 процесс попадал бы в Т. Политика й [М] опре- определяет стохастическую матрицу q Ш, М], для которой Т — объединение зргодических классов (в каждом из ко- которых средний доход равен 0). Система Л Ш] = с [п 1М]\ + q[M,M] х h [M] D7)
§ 6. АСИМПТОТИКА РЕКУРРЕНТНЫХ СООТНОШЕНИЙ 325 разрешима. (Она разрешима с точностью до произвольного слагаемого в каждом эргодическом классе. Для переходных состояний при известных решениях на эргодических клас- классах решение вычисляется однозначно.) Выберем h [M] так, чтобы g [M] ^ h [M]. Тогда для любого к мы получаем fk [М] ^ h [M]. А Следствие 1. Если на множестве М задан квази- порядок и из каждого состояния i возможен переход лишь в состояния, строго следующие за i, причем последним является поглощающее состояние i+, то уравнение C7) имеет решение. Следствие 2. Если существует такое f> > 0, что для каждого и е Nt, ieiM, справедливо неравенство р \и, t+] > р\ то уравнение C7) имеет решение. Легко видеть, что в каждом из этих случаев {г+} пред- представляет собой единственно возможный эргодическии класс. § 6. Асимптотика рекуррентных соотношений В этом параграфе мы вкратце опишем, что происходит, когда условие теоремы 7 не выполняется и функции C7) не сходятся к пределу. Последнее вполне естественно, — когда средний доход за один шаг отличен от нуля, ожидае- ожидаемый доход за п шагов должен линейно (или приблизительно линейно) изменяться с ростом п. Коэффициент этого ли- линейного роста в случае, когда процесс может состоять из нескольких подпроцессов, может быть различным для раз- различных состояний. Если зафиксировать какую-либо политику п \М], то этой политике будет соответствовать стохастическая мат- матрица q \М, М] и вектор доходов с [М], которым по формуле A2) будет сопоставлен вектор математических ожиданий среднего дохода на траектории у-и [М]. Для каждого состоя- состояния i e M можно ставить задачу нахождения наилучшей политики — той, при которой достигается максимум уи Ш. Оказывается, что существует политика й Ш], которая до- доставляет максимум одновременно всем уи [i], i e M. Построение такой политики аналогично тому, как строи- строилась политика п при доказательстве достаточности в тео- теореме 7, хотя здесь и появляются некоторые дополнительные сложности.
326 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ На каждом шаге процесса мы будем иметь множество состояний 7, для которых выбрано управление и (хотя и не окончательно) и множество состояний М \ 7, для которых управление предстоит выбрать. Предположим, что в множестве М \ 7 найдутся подпроцессы. Отбрасывая у всех состояний М \ 7 те управления, которые с поло- положительной вероятностью переводят в 7, мы получим мак- максимальный подпроцесс, содержащийся в М \ 7 и сможем найти для него оптимальную стационарную политику на одном из его эргодических классов Т". Положив S = 7" U Т и определив на 7" политику й, мы не можем еще закончить один шаг построения политики, так как добавление 7' может разрушить построенные ранее эргодические классы. На множестве S определена функция у IS] максимальных ожидаемых средних доходов на траекториях. Доопределим вектор у, положив у [г] = —оо для i е М \ S, и рассмотрим последовательность ук Ш] у" Ш = max {Ел* М | и <= #,-}, D8) / \М] = [mi Наличие бесконечных значений не мешает нашим рассмот- рассмотрениям — каждое у можно считать нарой, состоящей из коэффициента при —оо и обычного вещественного числа, как мы это уже делали многократно раньше. Последовательность ук, очевидно, — неубывающая и ограниченная. Поэтому она сходится к пределу у. Обозна- Обозначим через Т множество индексов, для которых у \i] прини- принимает конечные значения, а через й [7] — управления, на которых достигается максимум в уравнении Y Ш = max {Е„у М | и е= Nt}, i <= Т. D9) Очевидно, что 7 =э S. Так определенные 7 и п [7] и при- принимаются при 7 ф М в качестве исходной информации следующего шага. При начальном 7 = ф мы придем к 7 = М за конечное число шагов, так как множество 7 будет на каждом шаге монотонно увеличиваться. Существование подпроцессов в М \ 7 следует из того, что в этом множестве есть состоя- состояния, из которых ни при каком управлении нельзя добраться
§ fi. АСИМПТОТИКА РЕКУРРЕНТНЫХ СООТНОШЕНИЙ 327 до Т, так как иначе мы смогли бы добиться для этих состоя- состояний конечных значений у [i]. Теорема 8. Политика п [М], получаемая при опи- описанном выше процессе, доставляет максимум одновременно всем уа [i], i e M. Доказательство. Обозначим через у [М] век- вектор, соответствующий и, а через у [М] — вектор макси- максимальных средних доходов. Очевидно, что у [М\ ^ у [М]. Предположим, что у [М] ф у [М]. Пусть i0 — состояние, на котором достигается максимум у \i] — у U] = X. Обозна- Обозначим через «0 1М] политику, при которой достигается макси- максимум уи li0]. Для любого состояния i мы имеем Т«„ Ш — V [*] = ЕИо(оУи. М — max {Е„у М | ы <= Л^,} ss < ЕНо(О (Т«о 1^1 — Y М) < Е«.(/) (У М — У М) < < max (у [/] — y 1/1 I Р [«о (О, Л > 0}- Следовательно, из /0 можно попасть в другое состояние, на котором достигается максимум разности у [i] — у [i] и Уи0 Ш = у U]. Отсюда легко следует, что множество состоя- состояний, на которых достигается максимум разности у — у, содержит эргодический класс. В этом эргодическом классе S, очевидно, у [г] = const и, следовательно, у [i] = const. Теперь мы легко придем к противоречию. При построе- построении политики п в тот момент, когда хотя бы одно из состоя- состояний S должно было включаться в Т, эргодический класс S обладал большим доходом, чем класс Т', добавляемый к Т, вопреки предположению об оптимальности добавляемого класса. А Свойство политики й, доставляющей одновременно мак- максимум всем переменным у„ [г], можно использовать для того, чтобы в единой задаче линейного программиро- программирования находить одновременно векторы у [М] и потенциа- потенциалы tllM Зададимся произвольным положительным вектором d [M] (не умаляя общности, будем считать его вероят- вероятностным) и рассмотрим задачу линейного программиро- программирования.
328 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ Задача об оптимальной системе по- показателей. Найти векторы g [АЛ и v [АЛ, удовлетворяющие усло- условиям g [i] > р [и, АЛ х g [АЛ, и е= #,, t e A/, E0) v [i] > с [и]— g [i] + р [и, АЛху [АЛ, и е N/, /е Af, E1) и минимизирующие d [АЛ X g [АЛ. Здесь у (АЛ — система потенциалов, g [i] — ожидаемый доход на единицу времени от траектории, начинающейся в состоянии /, d \i] можно считать вероятностью того, что началом траектории будет i, тогда целевая функция приобре- приобретает смысл оценки ожидаемого дохода. 'Двойственной к этой задаче является Задача об оптимальной стационар- стационарной политике. Найти векторы х [N] и у [N], удовлетворяющие усло- условиям х [Nt] х 1 Ш,) = х [N] x p [N, i], ieiH, E2) (x lNt) -i- у [N,]) X 1 [N,] = у IN) X p [N, i] -i- d [i], i e= M, E3) и максимизирующие с IN] X x IN]. Так как, просуммировав условия E3) по i e M и вос- воспользовавшись тем, что р IN, АЛ х 1 [АЛ = 1 [N], мы по- получим условие х [N] X 1 [N] = 1, то вектор х [N] удовле- удовлетворяет всем условиям задачи C9)—D1). В базисном реше- решении вектор х [N] задает в соответствии с формулой D5) вектор л [АЛ стационарных распределений эргодических классов стохастической матрицы D3). Вектор у [N] является аналогом вектора у [АЛ, введенного в § 1 и описывающего перевод начального распределения d [Af] в стационарное распределение л [АЛ. Как отмечалось в § 1, каждому d [АЛ можно сопоставить векторы л [АЛ и р [АЛ, что при фикси- фиксированной политике задает векторы х [N] и у [N], образую- образующие допустимое решение задачи E2), E3). Из этого факта следует, что оптимальное решение задачи E0), E1) является оптимальным одновременно для всех вероятностных векто- векторов d [АЛ.
§ 6. АСИМПТОТИКА РЕКУРРЕНТНЫХ СООТНОШЕНИЙ " 329 Теорема 9. Существует такое оптимальное реше- решение g* [M], v* \М\ задачи об оптимальной системе показа- показателей, что g* [M] удовлетворяет уравнению D9), a v* Ш] — уравнению v* Ш = max {с [и] + Euv* Ы | и <= Nt} — g* li], E4) причем максимум в E4) и в D9) достигается для каждого i е М на одном и том же щ. Поскольку о марковских процессах решения мы здесь говорим лишь для единства картины, доказательство этой теоремы не приводится. Решение и* [М] уравнения E4) может быть использовано для изучения асимптотического поведения функций vk Ш] из рекуррентного соотношения C7). Теорема 10. Пусть v* Ш] — решение уравнения E4). Существуют такие постоянные kx и k%, что одновременно для всех п > 0 справедливы неравенства kx < vn Ш — v* Ш — п х g* Ш < k2, i e M. E5) Доказательство. Выберем kx и k2 так, чтобы k, < v0 Ш - v* li] ^ k2. E6) Так как E4) можно переписать в виде v* li] + п х g* li] + k = = max {с [и] + Еи (v* [x] + (n — l)xg* Ы] + k) | и е Л/,}, то функции v* li] + п х g* li] + k при любом k удовлетво- удовлетворяют рекуррентному соотношению C7). Теперь осталось воспользоваться монотонностью оператора Беллмана (она была доказана для детерминированных процессов в гл. 6, перенос на случай марковских процессов решения труда не представляет). ^ Неравенство E5) дает возможность доказать теорему о магистрали и для вероятностных процессов. Разумеется, здесь утверждение теоремы существенно видоизменится. Зафиксируем решение g* Г/И], о* [М] задачи E0), E1), о котором говорится в теореме 9, и определим V [и] = v* Ш + g* li] ~ с [ы] - Е„у* М, и е= N,, i e M. E7) Рассмотрим аддитивную функцию от траектории процесса \F(r)—сумму Ч^м] по выбранным на траектории управлениям.
330 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ .Теорема 11. Существует такая постоянная k, что для любого п > 0 для оптимальной п-шаговой политики справедливо неравенство Ег ^ (г) < k. E8) Доказательство. Действительно, »*М = ЕгB,е1: „с [«,]). Пользуясь E7) и D9), после несложных преобразований имеем vk Ш = Ег B/е1. „ (о* U,l - Еир* М + g* tlt] - ? (и,))) = — ЕТ (г) ^ и* [t] + п х g* Ш - Е^ (г), что вместе с E5) и дает утверждение теоремы. ^ § 7. Методы нахождения оптимальной стационарной политики Здесь будет описано несколько методов, имеющих прин- принципиальное значение. Самым естественным подходом счи- считается «метод дисконтирования» — замена рекуррентного соотношения D9) соотношением и? [i] = max {с |и] + р х Ево|_, [х] | и е= N.}, i <= М, E9) где р е @, 1) достаточно близко к единице. Последователь- Последовательность {v& [М]\, очевидно, сходится к функции уР, удовлетво- удовлетворяющей уравнению г)Р [t] = max {с [и] + $ X Еиу& [х] | ы s Л?г}. F0) Для ОР справедливо следующее асимптотическое представ- представление. Теорема 12 (Д. Блекуэлл). При р -> 1 имеет место соотношение 5Р Ш - Щ + v* It] + О A - Р), F1) г5е у* [М] — решение уравнения E9), математическое ожи- ожидание которого на каждом эргодическом классе стохасти- стохастической матрицы, соответствующей оптимальной политике, равно 0.
§ 7. НАХОЖДЕНИЕ ОПТИМАЛЬНОЙ ПОЛИТИКИ 331 Доказательство этой теоремы требует иной техники и поэтому не приводится. При дополнительных предположениях об изучаемом процессе могут быть использованы и другие методы. Инте- Интересный метод был предложен Р. Ховардом. Предположим, что при любой политике изучаемый марковский процесс решения имеет один эргодический класс. В этом случае g* Ш] = Я х 1 Ш]. Метод Ховарда заключается в последовательном пере- пересчете политики и [М] и может быть описан так: 0. Выбрать (произвольно) политику и [М]. 1. Построить по политике и [М] стохастическую матрицу D3), вектор стационарных вероятностей ее эргодического класса, средний доход К и систему потенциалов v [M]. 2. Для каждого i е М найти п Ш е Nh на котором достигается max {с [и] + Euv [к] — А. — и [i] I u e= W,} = A [t] (если максимум достигается на и Ы, выбрать п li] = и U]. Отметим, что слагаемое — Я — v \i\ не влияет на выбор максимизирующего и, оно добавлено, чтобы А [/] было неотрицательным). 3. Если А[М]=т^0[М] (и, следовательно, п[М]ф ф и \МХ), положить п [М]: — и \М] и перейти к 1. В про- противном случае закончить процесс. Теорема 13 (Р. Ховард). Описанный процесс схо- сходится за конечное число шагов к оптимальной стационар- стационарной политике. Доказательство. Покажем, что на каждом шаге процесса не происходит уменьшения X. Действительно, пусть К и я Ш] — средний доход и стационарные вероят- вероятности, соответствующие политике п [М]. Тогда ] X (с [й [»]] —К) = = SteM-T Шх(о Ш — Е-[По [и] + А Ш) = л1М]Х A [Ml Так как на каждом шаге А Ш] ^ 0 Ш], то возможно лишь конечное число шагов, на которых значение X увеличивается. Для тех шагов, на которых К не увеличивается, мож- можно доказать увеличение вектора потенциалов v [M].
332 ГЛ. 7. МАРКОВСКИЕ ПРОЦЕССЫ РЕШЕНИЯ Действительно, если X = X, то v И] — v [i] = с [п Щ] — Х + E~[qv [х] — v [i] = = А Ш + Е-[П @ [х] — v [х]), т. е. разность О [М] — и Ш] является потенциалом заряда AIM] и, следовательно, положительна: v[M]<v{M]. Поэтому возврат процесса к встречавшейся ранее политике и \М\ невозможен, и процесс сходится за конечное число шагов Результатом является политика й [М], для которой существуют такие X и v [M], что v U] + X = max {с [и] + Eav [к] | м е N,} = = с fu [/]] + Еттд [к], F2) и, следовательно, й [М] — оптимальная стационарная по- политика. А Метод Ховарда можно рассматривать как разновидность блочного метода для решения задачи линейного программи- программирования C9)—D1), в которой C9) является соединяющей полосой, а D0) — своеобразные блоки. С другой стороны, его можно рассматривать и как ва- вариант метода приближений в пространстве поведений, опи- описанного в § 4 гл. 6, в котором уравнение C5) решается за- заново для каждой следующей политики. Нужно, однако, иметь в виду, что этот интересный метод при большом числе состояний процесса оказывается весьма трудоемким, так как требует на каждой итерации решения двух ли- линейных систем размерности \ М\. При еще более жестких ограничениях на процесс можно обойтись следующим более простым вариантом метода последовательных приближений. Пусть ©/г = min {и& [t] | i e M}, wk [M] = vk [M] — ak x 1 [M]. F3) Очевидно, можно вести вычисления прямо для {wk}, каждый раз «опуская» wk Ш) до нуля, т. е. вычитая Xk = coft — co^ из wk U]. Теорема 14. Если существует такое j e M и такое е > 0, что для всех и е N справедливо неравенство ри [/] ^ е, то последовательность {Xk} сходится к X, а последователь- последовательность {wk} — к функции v [M], удовлетворяющей уравне- уравнению E8).
§ 7. НАХОЖДЕНИЕ ОПТИМАЛЬНОЙ ПОЛИТИКИ 333 Доказательство. Пусть р (х Ш], у Ш]) = = max {х U] — у [f] | i <= M} — min {х [/] — у It] | i е M). Функция р (х, у) обладает тем свойством, что если ко всем компонентам х [М] или у [М] прибавить одно и то же число, значение р не изменится. Из р (х, у) = 0 следует х U] — — у [г] = const. Так как vk+i Ш — vk [i] < < е х (vk [/] — vk_x [/]) + A — e) x min {vk Ir] — vk_x [/•]} и vk+1 [i] — vk Щ ss S= e x (vk [/] — vk_t [/]) + A — e) x max {vk И — vk_x \r\), то P (vM Ш], vk IM]) < A - e) x p (о* [М], yft_x IM)) и, следовательно, P (fft+i. vk) < A — e)ft x p (ylt u0). Отсюда уже без труда следуют утверждения теоремы, а
БИБЛИОГРАФИЧЕСКИЕ УКАЗАНИЯ К предисловию Назовем здесь литературу по смежным вопросам, не вошедшим в эту книгу. По выпуклому программированию накопилась уже целая библиотека — книги Л. Д. Иоффе и В. М. Тихомирова [70], И. В. Гир- санова [41], Б. Н. Пшеничного [128], В. Г. Карманова [80], У. И. Занг- вилла [64] и др. Геометрические вопросы выпуклого программирования излагаются в книгах Р. Т. Рокафеллара [130], X. Никайдо[11б], С. С. Ку- тателадзе и А. М. Рубинова [92]. По теории оптимальных процессов могут быть названы книги Л. С. Понтрягина и др. J125], В. Г. Болтянского [20], Л. Янга [167]. Численным методом для непрерывных задач и оптимальных про- процессов посвящены книги Н. Н. Моисеева [112], В. Ф. Демьянова и А. М. Рубинова [56], Б. Н. Пшеничного и Ю. М. Данилина [129], Э. По- лака [122]. По экономическим моделям можно назвать лишь книги, посвя- посвященные различным проблемам моделирования. Так, общие принципы моделирования и использования линейного программирования в эконо- экономических моделях освещены в книге Л. В. Канторовича [75]. Матема- Математические вопросы анализа моделей рассматриваются в книгах Д. Гейла [40], М. Моришимы [113]. Обширный круг производственных моделей рассмотрен А. А. Первозванским [118]. Интересна и разнообразна по тематике книга С. Карлина [79]. Другие ссылки будут даны позднее при рассмотрении отдельных задач. По стохастическому программированию можно рекомендовать книги Ю- М. Ермольева 1621 и Д. Б. Юдина [164]. Задачи линейного программирования большого объема рассматривались в книге Л. С. Лэс- дона [101]. Вопросы регуляризации оптимизационных процедур хорошо освещаются в книге А. Н. Тихонова и В. Я- Арсенина [147]. О методах отсечения достаточно полная информация содержится в книге А. А. Кор- бута и Ю. Ю. Финкельштейна [86] и в недавно переведенной книге Т. С. Ху [159]. Некоторые информационные задачи и методы работы со сложной информацией описаны С. С. Лавровым и Л. И. Гончаровой [94]. К главе 1 § 1. Описанную здесь систему обозначений мы систематически ис- используем, начиная с 1970 г. Гораздо раньше подобные обозначения встре- встречались у К. Бержа [175], но Берж использовал традиционное написан- ние индексов, которое представляется неудобным при многократной индексации.
БИБЛИОГРАФИЧЕСКИЕ УКАЗАНИЯ 335 § 2. По языку алгол-60 имеется уже много первоклассных руко- руководств. Назовем здесь книги С. С. Лаврова [93] и А. Л. Брудно [24]. При некотором навыке работы с этим языком обязательным руковод- руководством ставится его официальное описание [5]. Кстати, в книге [24] де- детально описано «бумажное» выполнение алгольных программ. Идею выделения состояния вычислительного процесса мы почерп- почерпнули у Л. Л. Маркова [107]. § 3. Языки, использующие структурные записи, — это прежде всего Кобол, Симула [53], из более современных ПЛ/1 [57], Паскаль [232] и используемый нами здесь алгол-68 [6, 98, 119]. Расширение алгола-60, позволяющее работать с записями, предложено К- Хоором [158]. Применительно к фортрану работа со структурированными дан- данными описана в книге А. Берзтисса [19]. § 4. Недавно была переведена небольшая и простая книга Дж. Фос- тера [153], в которой описываются основные операции над списками и связанные с ними понятия. Дж. Айлиф [4] обсуждает эти операции в связи с рассмотрением подходов к построению вычислительных машин. Что касается алгола-68, то мы отсылаем читателя к книге [98], хотя имеющийся в ней материал несколько устарел (в книге есть пре- предупреждение о возможных изменениях). Мы следуем изменениям основ- основного текста [119]. К главе 2 § 1. Из книг — руководств по линейному программированию следует предже всего назвать книги Дж. Данцига [54], Д. Б. Юдина и Е. Г. Гольштейна [165], М. Симонара [229]. Четкое сжатое изложение необходимых сведений имеется в первой части книги К. Бержа и А. Гуй- ла-Ури [177]. Вычислительному аспекту линейного программирования посвящена книга В. Орчард-Хейса [221]. § 2. Термины «стандартная» и «каноническая» применительно к задачам линейного программирования систематически перепутываются. Так, в русском переводе книги Т. Ху [159] и в ее английском оригинале они введены в точности противоположным образом. Рассмотрение эквивалентных преобразований часто встречается в руководствах по оптимальному программированию, начиная с обзор- обзорной статьи А. Дж. Голдмана и А. У. Таккера [421. Нам представляется очень важным систематическое использование понятия «расширение экстремальной задачи». § 3. В сборнике [99] имеется несколько превосходных статей, по- посвященных истолкованию двойственности с точки зрения геометрии и линейной алгебры. Интересное простое доказательство теоремы двойственности есть в учебнике А. Г. Пинскера и Э. Ф. Брызжиной [121]. § 4. Вопрос о крайних точках выпуклых множеств, — естественно, геометрический. Мы отсылаем читателя за большими подробностями к сборнику [991, к книгам С. Карлина [79] и Рокафеллара [130]. Чрезвычайно интересен вопрос о крайних точках выпуклых мно- множеств в функциональных пространствах. По этому поводу, кроме [70, 116], можно рекомендовать книги М. Г. Крейна и А. А. Нудельмана [90], К. Иосиды [69], Р. Фелпса [151], В. Н. Судакова [143] и обзорную статью В. И. Аркина и В. Л. Левина [12].
336 БИБЛИОГРАФИЧЕСКИЕ УКАЗАНИЯ Принятая сейчас схема изложения метода последовательных улуч- улучшений в терминах линейных систем восходит к работе Л. В. Канторо вича [72]. Из -методов, не использующих базисных решений, можно реко- рекомендовать методы В. А. Булавского [28], Л. М. Брэгмана [26], Э. П. Бо- Борисовой [21], Б. И. Коробочкина [88], Б. Т. Поляка и Н. В. Третьякова [1231 Альтернатива методам линейного программирования предлагается и в уже называвшейся книге Н. Н. Моисеева [112]. § 5. Подробная библиография по устранению зацикливания и при- примеры зацикливающихся задач имеются у Данцига [54]. § 6. К настоящему времени издано уже много алгоритмов линей- линейного программирования [13, 49, 87, 105, 127], обзоров по программам [106, 210, 212], описаний пакетов и специальных языков для решения задач линейного программирования [27, 45]. Сравнительно редко в руководствах встречается мультипликатив- мультипликативный метод. Следует назвать здесь книгу Г. Зойтендейка [65], в которой этот метод был изложен впервые, а также Л. Лэсдона [101]. ^[.(/-представление и его использование описаны в работах Р. X. Бар- тельса и Г. X. Голуба 1172], Дж. Форреста и Дж. Томлина [193, 231]. LT-представление предложено В. А. Булавским [30]. Программа на алголе-60 для этого метода опубликована в [142]. Методы, использующие особую структуру обратной матрицы в блоч- блочных задачах, развивались новосибирской школой. Подробную библио- библиографию можно найти в [31]. Метод генерирования столбцов уже давно культивируется в совет- советских работах. Отметим работу Л. В. Канторовича -и В. А. Залгаллера ([77], 1-е изд. 1951), в которой даны различные постановки задачи раскроя и обширная литература по этому вопросу. В работе [9] тот же метод был предложен для решения задачи маршрутизации автомобильных перевозок (см. также [10]). По существу методом гене- генерирования столбцов является метод Келли для задач выпуклого про- программирования ([207], см. также [80]). Метод разложения Данцига — Вулфа изложен в [54] (см. также 144]). Некоторые новые приложения метода генерирования столбцов описаны в [81. К главе 3 § 1. В этой главе и последующем изложении существенно исполь- использованы книги К. Бержа [18] и [177]. Для более подробного ознакомле- ознакомления с теорией графов и различными ее приложениями можно рекомен- рекомендовать книги [15, 66, 84, 117]. Имеется несколько книг специально по задачам транспортного типа, из которых мы отметим особо книги Е. Г. Гольштейна и Д. Б Юдина [44], Ю. М. Ермольева и И. М. Мельника [63], Е. П. Нестерова [115], Е. Б. Триуса 1149]. § 3 и 4. Здесь мы следуем [18]. Много интересных задач, связанных с перечислениями деревьев, можно найти, например, у Басакера и Саати [15]. § 5. Первая известная постановка транспортной задачи принадле- принадлежит советскому экономисту А. Толстому [148]. Первые математические исследования Л. В. Канторовича иМ. К- Гавурина [76] касались именно сетевой постановки задачи и интересного непрерывного ее аналога
БИБЛИОГРАФИЧЕСКИЕ УКАЗАНИЯ 337 [731, который был предложен еще Г. Монжем [217] и исследовался П. Ап- пелем |168] и Л. В. Канторовичем [74]. Дальнейшие исследования, свя- связанные с непрерывным аналогом транспортной задачи, см. в книге В. Фридриха [195]. Интересный метод приближенного решения тран- транспортной задачи был предложен Ю. Шацким и Г. В. Шелейховским. Математическое изложение этого метода и доказательство сходимости имеется в [25]. § 6. Здесь мы также почти полностью следуем [18]. § 7 и 8. Название «потенциал» в данном контексте было пред- предложено Л. В. Канторовичем [76, 73]. Идея использования подходящей нумерации элементов базиса предлагалась Л. Л. Брудно [22], а затем В. А. Булавским [29]. Дальнейшее совершенствование метода потенциалов проводилось, например, в работах К. В. Кима [85] и В. И. Шмырева [162]. § 9. О задаче с двусторонними ограничениями см. [44, 138, 131]. Задача о замкнутом потоке рассматривалась в [177] и в [135]. Двухкомпонентной задачей и ее вариантом — так называемой ^.-задачей (или обобщенной транспортной задачей) — занимались многие [39, 85, 104, 138, 162, 166]. К главе 4 § 1. Поиск контура в графе — обычная процедура сетевого пла- планирования [32, 120]. Интересное применение имеет эта процедура в задачах кодирования [58]. § 2. Алгоритм Беллмана — Шимбела описан в их статьях [174, 228], алгоритм Флойда в работе [192]. Другой вариант матричного метода, принадлежащий Г. Данцигу [184], приведен в интересном обзоре С. Дрейфуса [188]. См. также недавнюю статью [202]. Задачей о пути с максимальной пропускной способностью занимался М. Поллак [223]. § 3. По-видимому, первая работа о кратчайших путях в лабиринте была выполнена Э. Муром [218]. Обзоры работ в этой области см. в [188, 224]. Метод Дейкстры [186], следуя обзору [224], часто называли мето- методом Минти; некоторые другие эффективные реализации этого метода см. в [10]. Отметим еще метод Левита [97], который также оказался весьма эффективным в вычислительном отношении. § 4. Кроме работ [32, 120], можно назвать еще руководство [89]. Специфическим вопросам решения больших задач посвящены работы [160, 111]. В работе [135] рассмотрен циклический вариант модели сетевого графика. § 5. Исходными здесь являются работы Краскала [209] и Прима [126], см. также [186]. Задача о кратчайшем иерархическом дереве рассматривалась в [197] (там же указано еще несколько предшествовавших работ). Задача о кратчайших частичных деревьях для некоторых специаль- специальных случаев рассматривалась в книге И. Моцкуса [114], где имеется обширная библиография, ив работах С. Ю. Рудермана [139] и др. § 6. Многочисленные работы Л. Форда и Д. Фалкерсона в этой области собраны в их книге [152]. Из более поздних работ см. [2, 201]. Многопродуктовыми потоками па сети занимается Т. Ху [159]. См. также [2].
338 БИБЛИОГРАФИЧЕСКИЕ УКАЗАНИЯ § 7. В качестве первоисточника здесь следует назвать работы Д. Фалкерсона [196] и Дж. Келли [82]. Основные сведения о параметрических задачах линейного програм- программирования можно найти в [43], см. также недавно вышедшую моногра- монографию [220]. Как вариант схемы распределения ресурсов можно упомянуть еще нелинейную задачу распределения ресурсов [183, 103]. Задача распре- распределения ресурсов в циклическом варианте модели сетевого графика рассмотрена в [136]. § 8. Исходная статья Дилворта [187], первое применение линейного программирования, по-видимому, в [55]. Другое изложение в [157]. § 9. По-видимому, наилучшее изложение теории паросочетаний — в книге Бержа [18], где имеется вся необходимая библиография. Многомерные обобщения задачи о назначениях рассматривались в [222, 68]. Имеется интересный обзор проблематики, связанной с бистохасти- ческими матрицами, принадлежащий Л. Мирскому [216] (см. также [108]). § 10. Название «венгерский метод» появилось в статье Г. Куна [91], который ссылался на статью Эгсрвари [189]. Дальнейшее развитие метода проводилось в работах [219, 48]. § П. По поводу «систем различных представителей» имеется об- обширная литература [46, 225]. Основные факты, относящиеся к гипер- гиперграфам, собраны в книге К.. Бержа [176] и в обзоре А. А. Зыкова [67], топологические эквиваленты этих понятий вводятся в курсах по комби- комбинаторной топологии [7, 124]. Задачи линейного программирования с матрицами из нулей и еди- единиц рассматривались В. А. Трубиным [150], а также Э. Балашем [169]. Задача о порядке исключения переменных в связи с вычислительной реализацией мультипликативного метода рассматривалась в [11, 145, 227, 230]. Интересные задачи редукции комплекса рассматривал Н. Н. Во- Воробьев в связи с вопросом о продолжимости меры с данным набором проекций [36, 37]. К главе 5 § 1. Из многочисленных характеристических чисел графа мы выб- выбрали наиболее интересные, следуя [18]. Интересные экстремальные за- задачи другого типа возникают в связи с проблемами нумерации вершин графа 1191]. § 2. В настоящее время литература по задаче о коммивояжере так велика, что целесообразно упомянуть лишь обзор [38] и последние работы [182, 200]. § 3. Метод ветвей и границ был описан А. Лэнд и А. Дойг [211] и А. Л. Брудно [23] и получил широкое распространение после появле- появления работы [100]. См. обзоры [133, 154, 170, 198, 213]. Принцип сравнения ростков дерева развивался киевской школой, см. обзор [НО]. § 4. Задача о размыкании контуров излагается по [132]. Постанов- Постановку задачи о круговом расположении станков см. в [ 1], другие варианты в [146].
БИБЛИОГРАФИЧЕСКИЕ УКАЗАНИЯ 339 § 6. См. 177]. § 7. Многие ссылки на методы решения бивалентных задач имеются в обзорах |169] и [199]. См. также [50, 96, 135, 180]. § 8. Задачи размещения производства — важный и трудный класс многоэкстремальных задач. Здесь приведен лишь простейший вариант этой задачи, чтобы продемонстрировать еще одну эффективную вычисли- вычислительную схему (обзор белорусской школы в этом направлении имеется у В. А. Емеличева [60]). Другие постановки задач размещения и обзор методов см. в [52], библиографию иностранных работ в [194]. § 9. См. [81, 137, 208]. К главе 6 § 3. Исходные варианты схемы динамического программирования были разработаны Р. Беллманом [16]. Затем существенное развитие эти схемы получили в связи с теорией автоматов, см. [163, 190, 204, 206]. § 4. См. [ 16]. § 5. Здесь мы следуем работе [ 133]. По поводу теорем о магистрали для экономических процессов см. книги [113] и [102] и статью [214]. §7. См. [14]. § 8. По поводу задач поиска неисправности см. [95]. Приводимая здесь программа написана М. И. Фрейманом. § 9. Мы следуем схеме, разработанной Л. Б. Грибовым [47]. §11. Многочисленные работы по этой тематике собраны в моно- монографии Вертеле и Бриоши [178]. К главе 7 § 1. Литература по марковским цепям многочисленна и разнооб- разнообразна. В качестве достаточно простого источника назовем книгу [83]. § 2. Теория потенциалов для конечных марковских цепей излага- излагается по статье Г. Шоке и Ж- Дени [181]. Современное изложение теории потенциала в ее теоретико-вероят- теоретико-вероятностной трактовке см. в [109]. § 3. Управление запасами — тема, чрезвычайно популярная. Из недавней литературы можно рекомендовать книги [155, 141], а также [34, т. И]. § 4. Детальное изложение теории марковских и полумарковских процессов решения имеется в книгах [203, 185, 215]. Для начального ознакомления можно рекомендовать [156, 17, 34]. Понятие «решающая функция» восходит к А. Вальду [35], современ- современное изложение статистического последовательного анализа, имеющего много общего с теорией управляемых марковских процессов см. в книге А. Н. Ширяева [161]. § 5. См. [226]. § 6. См. [133]. Двойные системы этого параграфа вводились в [185, 215]. § 7. Книги Ховарда упоминались [156, 203]. Теорема Д. Блекуэлла доказана в [179], ссылки на другие работы Блекуэлла имеются в [59].
ЛИТЕРАТУРА 1. Абрамов Л. М., Голова В. П., Горькова К. А., Алго- Алгоритм решения задачи об оптимальном планировании оборудования.— В кн.: «Прим. матем. методов в экономике», вып. 4, Изд-во ЛГУ, 1967, 10—20. 2. Адельсон-Вельский Г. М., Диниц Е. А., К а р з а - н о в А. В., Потоковые алгоритмы. М., «Наука», 1975, 119 с. 3. А д е л ь с о н - В е л ь с к и й Г. М., Ф и д л е р Ф. М., Программа вычисления сетевых графиков. — ЖВМ и МФ, 1965, 5, 1, 144—148. 4. А й л и ф Дж., Принципы построения базовой машины. М., «Мир», 1973, 120 с. 5. Алгоритмический язык Алгол-60, пересмотренное сообщение, пер. с англ. М., «Мир», 1965, 79 с. 6. Алгоритмический язык Алгол-68. — Кибернетика, 1969, 6, 17— 144; 1970, 1, 13—160. 7. А л е к с а н д р о в П. С, Комбинаторная топология. М.— Л., 1947, 660 с. 8. А л е к с е е в А. М., Волконский В. А., Ш а п и р о А. Д., Методы оптимизации планов путей автоматического формирования плановых вариантов и их применение. — Экономика и матем. методы, 1973, 9, 1, 3—18. 9. АникеичА. А., Грибов А. Б., Романовский И. В., Об одной задаче маршрутизации перевозок. — Кибернетика, 1965, 1. 10. АникеичА. А., Г р и б о в А. Б., С у р и н С. С, Сменно-су- Сменно-суточное планирование работы грузовых автомобилей на ЭВМ. М., «Транспорт», 1976, 152 с. 11. Анисимов-СпиридоновД. Д., Метод линейных ветвле- ветвлений и некоторые его применения в оптимальном планировании. М., «Наука», 1964, 119 с. 12. А р к и н В. И., Левин В. Л., Выпуклость значений векторных интегралов, теоремы измеримого выбора и вариационные задачи. — УМН, 27, 3, 1972, 21—77. 13. А х м е т о в П. А., Программа мультипликативного алгоритма симплексного метода для решения общих задач линейного програм- программирования. — Стандартные программы. М., 1967 (ЦЭМИ). 14. Б а р л о у Р., П р о ш а н Ф., Математическая теория надежности. М., «Сов. радио», 1969, 488 с. 15. Б а с а к е р Р., С а а т и Г., Конечно графы и сети. М., «Наука», 1974 368 с. 16. Б е л л м а н Р., Динамическое программирование. М., ИЛ, 1960. 17. Б е л л м а н Р., Д р е й ф у с С, Прикладные задачи динамического программирования. М., «Наука», 1965, 458 с. 18. Б е р ж К., Теория графов и ее применения. М., ИЛ, 1962, 319 с.
ЛИТЕРАТУРА 341 19. Б е р з т и с с А. Т., Структуры данных. М., «Статистика», 1974. 20. Болтянский В. Г., Оптимальное управление дискретными системами. М., «Наука», 1973, 446 с. 21. Б о р и с о в а Э. П., Итеративные программы системы «Симплекс». — Программы и алгоритмы, вып. 38, ЦЭМИ, М., 1971, 99 с. 22. Б р у д н о А. Л., Решение транспортной задачи методом вычерки- вычеркивающей нумерации. — В кн. .-«Применение ЦВМ в экономике». М., Изд-во АН СССР, 1962, 17-38. 23. Б р у д н о А. Л., Грани и оценки для сокращения перебора вари- вариантов, Проблемы кибернетики, 1963, вып. 10, 141 —150. 24. Б р у д н о А. Л., Алгол, изд. 2-е. М., «Наука», 1971, 80 с. 25. Б р э г м а н Л. М-> Доказательство сходимости метода Г. В. Шелей- ховского для задачи с транспортными ограничениями. — ЖВМ и МФ, 1967, 7, 1, 147—156. 26. Б р э г м а н Л. М-, Релаксационный метод нахождения общей точки выпуклых множеств и его применение для решения задач выпук- выпуклого программирования. —ЖВМ и МФ, 1967, 7, 3, 620—631. 27. Б р э г м а н Л- М., и др., Пакет ЛП-ЛГУ для решения задач линейного программирования. — В кн.: «Исследование операций и статистическое моделирование, 3». Л., Изд-во ЛГУ, 1975, 3—64. 28. Б у л а в с к и й В. А., Итеративный метод решения задачи линей- линейного программирования. — Сиб. матем. ж., 1962, 3, 3, 313—332. 29. Б у л а в с к и й В. А., Об одном алгоритме решения транспортной задачи. Оптимальное планирование, 1964, 2, 41—49. 30. Б у л а в с к и й В. А., Метод ортогонализации в линейном прог- программировании. — Оптимизация, 1971, 1 A8), 134—157. 31. Булаве кий В. А., Звягина Р. А., Каплан А. А., Ш м ы р е в В. И-, Об исследованиях по численным методам мате- математического программирования. — Оптимизация, 1974, 13 C0). 32. Б у р к о в В. Н-, Л а н д а Б. Д., Ловецкий С, Б. и др., Сетевые модели и задачи управления. М., «Сов. радио», 1967, 144 с. 33. Бурков В. Н-, Л о в е ц к и й С. Б., Методы решения экстре- экстремальных комбинаторных задач. — Изв. АН СССР. Техн. киберне- кибернетика, 1968, 4, 82—93. 34. Вагнер Г., Основы исследования операций, т. 1 —3. М., «Мир», 1973. 35. В а л ь д А., Статистические решающие функции. — В кн.: «По- «Позиционные игры»- М., «Наука», 1967, 300—544. 36. ВоробьевН-Н., Согласованные семейства мер и их продолже- продолжения, Теор. вероятн. и ее прим., 1962, 7, 2, 153—169. 37. Воробьев Н- Н., Марковские меры и марковские продолжения. Теор. вероятн. и ее прим., 1963, 8, 4, 451—462. 38. Габович К-. Задача коммивояжера, I.—Тр. ВЦ Тартуского ун-та, 1970, вып. 19, 52—96. 39. Г а в у р и н М. К., Р у б и н ш т е й н Г. Ш., С у р и н С. С, Об оптимальном использовании средств при выполнении нескольких видов работ. — Сиб. матем. ж., 1962, 3, 4, 481—499. 40. Гей л Д., Теория линейных экономических моделей. М., ИЛ, 1963, 418 с. 41. Гире а нов И. В., Математическая теория экстремальных за- задач. М., Изд-во МГУ, 1970, 118 с. 42. Гол д м а н А. Дж-> Т а к к е р А. У., Теория линейного прог- программирования. — В кн. [99], 172—213.
342 ЛИТЕРАТУРА 43. Гол ьштейнЕ. Г.,Юд и н Д. Б., Новые направления в линей- линейном программировании. М., «Сов. радио», 1966, 524 с. 44. Г о л ь ш т е й и Е. Г., Ю д и н Д. Б., Залачи линейного програм- программирования транспортного типа. М., «Наука», 1969, 384 с. 45. Гончарова Л. И., Станевичус А.-И. А. ЛП-язык. — Алгоритмы и алгоритмические языки, вып. 5, М., Изд-во ВЦ АН СССР, 1971, 94—104. 46. Г о ф м а и А. Дж., К у и Г. У., О системах различных представи- представителей. — В кн. [99], 302—310. 47. Г р и б о в А. Б., Алгоритм решения задачи плоского раскроя. — Кибернетика, 1973, 6, 110—115. 48. Грибов А. Б., Программа для решения задачи о назначе- назначениях.— Алгол-процедуры, Изд-во ЛГУ, вып. 14, 10—11. 49. Г р и б о в А. Б., Романовский И. В., Программирование симплекс-метода и его вариантов на Алголе. — Оптимальное плани- планирование, 1969, вып. 12, 5—27. 50. Г р и ш у х и н В. П., Оценка сложности алгоритма Балаша.— В кн.: «Математические методы решения экстремальных задач», М., «Наука», 1972, 93—105. 51. Турин Л. С, Дымаре кий Я- С, Меркулов А. Д., Задачи и методы оптимального распределения ресурсов, М., «Сов. радио», 1968, 458 с. 52. Д а в ы д о в а И. М., Задачи размещения. — В кн.: «Исследование операций и статистическое моделирование, 4», Л., Изд-во ЛГУ, 1977. 53. Дал У.-И., МюрхаугБ., Нюгорд К., Симула 67, универ- универсальный язык программирования. М., «Мир», 1969, 100 с. 54. Данциг Дж. Б., Линейное программирование, его обобщение и применение. М., «Прогресс», 1966, 600 с. 55. Данциг Дж. Б., Г о ф м а и А. Дж., Теорема Дилворта о частич- частично упорядоченных множествах. — В кн. [99], 311—317. 56. Демьянов В. Ф., Рубинов А. М., Приближенные методы решения экстремальных задач. Л., Изд-во ЛГУ, 1968, 180 с. 57. Д ж е р м е й н К-, Программирование на IBM/360. M., «Мир», 1971, 870 с. 58. Дискретная математика и математические вопросы кибернетики т. I, под общ. ред. С. В. Яблонского и О. Б. Лупанова. М., «Наука», 1974, 312 с. 59. Еремин И. И., Астафьев Н. Н., Введение в теорию линейногои выпуклого програмирования. М., «Наука», 1976, 192 с. 60. Е м е л и ч е в В. А., Дискретная оптимизация. Последовательные схемы решения, I—П. — Кибернетика 6, 1971, 109—129; 2, 1972. 61. Еремин И. И., Мазуров Вл. Д., О нестационарных процессах математического программирования, — В кн.: «Нестационарные процессы математического программирования», Труды Ин-та мате- математики и механики УНЦ АН СССР, вып. 14, Свердловск, 1974. 62. Ермольев Ю. М., Методы стохастического программирования. М., «Наука», 1976, 240 с. 63. Ермольев Ю. М., Мельник И. М., Экстремальные задачи па графах. Киев, «Наукова думка», 1968, 176 с. 64. 3 а и г в и л л У. И., Нелинейное программирование. Единый подход. М., «Сов. радио», 1973, 311 с.
ЛИТЕРАТУРА 343 65. Зойтендейк Г., Методы возможных направлений. М., ИЛ, 1963, 176 с. 66. Зыков А. А., Теория конечных графов, I. Новосибирск, «Наука», 1969, 543 с. 67. Зыков А. А., Гиперграфы. — УМН, 1974, 29, 6, 89—154. 68. И в а н о в В. В., О трехиндексной задаче о назначениях. — Эко- Экономика и матем. методы, 1974, 10, 2, 336. 69. И ос и да К., Функциональный анализ. М., «Мир», 1967, 619 с. 70. Иоффе А. Д., Тихомиров В. М., Теория экстремальных задач. М., «Наука», 1974, 479 с. 71. Исследования по дискретной оптимизации. Сб. статей под ред. А. А. Фридмана. М., «Наука», 1976, 446 с. 72. К а н т о р о в и ч Л. В., Математические методы в организации и планировании производства. Л., Изд-во ЛГУ, 1939, 67 с. 73. Канторович Л. В., О перемещении масс. — ДАН СССР, 1942, 37, 7, 227—229. 74. К а н т о р о в и ч Л. В., Об одной задаче Монжа. УМН, 1948, 3, 2. 75. Канторович Л. В., Экономический расчет наилучшего ис- использования ресурсов. М., Изд-во АН СССР, 1959, 343 с. 76. К а н т о р о в и ч Л. В., Г а в у р и н М. К-, Применение матема- математических методов в вопросах анализа грузопотоков. — В кн.: «Про- «Проблемы повышения эффективности работы транспорта», М., Изд-во АН СССР, 1949, 110—138. 77. Канторович Л. В., За л га л л ер В. А., Рациональный раскрой промышленных материалов. Новосибирск, «Наука», 1971. 78 Канторович Л. В., Рубинштейн Г. Ш., Об одном функ- функциональном пространстве и некоторых экстремальных за'дачах. — ДАН СССР, 1957, 115, 6, 1058-1061. 79. К а р л и н С, Математические методы в теории игр, программиро- программировании и экономике. М., «Мир», 1964, 839 с. 80. К а р м а н о в В. Г., Математическое программирование. М., «Наука», 1975, 272 с. 81. К а ц е в С. Б., Р о м а н о в с к и й И. В., Две задачи целочислен- целочисленного программирования. Задача о распределении заданий. — Алгол- процедуры. Изд-во ЛГУ, 1975, 13, 18—23. 82. К е л л и Дж., Метод критического пути: распределение ресурсов и составление календарного плана работ: — В кн.: «Календарное планирование». М., 1963, 398—420. 83. Кемени Дж., Снелл Дж., Конечные цепи Маркова. М., «Наука», 1970, 272 с. 84. Кемени Дж., Снелл Дж., Томпсон Дж., Введение в ко- конечную математику. М., ИЛ, 1963, 486 с. 85. Ким К. В., Об эффективности алгоритмов решения двухкомпонент- ных задач линейного программирования. — Экономика и матем. методы, 1974, 10, 3, 621—631. 86. КорбутА. А., ФинкельштейнЮ. Ю., Дискретное прог- программирование. М., «Наука», 1969, 368 с. 87. К о р н и л о в а Г. Ф., Г л е з е р Н. Н., Программное обеспечение экономико-математического анализа. — Программы и алгоритмы, вып. И, ЦЭМИ, М., 1968. 88. К о р об о ч к и н Б. И., Обобщенные функции Лагранжа и некото- некоторые их свойства. — Оптимизация, 1973, 10 B7), 120—127.
344 ЛИТЕРАТУРА 89. К о ф м а н А., Д е б а з е и Г., Сетевые методы планирования и их применение. М., «Прогресс», 1968, 182 с. 90. К р е и и М. Г., НудельманА. А., Проблема моментов Мар- Маркова и экстремальные задачи. М., «Наука», 1973, 546 с. 91. К у н Г., Венгерский метод решения задачи о назначениях. — В кн.: «Методы и алгоритмы решения транспортной задачи», М., Госстат- издат, 1963. 92. К у т а т е л а д з е С. С, Р у б и н о в А. М., Двойственность Мин- ковского и ее приложения. Новосибирск, «Наука», 1976, 254 с. 93. ЛавровС. С, Универсальный язык программирования (Алгол- 60), изд. 3-е. М., «Наука», 1972, 184 с. 94. ЛавровС. С, ГончароваЛ.И., Автоматическая обработка дан- данных, хранение информации в памяти ЭВМ. М., «Наука», 1971, 160 с. 95. Л а т и н с к и й С. М., Ш а р а п о в В. И., К с ё н з С. П., А ф а - и а с ь е в С. С, Теория и практика эксплуатации радиолокацион- радиолокационных систем. М., «Сов. радио», 1970, 432 с. 96. Л е б е д е в С. С, Целочисленное программирование и множители Лагранжа. — Экономика и матем. методы, 1974, 10, 3, 592—610. 97. Левит Б. Ю., Л и в ш и ц В. Н., Нелинейные сетевые транспорт- транспортные задачи. М., «Транспорт», 1972, 144 с. 98. ЛиндсиЧ., Мюйлен С. ван дер, Неформальное введение в Алгол-68. М., «Мир», 1973, 407 с. 99. Линейные неравенства и смежные вопросы. Сб. статей под ред. Г. У. Куна и А. У. Таккера. М., ИЛ, 1959, 469 с. 100. Л и т л Дж., М у р т и К. Г., С у и н и Д., К э р е л К., Алгоритм для решения задачи о коммивояжере. — Экономика и матем. ме- методы, 1965, 1,1, 94—107. 101. Лэсдон Л. С, Оптимизация больших систем. М., «Наука», 1975, 432 с. 102. Макаров В. Л., Рубинов А. М., Математическая теория экономической динамики и равновесия. М., «Наука», 1973, 336 с. 103. М а л и н н и к о в В. В., П о в а р к о в а Л. Д., С о б о л е в А. И., Об одной экстремальной задаче, связанной с моделью PERT. — Тр. Ленинградского инж. эконом, ин-та, 1966, вып. 58, 229—232. 104. М а л к о в У. X., Алгоритм решения распределительной задачи. — ЖВМ и МФ, 1962, 2, 2, 358-366. 105. МалковУ. X., Алгоритмы для решения задач линейного про- программирования на Альфа-языке. Сб. статей. М., 1968, 141 с. (ЦЭМИ АН СССР). 106. МалковУ. X., Обзор программ решения общей задачи линей- линейного программирования. — Экономика и матем. методы, 1969, 5, 4, 594-597. 107. М а р к о в А. А., Теория алгорифмов. Тр. МИАН, 1954, 42, 376 с. 108. Маркус М., Ми н к X., Обзор по теории матриц и матричных неравенств. М., «Наука», 1972, 232 с. 109. М е й е р П.-А., Вероятность и потенциалы. М., «Мир», 1973, 324 с. ПО. М и х а л е в и ч В. С, Ермольев Ю. М., Ш к у р б а В. В., Ш о р Н. 3., Сложные системы и решение экстремальных задач. — Кибернетика, 1967, 5, 29—39. 111. Михельсон B.C., КозусВ.М., Климкович И. И , Фраг- Фрагментарный метод исследования сетевых моделей. — В кн.: «Част- «Частные задачи автоматики и систем управления», Минск, 1970.
ЛИТЕРАТУРА 345 112. М о и с е е в Н. Н., Численные методы в теории оптимальных сис- систем. М., «Наука», 1971, 424 с. 113. Моришима М., Равновесие, устойчивость, рост. М., «Наука», 1972, 280 с. 114. М о ц к у с И. Б., Многоэкстремальные задачи в проектировании. М., «Наука», 1967, 215 с. 115. Н е с т е р о в Е. П., Транспортные задачи линейного программи- программирования, 2-.е изд. М., «Транспорт», 1971, 216 с. 116. Н и к а й до X., Выпуклые структуры и математическая эконо- экономика. М., «Мир», 1972, 517. 117. О р е О., Теория графов. М., «Наука», 1968, 352 с. 118. П е р в о з в а н с к и й Л. А., Математические модели в управле- управлении производством. М., «Наука», 1975, 616 с. 119. Пересмотренное сообщение об Алголе-68. М., «Мир», 1976. 120. Петрова Л. Т., Введение в сетевое планирование. Новосибирск, Изд-во НГУ, 1969, 152 с. 121. ПинскерА. Г., БрызжинаЭ. Ф., Элементы оптимального программирования. Л., Изд-во ЛГУ, 1974, 188 с. 122. П о л а к Э., Численные методы оптимизации. Единый подход. М., «Мир», 1974, 374 с. 123. Поляк Б. Т., Т р е т ь я к о в Н. В., Метод штрафных оценок для задач на условный экстремум. — ЖВМ и МФ, 1973,13, 1. 124. П о н т р я г и н Л. С, Основы комбинаторной топологии. М.—Л., 1947, 142 с. 125. П о н т р я г и и Л. С, Болтянский В. Г., Г а м к р е - л и д з е Р. В., М и щ е н к о Е. Ф., Математическая теория опти- оптимальных процессов. М., Физматгиз, 1961, 391 с. 126. П р и м Р. К., Кратчайшие связывающие сети и некоторые обоб- обобщения. — Киберн. сб., 1961, 2, 95—107. 127. Программы симплекс-метода на языке фортран (метод, разработка). М., Изд-во ВЦ МГУ, 1976, 54 с. 128. Пшеничный Б. Н., Необходимые условия экстремума. М., «Наука», 1969, 152 с. 129. Пшеничный Б. Н., Д а н и л и н Ю. М., Численные методы в экстремальных задачах. М., «Наука», 1974, 320 с. 130. Р о к а ф е л л а р Р. Т., Выпуклый анализ. «Мир», 1973,469 с. 131. Романовский И. В., Об эквивалентности различных поста- постановок транспортной задачи. — УМН, 1962, 17, 3, 193—195. 132. Романовский И. В., Задача о наивыгоднейшей круговой расстановке станков. — Экономика и матем. методы, 1966, 2, 4, 578—581. 133. Романовский И. В., Магистральные теоремы для полумар- полумарковских процессов решения. Тр. МИАН, 1970, 111, 208—223. 134. Романовский И. В., Методы неявного перебора для реше- решения задач целочисленного программирования с бивалентными пере- переменными. — Изв. вузов, Математика, 1970, 4, 17—29. 135. Романовский И. В., Оптимизация стационарного управле- управления дискретным детерминированным процессом. — Кибернетика, 1967, 2, 66—78. 136. Р о м а н о в с к и й И. В., Циклические варианты моделей сете- сетевого графика. — В кн.: «Исследование операций и статистическое моделирование, 1», Л., Изд-во ЛГУ, 1972, 145—152.
¦346 ЛИТЕРАТУРА 137. Романовский И. В., Христова Н. П., Решение дис- дискретных минимаксных задач методом дихотомии. — ЖВМ и МФ, 1973, 13, 5, 1200—1209. 138. Р у б и н ш те й нГ. Ш., О решении задач линейного програм- программирования большого объема. — Оптим. планирование, 1964, 2, 3-22. 139. Р у д е р м а н С. Ю., Алгоритм ускоренного поиска оптимальной трассы трубопровода с отводами при аддитивном показателе ка- качества. Транспорт и хранение нефти и нефтепродуктов, 1972, 8. 140. Р ы ж и к о в Ю. И., Управление запасами. М., «Наука», 1969, 344 с. 141. Рыков В. В., Управление системы массового обслуживания. — В кн.: «Итоги науки и техники. Теория вероятностей. Матем. статистика. Теор. кибернетика, 12», М., ВИНИТИ, 1975, 43—154. 142. С о р о к и н а М. Г., Симплекс-метод В. А. Булавского. — Алгол- процедуры, Изд-во ЛГУ, 1970, 4, 1—5. 143. Судаков В. Н., Геометрические проблемы теории бесконечно- бесконечномерных вероятностных распределений. — Тр. МИАН, 1976, 141, Л., «Наука», 192 с. 144. СупруненкоД. А., Айзенштат В. С, Лепешин- с к и й Н. А., Экстремальные значения функций на множествах перестановок. — Тезисы докл. на I Всесоюзн. конф. по исслед. операций. Минск, 1972, 61—64. 145. С у р и н С. С, Решение задач линейного программирования с большим числом нулевых элементов в исходной симплексной таблице. — Оптимальное планирование, 1968, 10, 69—80. 146. Т а и а е в В. С, Ш к у р б а В. В., Введение в теорию расписаний. М., «Наука», 1975, 256 с. 147. ТихоновА. Н.,Арсении В. Я-, Методы решения некоррект- некорректных задач. М., «Наука», 1974, 224 с. 148. Толстой А., Методы устранения нерациональных перевозок при планировании.—Соц. транспорт, 1939, 9, 28—51. 149. Т р и у с Е. Б., Задачи математического программирования транспортного типа. М., «Сов. радио», 1967, 208 с. 150. Т р у б и н В. А., О методе решения задач целочисленного линей- линейного программирования специального вида. — ДАН СССР, 1969, 189, 5, 552—554. 151. Фелпс Р., Лекции о теоремах Шоке. М., «Мир», 1968, 112 с. 152. Ф о р д Л. Р., Ф а л к е р с о и Д. Р., Потоки в сетях. М., «Мир», 1966 276 с. 153. Ф о с т е р Дж., Обработка списков. М., «Мир», 1974, 72 с. 154. Ф р и д м а н А. А., В о й т я к о в А. А., Дискретные задачи и метод ветпей и границ. Экономика и матем. методы, 1974, 10, 3. 155. X е дл и Дж., У а й т и н Т., Анализ систем управления запа- запасами. М., «Наука», 1969, 512 с. 156. X о в а р д Р., Динамическое программирование и марковские процессы. М., «Сов. радио», 1965, 190 с. 157. Холл М., Комбинаторика. М., «Мир», 1970, 420 с. 158. X о о р К-, Обработка записей. — В кн.: «Языки программирова- программирования», М., «Мир», 1972, 278—343. 159. X у Т., Целочисленное программирование и потоки в сетях. М., «Мир», 1974, 520 с.
ЛИТЕРАТУРА 347 160. Чудновский Э. Л., Блочный алгоритм расчета крупных сетевых графиков. — Вычисл. и организ. техника в строительстве и проектировании, 1966, вып. 8, 26—33. 161. Ширяев А. Н., Статистический последовательный анализ, М., «Наука», 1976, 272 с. 162. Ш м ы р е в В. И., Алгоритм решения одного класса задач линей- линейного программирования большого объема. — Оптимальное пла- планирование, 1969, 11, 88—116. 163. Ш р е й д е р Ю. А., Задачи динамического программирования и автоматы. — Проблемы кибернетики, 1961, вып. 5, 31—48. 164. Юдин Д. Б., Математические методы управления в условиях неполной информации. М., «Сов. радио», 1974, 400 с. 165. Ю д и н Д. Б., Гольштейн Е. Г., Линейное программирова- программирование (теория, методы и приложения). М., «Наука», 1969, 424 с. 166. Яковлева М. А., Двухкомпонентная задача линейного программирования. — Оптимальное планирование, 1964, 2. 167. Я н г Л., Лекции по вариационному исчислению и теории оптималь- оптимального управления. М., «Мир», 1974, 484 с. 168. А р р е 1 P., La probleme geometrique des deblais et remblais. — Mem. Sci. Math., 1928, 27, 1-34. 169. Balas E., PadbergM. W., On the set covering problem. — Operat. Res., 1972, 20, 6, 1152—1161. 170. В a 1 i n s k i M. L., Integer programming: methods, uses, compu- computation. — Manag. Sci., 1965, 12, 3, 253—313. 171. В a 1 i n s k i M., H e 1 1 e г т а п Е., Computational practice in Mathematical Programming, Math. Program. Study, 1975, 4. 172. BartelsR. H., GolubG. II., The simplex method oF linear programming using LU decomposition. — Comm. ACM, 1969, 12, 266—268, 275—278. 173. В e 1 1 m a n R. E., A Markovian decision process. — J. Math, and Mech., 1957, 6. 174. В e 1 1 m a n R. E., On a routing problem. — Quart. Appl. Math., 1958, 16, 1, 87—90. 175. В e r g e C, Espace topologique et fonctions multivoque, Paris, Dunod, 1963, 272 p. 176. BcrgeC, Graphes et hyper-graphes, Paris, Dunod, 1970, 502 p. 177. В e r g e C, Ghouila-Houri A., Programmes, Jeux et Resea- ux du Transport, Paris, Dunod, 1962, 254 p. 178. Bertele U., В r i о s h i F., Nonserial dynamic programming, N. Y, Acad. Press. 1972, 235 p. 179. В 1 а с k w e 1 1 D., Discounted dynamic programming. — Ann. Math. Stat., 1965, 36, 226—235. 180. В r a d 1 e у G. H., Transformation of integer programs to knapsack problems. — Discrete math., 1971, 1, 1, 29—45. 181. ChoquetG., DenyJ., Modelds finis en theorie du potentiel. — J. d'Analyse math., 1956/57, 5, 77—135. 182. ChristofidesN., Eilon S., Algorithms for large scale tra- travelling salesman problems. —Operat. Res. Q. 1972, 23,4, 511—518. 183. ClarkC. E., The optimum allocation of resources among the activities of a network. — J. industr. engineering, 1962, 13, 2. 184. D a n t z i g G. B. All shortest routes in a graph. — In: «Theorie des Graphes», Paris, Dunod, 1967, 91—92.
348 ЛИТЕРАТУРА 185. D e r m a n С, Finite state Markovian decision processes, N. Y., Acad. Press, 1970, 159 p. 186. D i j к s t r a E. W., A note on two problems in connection with graphes. — Numerische Math., 1959, 1, 269—271. 187. D i 1 w о г t h R. P., A decomposition theorem for partially, ordered sets. —Ann. of Math., 1950, 51, 161—166. 188. Dreyfus S. E., An appraisal of some shortest-path algorithms. — Operat. Res., 1969, 17, 3, 395—412. 189. Egervary J., Matrixok kombinatorikus tulajdonsagairol.— Mat. es Fis. Lapok, 1931, 38, 16—28. 190. Elmaghraby S., The concept of state in discrete dynamic programming. — J. of Math. Anal, and Appl., 1970, 29, 523—557. 191. F i e d 1 e г М., Some applications of the theory of graphes in matrix theory and geometry, — In: «Theory of graphes and its applications, Proceedings of the Symposium held in Smolenice», Prague, 1963. 192. Floyd R. W., Algorithm 97, Shortest path. — Comm. of ACM, 1962, 5, p. 345. 193. Forrest J.J. H., T о m 1 i n J. A., Updating triangular factors of the basic to maintain sparsity in the product form simplex method.— Math. Progr., 1972, 2, 3, 263—278. 194. FransisR.L., Goldstein J. M., Location theory: A selective ' bibliography. — Operat. Res., 1974, 22, 2, 400—410. 195. F r i e d r i с h V., Stetige Transportoptimierung. Berlin, VEB Deutsh. V. der Wissenschaften, 1972, S. 175. 196. Fulkerson D. R., A network flow computation for project cost curves. — Manag. Sci., 1959, 5, 2, 472—483. 197. Fulkerson D. R., Packing rooted directed cuts in a weighted directed graph. — Math. Program., 1974, 6, 1, 1—13. 198. Geoffrion A. M., Mars ten R. E., Integer programming algorithms: a framework and state-of-the art survey. — Manag. Sci., 1972, 18, 9, 465—491. 199. Hammer(Ivanescu)P. L.,RudeanuS., Boolean Methods in Operations Research and Related Areas, Springer, 1968, 329 p. 200. Held M., К a r p R. M., The travelling salesman problem and minimum spanning trees. — Math. Program., 1971, 1, 1, 6—25. 201. H о f f m a n A. J., A generalization of max flow-min cut. — Math. Program., 1974, 6, 3, 352—359. 202. Hoffman A. J., W i nogr a d S., Finding all shortest distances in a directed network. — IBM J. Res. Devel., 1972, 16,414—416. 203. Howard R., Dynamic probabilistic systems, N. Y., 1971. 204. I b a r а к i Т., Solvable classes of discrete dynamic programming.— J. of Math. Anal, and Appl., 1973, 43, 642—693. 205. К а о E. P. C, Optimal replacement rules when changes of state are semi-Markovian. — Operat. Res., 1973, 21, 6, 1231—1249. 206. К a r p R. M., Held M., Finite-state processes and dynamic prog- programming. — SIAM J. Aptpl. Math., 1967, 15, 693—718. 207. К e 1 1 e у J. E., jr.. The cutting plane method for solving convex programs.—J. of SIAM, 1960, 8, 4, 703—712. 208. К os ten L., Heuristische Methoden zur Arbeitsangleichung bei Fliessbandern. In: Proc. Operat. Res. 1, Wurzburg— Wien, 1972. 209. К r u s к a 1 J. В., On the shortest spanning tree of a graph and the travelling salesman problem. — Proc. 1956, 7, 48—50,
ЛИТЕРАТУРА 349 210. К п n z i Н. Р., Т с h а с h H. G., Z e h п d е г С. A., Numerische Methoden der mathematischenOptimierung, Stuttgart, B. G. Taubner. 1967, S. 151. 211. Land Ailsa H. D о i g Alison, An automatic method of solving discrete programming problems. — Econometrica, 1960, 28, 3. 212. Land Ailsa H., Powell Susan, Fortran codes for mathematical programming, linear, quadratic and discrete, Wiley, 1973, 249 p. 213. Lawler E. R., Wood D. E., Branch-and-bound methods: a survey. — Operat. Res., 1966, 14, 4, 699—719. 214. McKenzie L, Turnpike theory. — Esonometrica, 1976, 44, 5. 215. Mine H., О s a k i S., Markovian decision processes, N. Y., El- sevier, 1971, 142 p. 216. Mirsky L., Results and problems in the theory of doubly stochastic matrices. — Z. Wahrscheinlichkeitstheorie, 1963, 1, 319—334. 217. MongeG., Deblais et remblais. Mem. Ac. Sci., Paris, 1781. 218. M о о r e E., The shortest path through a maze. In «Proc. Internat. Symp. on the Theory of Switching», p. 2, Harvard, 1959, 285—292. 219. M u n kr es J., Algorithms for the assignment and transportation problems. — J. of SIAM, 1957, 5, 32—38. 220. N о z i с k a F., G u d d a t J., H о 1 1 a t z H., В a n k В., Theo- rie der linearen parametrishen Optimierung, Berlin, 1974. 221. Orchard-Hays W., Advanced linear programming computing technique, N. Y., McGraw-Hill, 1968, 355 p. 222. Pierskalla W. P., The multidimensional assignment prob- problem. — Operat. Res., 1968, 16, 422—431. 223. Pollack M., The maximum capacity route through a network, — Operat. Res., 1960, 8, i; 35—63. 224. Pollack M., Wiebenson W., Solution of the shortest-route problem — A review. — Operat. Res., 1960, 8, 224—230. 225. Ray-ChandhuriD. K-, An algorithm for a maximum cover of an abstract complex. — Canad. J. Math., 1963, 15, 11—24. 226. R о m a n о v s k у I. V., On the solvability of Bellman's functional equation for a Markovian decision process. — J. of Math. Anal, and Appl., 1973, 42, 2, 485—498. 227. R о s e D. J., Triangulated graphes and the elimination process. — J. of Math. Anal, and Appl., 1970, 32, 3, 597—609. 228. S h i m b a 1 A., Structure in communications nets. — In: «Proc. .Symp. Information Networks», Polytech. Inst. of Brooklyn, 1954. 229. Simmonard M., Programmation lineare, Paris, Dunod, 1962, B ed., t. 1 — Fondaments, 1972, 287 p.). 230. T i n n e у W. F., W a 1 k e r J. W., Directed solution of sparse network equations by optimally ordered triangular factorization. — Proc. IEEE, 1967, 55, 1801—1809. 231. Toralin J. A., On pricing and backward transformation in linear programming. — Math. Program., 1974, 6, 1, 42—47. 232. W i r t h N., An algorithmic language «Pascal». — Acta Informatica, 1971, 1, 1, 37-63.
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ Базис 60 — в двухкомпонентной задаче 143 — — транспортной задаче 115 — — — —, искусственный 123 — — — — с ограничениями 138 Вектор вероятностный 12, 298 — Джеффриона 233 — контурный ИЗ — стационарных вероятностей 302 — характеристический множества 15 — — разбиения 20 — циклический 113 Выпуклая комбинация 54 — оболочка 61 Выпуклое множество 54 — —, крайняя точка 59 Выпуклый конус 63 Генерирование памяти (в алголе-68) 30 Граф 95 — вполне связный 105 — двудольный 192 — переходов марковской цепи 298 — простой 192 —, редукция 149 ¦— связный 102 —, способы задания 97 — транзитивный 148 Дерево 103, 106 — диагностическое 283 — иерархическое 108 — кратчайшее 173 — — иерархическое 174 — — частичное 174 — кратчайших путей 155 —, эквивалентные определения 106 Дуга графа 95 — критическая 172 — фиктивная 171 Задача Вертеле — Бриоши 296 — динамического программирования типовая 265 — замены оборудования 276 — линейного ассортиментного рас- раскроя 92 — — программирования 47 — — — бивалентная 232 — — — блочная 90 — — — двойственная 53 — — — двухкомпонентная 143 Задача линейного программирования основная 47 — — — прямая 53 — — — с искусственным базисом 69 — — — с одним ограничением 38 237 — — — стандартная 47 — — — узкоблочная 91 — — раскроя 92, 252 — максимизации на дереве 295 — нахождения оптимального стацио- стационарного режима 320 — об оптимальном .нормированном потоке 139 — о коммивояжере 210 — о кратчайшем дереве 173 — — — — путей 174 — — — пути 156 — о круговой расстановке станков 225 — о максимальном потоке 180 — — — пути 163 — о назначениях 194 — о наилучшем покрытии 203 — — — разбиении 203, 248 — о порядке исключения перемен- переменных 204 — оптимального резервирования 278 — оптимизации вторичная 297 — о различных представителях 202 — о размыкании контуров 224 — о ранце 235 — о частичном дереве 174, 227 — плоского гильотинного раскроя 287 — поиска неисправности 282 — размещения производства 243 — распределения ресурсов в сетевом графике 185 — расширенная 48 — транспортная 109 — — сетевая 110 — — —, двойственная 111 — — — с ограничениями пропуск- пропускных способностей 137 — управления запасами детермини- детерминированная 259 — — — стохастическая 311 — эквивалентная 48 Инцидентность 97 Квазипорядок 148 Класс эквивалентности — эргодический 30Q 148
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ 351 Контур 101 —, характеристика 140 — эйлеров 209 Матрица бистохастическая 193 — блочная 19 — единичная 13 — из нулей и единиц 202 — инциденций 98 — —, ранг 104 — —, решение систем 112 — кратчайших расстояний 151 — назначающая 12 — обратная 13 — отображения 12 — переставляющая 13 — смежностей 99 — стохастическая 298 Матроид 202 Метод венгерский 195 — ветвей и границ 211 — — — —, политики ветвления 220 — генерирования столбцов 91 — дихотомии 248 — мультипликативный 85 — обратной матрицы 80 — переработки списка состояний 255, 280, 291 — поиска контуров 150 — последовательных улучшений 64 — — —, реализации 72 — — —, симплекс-метод 73 — — —, устранение зацикливания 70 — построения дерева кратчайших путей 156 — — — — — Дейкстры 161 — — кратчайшего дерева 173 — — — — путей 175 — — матрицы кратчайших расстоя- расстояний Беллмана — Шимбела 152 ______ — Флойда 153 — — — пропускных способностей 155 — потенциалов 115 — разложения 92 — северо-западного угла 124 — улучшенного перебора 211 — — —, связь с динамическим про- программированием 293 Множество внешне устойчивое 207 — внутренне устойчивое 207 Обозначения векторно-матричные 10 — знаков неравенств 11 — теоретико-множественные 14 Операция (в алголе-68) сложения векторов 30, 34 — abs 12 — cons 37, 178 — dif 134, 178 — dom 258 — head 37 — join 40 — lexprec 45 — Hn 30, 178, 258 — rob 37 — scpr 29 Паросочетания 192 Переменные дополнительные 50 — искусственные 68 Петля 98 Повторение 86 Подграф 97 ¦— частичный 97 Политика 266 Построение сетевого графика 166 Потенциалы в транспортной зада- задаче 111 — марковской цепи 309 Поток сбалансированный 111 Представление графа 97 — базисной матрицы LU и LT 90 — редкозаполненных векторов и мат- матриц 22 — структур 27 Предшествование 148 ~- лексикографическое векторов 21 — — списков 45 — работ в сетевом графике 166 Процедура (на алголе-60) — a times х 26 — best partition 250 — diagn 286 — dijkstra 163 — /ml 76 — fin2 78 — fin3 82 — ftni 89 — finT 127 — inclmult 88 — intstab 242 — Ihmult 88 — LP opt basic solution 72 — LPsoll 77 — LPsol2 81 — LPsol3 87 — maxpath 165 — multiknapsack 240 — new\ 74 — new2 77 — neu>3 81 — new4 88 — new! 125 — partitions 21 — potential method 127 — repetition 87 — rhmult 88 — spos 81 — spos2 83 — spos3 85 — startl 74 — start2 81 — start3 87 — startT 127 -— subsets 16 — subsetstack 25 — travsal 222 — workl 75 — work2 82 — work3 88 — work! 125 — x times a 26 Процедура (на алголе-68) — arhorescence 177 — Emeli Komlik 245 — exdel 42
352 ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ — gribov 200 — tncltl 42 — Inclen 42 — incllst 43 — loin 41 — Uutch 258 — listinvert 43 — newT 133 — pot method 136 — worliX 135 Процессы решения марковские и по- полумарковские 315 Путь 101 — гамильтонов 210 — критический 163 Разбиения 18 — в методе ветвей и границ 212 —, задача выбора 248 —, произведение 19 —, характеристический вектор 20 Разрез 181 Резерв времени 172 Резольвента 309 Рента 137 Решение базисное 60 — допустимое 48 — оптимальное 48 Связность графа !00 Симплекс 12 Симплекс-метод 73 Соотношения двойственности 57 Списки 35 —, голова 43 —, хвост 43 Ссылки 31 Статистика марковская 317 Схема динамического программиро- программирования 263 — исключения Вертеле — Бриоши 295 Теорема Бержа 114 '— Биркгофа — Неймана 193 — Блекуэлла 329 — двойственности 55 — Дилворта 189 — Кёнига о бихроматических гра- графах 206 — — о паросочетаниях 192 — Ке'нига — Оре 192 — Кёнига — Холла 193 — Кирхгофа 114 — о дерева в связном графе 103 — о магистрали 272 — — — для марковских процессов решения 328 — о макснпотоке и миниразрезе 181 — отделимости 54 — Пуанкаре — Веблена — Алексан- дера 113 — Рисса об эксцессивной функции 310 — Трубина 204 — Хопарда 330 Траектория 265 Транзитивное яамыкание 148 Уравнение Беллмана 253, 267 — —, условия разрешимости 268, 321 Условие оптимальности решения 58 Функция аддитивная 44 — мультипликативная 44 — регулярная 309 — .рекуррентная 44 — решающая 265, 3 16 — — марковская 317 — целевая 48 — эксцессивная 309 Цепь 102 Цикл 101 — гамильтонов 210 — основной 114 — эйлеров 208 Число внешней устойчивости 207 — внутренней устойчивости 207 — — —, нахождение 242 — хроматическое 206