Предисловие В настоящем учебном пособии рассматриваются вопросы построения математических моделей, обсуждаются их достои...
19 downloads
374 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Предисловие В настоящем учебном пособии рассматриваются вопросы построения математических моделей, обсуждаются их достоинства и недостатки. На примере распределительной задачи, задачи о ранце, а также задачи о ближайшем соседе изучается метод динамического программирования. Приведены алгоритмы анализа сетевых моделей и вычисления их характеристик; методы неявного перебора для решения дискретных задач оптимизации представлены методом ветвей и границ. Рассмотрены алгоритмы решения матричных игр. Методы расчета максимальных потоков и потоков минимальной стоимости представлены алгоритмами Форда−Фалкерсона, Басакера−Гоуэна и Клейна. За основу пособия взят курс «Исследование операций», который читается на механико-математическом факультете НГУ. Предполагается, что студенты уже знакомы с элементами математического анализа, линейной алгебры и методов оптимизации. Каждая новая тема начинается с необходимых определений и утверждений. Затем приводятся алгоритмы решения задач и характеристики этих алгоритмов (трудоемкость и объем памяти). Для закрепления материала подробно разбираются примеры. В конце каждого раздела помещены упражнения для самостоятельной работы. Пособие включает шесть тем, которые изучаются на практических занятиях по исследованию операций. Для закрепления знаний по основным методам курса студенты получают персональные семестровые задания, содержащие: − задачи о ранце и ближайшем соседе, которые следует решать методом динамического программирования; − задачу расчета характеристик сетевой модели с помощью алгоритма Форда (расчет ранних и поздних времен наступления событий, резервов времени работ, а также определение критических событий и работ); − задачу коммивояжера, которая должна быть решена методом ветвей и границ. Описание упомянутых задач и методов их решения приведено в главах 2−4. Авторы надеются, что данное пособие окажется полезным как студентам, так и лицам, осваивающим курс самостоятельно.
4
1. Математическое моделирование В рамках исследования операций рассматриваются задачи поиска оптимальных решений. Это подразумевает возможность выбора управляющих воздействий (значений переменных), приводящих к достижению поставленной цели. Процесс решения проблемы методами исследования операций включает такие этапы, как: − уяснение содержательной постановки задачи; − построение математической модели (формализация основных аспектов задачи); − поиск оптимального решения. Настоящая глава посвящена математическому моделированию − процессу перехода от содержательной постановки к математической задаче. Пример 1.1. Рассмотрим завод, который способен производить изделия из данного перечня. Для изготовления конкретного изделия необходимо определенное количество различных ресурсов. Объемы ресурсов ограничены. Известны стоимость единицы каждого ресурса, цена реализации изделия и мощность предприятия, т. е. максимальное число изделий, которое может быть произведено в течение рабочего дня. Требуется найти план производства (количество выпускаемых заводом изделий каждого типа), который максимизирует прибыль от продажи изделий. Постановка. Пусть выпускаются изделия типа i = 1, …, n, и используются ресурсы типа j = 1, …, m. Мощность завода обозначим через M. На изготовление одного изделия i-го типа завод использует aij единиц ресурса j-го типа, его общий объем равен Aj. Затраты на приобретение единицы ресурса j для изготовления изделия типа i равны dij. Пусть ci – цена одного изделия i-го типа, а переменная xi – количество таких изделий, выпускаемых заводом. Требуется найти объем выпускаемых заводом изделий, т. е. значения переменных x1, …, xn, при которых прибыль завода максимальна. Начнем запись математической модели с формализации цели. Для этого запишем функционал (целевую функцию), который выражает прибыль завода. Прибыль завода – это сумма реализации произведенной продукции n
( (
∑
cixi)
i =1 n
m
i =1
j =1
∑ ∑
за
вычетом
затрат
на
использованные
ресурсы
aijdijxi). Следовательно, критерий задачи запишется в виде
5
n
∑
cixi −
i =1
n
m
i =1
j =1
∑ ∑
aijdijxi → max, { xi }
где стрелкой показана цель – максимизация, а под максимумом указаны переменные, выбором значений которых он достигается. (Для представления критерия наряду с формой f ( x ) → max используется эквивалентная x∈D
запись
max f ( x ) .) x∈D
В допустимом решении переменные задачи должны удовлетворять огn
раничениям на объем используемых ресурсов
∑
aijxi ≤ Aj, а также огра-
i =1
n
ничениям на мощность производства
∑
xi ≤ M.
i =1
Следовательно, математическая модель рассматриваемой задачи может быть записана в виде n
∑
cixi −
i =1
n
m
i =1
j =1
∑ ∑
aijdijxi → max; { xi }
n
∑
aijxi ≤ Aj, j = 1, …, m;
i =1
n
∑
xi ≤ M;
i =1
xi ∈ Z+, i = 1, …, n, где Z+ – множество неотрицательных целых чисел. В данном примере функция цели, а также ограничения, описывающие область допустимости, выписываются однозначно. Этого нельзя сказать о следующем примере. Пример 1.2. Рассмотрим коммуникационную сеть, состоящую из сервера и связанных с ним пользователей (дерево-звезда с сервером в корне). Для каждой упорядоченной пары пользователей известен объем информации, которую первый пользователь должен передать второму. Передача информации от одного пользователя к другому осуществляется через сервер. Все линии связи имеют одинаковую пропускную способность. Сервер может действовать двумя способами:
6
1) осуществлять прямое соединение пользователей, тогда единица информации, равная пропускной способности, достигнет адресата за единицу времени; 2) получить информацию от отправителя, запомнить ее и позже передать адресату. В этом случае процесс передачи информации в объеме пропускной способности займет две единицы времени (без учета времени хранения). Предполагается, что линия связи может быть загружена одновременно лишь одним пользователем. Отсюда следует, что в каждый момент времени пользователь может быть связан (т. е. может передавать или получать информацию) не более чем с одним другим пользователем. Требуется так составить расписание «общения» пользователей между собой (определить какой пользователь и кому должен передавать информацию в каждый момент времени), чтобы общее время, необходимое для передачи всей информации, было минимально. Постановка. Для формализации задачи введем параметры и переменные, которые свяжем условиями, что позволит задать допустимую область и записать критерий. Пусть I – множество пользователей, параметры dij ≥ 0 соответствуют объему информации, которую необходимо передать от пользователя i∈I пользователю j∈ I, а d – пропускная способность линии связи (объем информации, которую можно передать за единицу времени). Обозначим через T переменную, соответствующую длительности пеt
редачи всей информации, а через x ij ∈ {0,1} − переменные, определяющие t
расписание. Переменная xij = 1, если в момент t = 1, …, T пользователь t
i∈ I передает данные пользователю j ∈ I, и xij = 0 в противном случае. Заметим, что когда все линии связи имеют одинаковую пропускную способность d, от величин dij можно перейти к величинам
⎤d ⎡
τ ij = ⎥ ij ⎢ , ко⎦d ⎣
торые определяют необходимое количество единиц времени передачи данных из i в j. Сначала рассмотрим ситуацию, когда сервер способен осуществлять лишь первый тип соединения (без хранения / запоминания информации). Тогда критерий может быть записан в виде T → min , требование на переt { xij }
T
дачу всей информации из i в j примет вид
∑ t =1
допустимость соединений запишутся как 7
t
x ij = τij, а требования на
∑
t
x ij +
j∈I
∑
x tki ≤ 1, i∈ I.
k∈I
Таким образом, для рассматриваемой проблемы получена следующая математическая модель:
min ; t
(1.1)
∑
x ij =τij , i,j∈ I;
(1.2)
∑
x tki ≤ 1, t = 1, …, T, i ∈ I;
(1.3)
T→ T
∑
{ xij }
t
t =1
t
x ij +
j∈I
k∈I
t
x ij ∈ {0,1}, t = 1, …, T, i,j ∈ I.
(1.4)
Задача (1.1)−(1.4) является нелинейной задачей дискретного (булевого) программирования и решается достаточно сложно, поэтому построенная модель представляется не совсем удачной. Попробуем взглянуть на проблему иначе. Каждому пользователю поставим в соответствие вершину ориентированного мультиграфа G = (V, E), в котором из вершины i ∈ V в вершину j ∈ V идет τij дуг (кратность мультидуги (i,j) равна количеству единиц времени, необходимых для передачи всей нужной информации из i в j). Сформулируем задачу реберной раскраски графа. Задача реберной раскраски графа. Реберной раскраской графа называется отображение f : E → Z+, которое каждому ребру ставит в соответствие натуральное число – номер краски. Раскраска ребер называется правильной, если ребра, инцидентные одной вершине, имеют разные цвета. Задача реберной раскраски графа состоит в правильной раскраске ребер минимальным количеством цветов. Составление расписания передачи данных означает, что каждой дуге e графа G должен быть поставлен в соответствие момент времени f(e) ∈ {1, …, T}, когда по ней будет передаваться информация. При этом для любых дуг e1, e2, инцидентных одной вершине, должно выполняться неравенство f(e1) ≠ f(e2). Требуется минимизировать T. Очевидно, если словосочетание «момент времени» заменить словом «цвет», то получим задачу реберной раскраски графа (искомое T есть хроматический индекс мультиграфа G). Эта задача NP-трудна (см. гл. 2), но в то же время хорошо изучена. В частности, В. Г. Визинг предложил полиномиальный приближенный алгоритм, строящий решение, близкое к оптимальному. Более того, постановка проблемы как задачи раскраски позволя8
ет учесть второй способ передачи информации (с хранением на сервере). Действительно, пусть e = (i,j) ∈ E – дуга графа, а f(e) – ее цвет. Будем считать, что f(e) = a, если в момент времени a сервер осуществляет соединение i → j напрямую (первым способом), и f(e) = (a,b), если в момент времени a сервер получает единицу данных от пользователя i, а в момент времени b передает пользователю j (второй способ передачи). Обозначение f(e) = (a,b) следует понимать так: дуга e разбита на две части (инцидентора) и та ее часть, которая инцидентна вершине i, окрашена в цвет a, а другая – в цвет b. Такую раскраску называют смешанной, или раскраской инциденторов. Для построения допустимого расписания в случае f(e) = (a,b) достаточно потребовать выполнения условия a < b. А. В. Пяткин показал, что задача раскраски инциденторов полиномиально разрешима. На рис. 1.1 показан случай простой реберной раскраски, требующий трех красок (а) и смешанной раскраски, для которой достаточно двух красок (б).
2
2 2
1
2
1
1
1 3
1
3
3
2
а)
б)
Рис. 1.1.
Приведенный пример показывает, как важно построить «хорошую» математическую модель рассматриваемой проблемы. В первой постановке мы использовали математические выражения, позволяющие выразить связь переменных и параметров, а также условия задачи. Вторая постановка является комбинаторной. В общем случае задачи комбинаторной (дискретной) оптимизации будем записывать в виде 9
min{∑ c j : S ∈ F }, S⊆N
j∈S
где N = {1, …, n}, cj ∈ R, j ∈ N и F – множество подмножеств N. Приведем еще несколько примеров построения математических моделей. Пример 1.3 (задача о назначениях). Имеется n исполнителей и n работ. Каждый исполнитель может выполнить ровно одну работу, и каждая работа выполняется одним исполнителем. Пусть cij – затраты, связанные с назначением исполнителя i на работу j. Требуется найти назначение всех исполнителей, имеющее минимальные суммарные затраты. Постановка. Введем переменные xij = 1, если исполнитель i назначен на работу j, и xij = 0 в противном случае. Запишем ограничения. Каждый исполнитель выполняет одну работу: n
∑x j =1
ij
= 1, i = 1, ..., m.
Любая работа выполняется одним исполнителем: n
∑x i =1
ij
= 1, j = 1, ..., m.
Целевая функция (или функция цели) имеет вид n
n
min ∑∑ cij xij . { xij }
i =1 j =1
Пример 1.4 (задача о покрытии). Задан список районов. Нужно определить, где разместить противопожарные станции. Для каждого возможного места размещения станции известны связанные с этим затраты, а также множество районов, которые может обслуживать станция (оно определяется по времени прибытия пожарной бригады). Требуется выбрать места создания станций, чтобы все районы были «покрыты» и затраты на размещение станций минимальны. Постановка. Сначала приведем комбинаторную постановку задачи. Пусть M = {1, …, m} – множество районов, N = {1, …, n} – множество мест возможного размещения станций и Sj ⊆ M – множество районов, которые может обслуживать станция, размещенная в пункте j ∈ N, cj – стоимость размещения станции в пункте j. Получаем задачу min{∑ c j : U S j = M }. T⊆N
j∈T
j∈T
Запишем формулировку проблемы в виде задачи булевого программирования. Для этого введем матрицу инциденции A, элементы которой aij = 1, если i ∈ Sj, и aij = 0 в противном случае. Переменные xj = 1, если 10
станция размещена в пункте j, и xj = 0 в противном случае. Условия необходимости обслуживания каждого района запишем в виде n
∑a j =1
ij
x j ≥ 1, i = 1, ..., m.
Целевая функция (функционал): n
min ∑ c j x j . {x j }
j =1
Упражнения Осуществить математическую постановку следующих задач. 1. В банк за кредитом обратилось m клиентов, каждый из которых просит сумму ai, i = 1, …, m. От сделки с i-м клиентом банк ожидает получить доход ci. Банк имеет сумму A, которую он может потратить на кредиты и должен обслуживать не менее n и не более N клиентов. Требуется определить, каким клиентам следует дать кредит, чтобы максимизировать ожидаемую прибыль. 2. Пусть I – множество пунктов возможного размещения производства некоторой продукции, а J – множество потребителей этой продукции. Каждому потребителю продукция может поставляться только от одного производителя. Затраты на открытие производства в i-м пункте характеризуют величины ci, а затраты на обслуживание j-го потребителя i-м производителем – cij. Требуется определить, в каких пунктах открывать производство и осуществить привязку потребителей к открытым пунктам производства, чтобы суммарные затраты были минимальны. 3. Ресторан работает всю неделю кроме понедельника и вторника. Известно, что в i-й день недели потребуется si чистых салфеток. Всего имеется N салфеток, и утром во вторник все они чистые. По окончании рабочего дня все использованные салфетки отдаются в стирку, которая может быть обычной или срочной. В обычной стирке салфетка находится весь следующий день. Срочная стирка происходит ночью, и на следующий день салфетка может быть использована. Стоимость обычной стирки – co, срочной – cc. В конце каждого рабочего дня требуется определить, сколько грязных салфеток отдавать в обычную, а сколько в срочную стирку, чтобы их хватило на следующий день, а суммарные затраты на стирку в течение недели были минимальны. 4. Имеется 10 деревянных брусков длиной 2,7 м и 20 брусков длиной 3,5 м. Из этих брусков путем их распила делаются заготовки для оконных рам формы, указанной на рис. 1.2. На одну раму уходит три метровые и две
11
полутораметровые заготовки. Требуется определить, как распилить имеющиеся бруски, чтобы из них получилось максимальное количество рам.
1м
1.5 м Рис. 1.2
5. Спелеолог в пещере нашел сундук c драгоценными изделиями. Каждое изделие i, находящееся в сундуке, имеет ценность ci ≥ 0 и вес wi ≥ 0. Суммарный вес груза, который спелеолог может вынести из пещеры, ограничен величиной Q. Требуется определить, какие предметы взять, чтобы у спелеолога хватило сил вынести их из пещеры, и ценность взятых предметов была максимальна. 6. Задача о пищевом рационе [4]. Имеется четыре вида продуктов питания. Известна стоимость единицы каждого продукта. Из этих продуктов необходимо составить пищевой рацион, который должен содержать: − белков не менее b1 единиц; − углеводов не менее b2 единиц; − жиров не менее b3 единиц. Единица продукта i содержит ai1 единиц белков, ai2 единиц углеводов и ai3 единиц жиров. Требуется так составить пищевой рацион, чтобы обеспечить заданные условия по белкам, углеводам и жирам при минимальной стоимости рациона. 7. Пусть I – множество исполнителей, J ⊆ I – множество работ, tij – время выполнения, а cij – стоимость выполнения j-й работы i-м исполнителем. Требуется назначить на каждую работу по одному исполнителю, при этом каждый исполнитель может выполнить не более одной работы, чтобы мак12
симальное время выполнения всех работ было минимально, а стоимость не превышала заданной величины S. 8. Набор высоты и скорости [4]. Пусть самолет находится на высоте H0 и летит со скоростью V0. Необходимо поднять самолет на высоту Hк и увеличить его скорость до Vк. Предположим, что процесс увеличения высоты и скорости происходит ступенчато. То есть единовременно увеличивается либо высота на величину ΔH, либо скорость на величину ΔV. Будем считать, что на увеличение высоты от величины H до величины H + ΔH расходуется известное количество горючего, и на увеличение скорости от величины V до величины V + ΔV расходуется также известное количество горючего, для всех H ∈ [H0 , Hк − ΔH], V ∈ [V0 , Vк − ΔV]. Требуется определить режим набора высоты и скорости до заданных величин, истратив минимальное количество горючего. 9. Рассмотрим период в n дней. Пусть известен спрос dt на некоторый продукт в каждый день t = 1, …, n. Поставщик продукта имеет производство и склад готовой продукции. Производство может быть начато и остановлено в любой день (в случае остановки как минимум день продукция не производится) и его запуск (после остановки) в начале дня t связан с затратами ft. Стоимость выпуска единицы продукта в день t равна pt, а стоимость хранения единицы продукции в течение дня t равна ht. Предположим, что в начале первого дня на складе находится s0 единиц готовой продукции. Требуется составить оптимальный план производства на n дней, чтобы удовлетворить потребности каждого дня и минимизировать связанные с этим затраты.
13
2. Динамическое программирование В основе метода лежит идея рассмотрения исходной задачи как представителя семейства сходных с ней задач. Динамическое программирование (ДП) связано с многошаговым (многоэтапным) процессом принятия решений. При этом под многошаговым процессом принятия решений понимается деятельность, при которой принимаются последовательные решения, направленные на достижение одной цели. Методу ДП посвящено множество публикаций, в частности работы [1, 2, 5], в которых достаточно подробно рассмотрена техника решения задач методом динамического программирования. В данном разделе мы будем изучать метод постепенно по принципу «от простого к сложному». Начнем с распределительной задачи. 2.1. Распределительная задача Сформулируем распределительную задачу на примере планирования деятельности предприятия на n лет. Пусть предприятие имеет ресурс в размере Y единиц, который оно может вложить в производство в течение n лет. Функции ft(x) отражают эффективность использования x единиц ресурса в год t. Требуется определить план расхода имеющегося ресурса по годам, чтобы максимизировать суммарную эффективность. Обозначим через хt искомую величину ресурса, вкладываемого в развитие производства в год t = 1, …, n. Тогда математическая модель может быть записана в виде n
∑
ft(xt) → max ; { xt }
t =1
(2.1)
n
∑
xt ≤ Y;
(2.2)
t =1
xt ≥ 0, t = 1, ..., n.
(2.3)
Решение задачи (2.1)−(2.3) будем строить шаг за шагом, оптимизируя на текущем шаге размер инвестиций в год t. Будем предполагать функции ft(x) неубывающими, что позволяет перейти от исходной задачи к равносильной задаче (2.1), (2.2′), (2.3), в которой неравенство (2.2) заменено равенством
14
n
∑
xt = Y.
(2.2′)
t =1
Для задачи (2.1), (2.2′), (2.3) используем обозначение . Кроме того, обозначим: − S* – оптимальное значение целевой функции (2.1); *
− x*= (x 1 , …, x *n ) – оптимальное решение рассматриваемой задачи, т. е. n
S* =
∑
*
fk(x k ));
k =1
*
− yk =
k
∑
*
x i − оптимальное вложение ресурса за k первых лет,
i =1
k = 1, …, n. Далее воспользуемся терминологией и обозначениями из [2]. Наряду с исходной задачей рассмотрим семейство задач π = {: k = 1, …, n; 0 ≤ y ≤ Y}. Пусть Sk(y) – оптимальное значение целевой функции задачи , тогда S*= Sn(Y). Теорема 2.1. Для задачи (2.1), (2.2′), (2.3) справедливы следующие рекуррентные соотношения ДП: S1(y) = f1(y), 0 ≤ y ≤ Y; Sk(y) = max [ Sk-1(y − x) + fk(x)], k = 2, …, n; 0 ≤ y ≤ Y.
(2.4) (2.5)
0≤ x≤ y
Значение переменной x, при котором достигается максимум в (2.5), обозначим через xk(y) и назовем условно-оптимальным решением. *
Следствие 2.1. Условно-оптимальное решение xk(y k ) является оптимальным значением k-й компоненты вектора x* исходной задачи , *
*
т. е. x k = xk(y k ), k = 1, …, n. Алгоритм ДП состоит из прямого хода (процесса последовательного вычисления величин Sk(y), k = 1, …, n; 0 ≤ y ≤ Y) и обратного хода (восстановления оптимального решения). На последнем шаге прямого хода полу*
чаем оптимальное значение последней переменной x n = xn(Y). Пусть уже *
*
найдены оптимальные значения x n , …, x k +1 . Тогда *
*
*
y k = y k +1 − x k +1 .
15
*
*
x k = xk(y k ), где
Схема (2.4), (2.5), как правило, требует численного расчета, но иногда удается получить выражение функций Sk(y) в аналитическом виде. Пример 2.1. Рассмотрим метод ДП для задачи (2.1)−(2.3) с функциями x2 fi(xi)= i , где ci > 0 и i = 1, …, n. ci
y2 Прямой ход. На первом шаге получаем S1(y) = и условноc1 оптимальное решение x1(y) = y. Далее x 2 ( y − x) 2 + }. 0≤ x≤ y 0≤ x≤ y c 2 c1 Выражение в фигурных скобках представляет выпуклую функцию, минимум которой можно найти, приравняв нулю ее производную. Получим c2 y y2 x y−x − = 0, откуда x2(y) = , а S2(y) = . c1 + c 2 c2 c1 c1 + c 2 С помощью математической индукции нетрудно доказать, что c y y2 Sk(y) = k , xk(y) = k k , 0 ≤ y ≤ Y.
S2(y) = min {f2(x) + S1(y − x)}= min {
∑c
∑c
i
i =1
i
i =1
Таким образом, S*= Sn(Y) =
Y2
, x *n = xn(Y) =
n
∑c
i
i =1
c nY
.
n
∑c
i
i =1
Обратный ход. Зная оптимальное значение последней переменной находим n −1
n
y *n−1 =Y−
x *n
=Y−
Y ∑ ci − cnY
cnY
=
n
∑c
i
i =1
=
n
∑c
i
i =1
i =1
cn−1Y n
∑c i =1
16
∑c i =1 n
∑c i =1
Следовательно, x *n−1 = xn-1(y *n−1 ) =
Y
i
.
i
i
.
xn* ,
Воспользовавшись математической индукцией, получим c Y x *k = nk , k = 1, …, n.
∑c
i
i =1
В общем случае для реализации алгоритма ДП нужна дискретность значений xk. Пусть переменные xk целые. Тогда величины y также целые. Следовательно, параметру y достаточно принимать значения из конечного множества {0, 1, …, Y}. Трудоемкость алгоритма в этом случае равна O(nY2), а требуемая память – O(nY). Пример 2.2. На железнодорожную станцию прибыло 8 контейнеров, которые необходимо развезти по 5 складам. Емкость i-го склада – vi контейнеров, затраты на транспортировку одного контейнера на этот склад – gi, а стоимость хранения x контейнеров – ci(x). Требуется развезти все прибывшие контейнеры по складам, чтобы суммарные затраты на транспортировку и хранение были минимальны. Исходные данные задачи приведены в табл. 2.1 и 2.2. Таблица 2.1
gi vi
1 0,5 2
2 1 3
Склады 3 4 1,2 1,5 3 5
5 2 5 Таблица 2.2
x 1 2 3 4 5
c1(x) 2 4 − − −
c2(x) 1,5 2 3 − −
c3(x) 1 2 3 − −
c4(x) 0,5 1 1,5 2 2,5
c5(x) 0,3 0,5 1 1,5 2
Решение. Для записи математической постановки задачи введем функции hi(x) = gix + ci(x), i = 1, …, 5, которые задаются табл. 2.3. Тогда математическая модель имеет следующий вид:
17
5
∑
hi(xi) →
i =1
min ;
xi ∈{0 ,1,..., vi }
5
∑
xi = 8.
i =1
Таблица 2.3 x 1 2 3 4 5
h1(x) 2,5 5 − − −
h2(x) 2,5 4 6 − −
h3(x) 2,2 4,4 6,6 − −
h4(x) 2 4 6 8 10
h5(x) 2,3 4,5 7 9,5 12
Это распределительная задача, и для нее справедливы рекуррентные соотношения S1(y) = h1(y), y = 0, 1, …, 8; Sk(y) = min [ Sk-1(y − x) + hk(x)], k = 2, …, 5; y = 0, 1, …, 8. 0≤ x≤ min{ y ,vk }
Прямой ход. В результате прямого хода заполняем табл. 2.4, в которую помещены значения Sk(y), а через дробь (/) указаны условно-оптимальные решения, которые помогут восстановить оптимальное решение на этапе обратного хода. Таблица 2.4 y 0 1 2 3 4 5 6 7 8
S1(y) 0 2,5 / 1 5/2 − − − − − −
S2(y) 0 2,5 / 0 4/2 6/3 8,5 / 3 11 / 3 − − −
S3(y) 0 2,2 / 1 4/0 6/0 8,2 / 1 10,4 / 2 12,6 / 3 15,1 / 3 17,6 / 3
S4(y) 0 2/1 4/0 6/0 8/1 10 / 2 12 / 3 14 / 4 16 / 5
S5(y)
16 / 0
Здесь следует сделать несколько замечаний: 1) прочерк в клетке таблицы следует считать «бесконечностью», так как при соответствующих значениях параметров допустимого решения не существует; 18
2) условно-оптимальных решений (как и оптимальных) может быть несколько. Для получения одного из оптимальных решений достаточно хранить любое условно-оптимальное решение; 3) значения функции S5(y) для y = 0, 1, …, 7 вычислять нет необходимости. Эти значения понадобились бы при вычислении S6(y), но в этом нет необходимости, так как всего 5 складов. Итак, в результате работы прямого хода алгоритма найдено оптимальное значение целевой функции S* = S5(8) = 16 и оптимальное значение последней переменной x *5 = x5(8) = 0. Обратный ход. Так как на 5-й склад в оптимальном решении не надо везти ни одного контейнера (x *5 = 0), то их нужно развести по первым *
4-м складам. Следовательно, y *4 = 8 − x5 = 8. Вот почему для определения оптимального значения предпоследней переменной достаточно обратиться к клетке табл. 2.4 со значением S4(8). Имеем x *4 = x4(8) = 5. Значит, на 4-й склад будет отправлено 5 контейнеров. Следовательно, еще 3 нужно развести по первым 3-м складам, т. е. y *3 = 8 − x *4 = 3. Клетка S3(3) табл. 2.4 содержит условно-оптимальное значение x3(3) = 0, поэтому x *3 = 0 и *
y *2 = 3 − x3 = 3. В клетке табл. 2.4 со значением S2(y *2 ) = S2(3) хранится также значение условно-оптимальной переменной x2(3) = 3. Значит, x *2 = 3 *
и y 1* = 3 − x2 = 0, т. е. все контейнеры распределены и на 1-й склад ни один из них не повезут. Окончательно имеем, что оптимальный вектор рассматриваемой задачи x* = (0, 3, 0, 5, 0) приводит к минимальным затратам S* = 16, связанным с перевозкой и хранением 8-ми контейнеров. В табл. 2.4 помечены ячейки, по значениям которых было восстановлено оптимальное решение на этапе обратного хода алгоритма. Заметим, что для вычисления значений Sk(y) нужны значения лишь предыдущего столбца Sk-1(y). Не обязательно хранить всю таблицу. Правда, при этом мы потеряем значения условно-оптимальных решений, что приведет к увеличению трудоемкости. Таким образом, можно реализовать вариант алгоритма с трудоемкостью O(n2Y2), уменьшив требуемую память до величины O(Y). Такая реализация называется релаксационным алгоритмом *
ДП. Она состоит из (n − 1)-го прямого хода решения задач , k = n, n − 1, …, 2. В результате первого прямого хода будет найдено оптимальное значение целевой функции исходной задачи и последняя *
*
*
компонента вектора решения x n , что позволит определить y n−1 = Y − x n . 19
*
Затем решаем задачу и получаем x *n−1 . Продолжая выпол*
нение прямого хода для задач , k = n − 2, …, 2, определим оптимальное решение исходной задачи. Пример 2.3. Решить задачу из примера 2.2 релаксационным алгоритмом динамического программирования. Решение. Выполняя прямой ход для исходной задачи <5, h, 8>, найдем * S = 16 и x *5 = 0. Значит, y *4 = 8 − 0 = 8. Теперь выполним прямой ход для задачи <4, h, 8>. Получим x *4 = 5. Следовательно, y *3 = 8 − 5 = 3. Выполним прямой ход для задачи <3, h, 3>. Имеем x *3 = 0. Следовательно, y *2 = 3 − 0 = 3. Выполним прямой ход для задачи <2, h, 2> и получим x *2 = 3. Очевидно, y 1* = 3 − 3 = 0 и x 1* = 0. 2.2. Задача о ранце Задача о ранце (ЗР) формулируется следующим образом. Пусть имеется множество предметов k = 1, …, n, каждый из которых имеет объем (вес) ak ≥ 0 и ценность fk(xk). Требуется заполнить ранец предметами, суммарная ценность которых максимальна, а суммарный объем не превосходит емкости ранца A. Задачу, математическая модель которой имеет вид n
∑f k =1
k
( xk ) → n
∑a x k =1
k k
max;
x = ( x1 ,..., x n )∈Z +n
≤ A,
обозначим и поместим в семейство подобных задач {, k = 1, …, n, 0 ≤ α ≤ A}. Пусть Sk(α) – оптимальное значение целевой функции задачи . Справедливы рекуррентные соотношения S1(α) = max f1(x1), 0 ≤ α ≤ A; x1 =0,...,[α / a1 ]
Sk(α) =
max
xk =0,...,[α / ak ]
{ Sk-1(α − akxk) + fk(xk)}, k = 2, …, n, 0 ≤ α ≤ A,
которые верны для любых ak и fk. Для численной реализации схемы достаточно предположить целочисленность ak. В этом случае α ∈ {0, …, A}, где A также можно считать целым числом.
20
Подробнее рассмотрим линейную задачу о ранце, которая имеет вид
⎧n ⎪∑ ck xk → max; { xk } ⎪ k n=1 ⎪ (I) ⎨∑ ak xk ≤ A; ⎪ k =1 ⎪ x ∈ Z , k = 1,..., n. + ⎪ k ⎩ Обозначим эту задачу и поместим в семейство {, 0 ≤ α ≤ A}. Пусть S(α) – оптимальное значение функционала задачи . Теорема 2.2. Справедливо соотношение S(α) =
max
k =1,...,n|ak ≤α
{S(α − ak) + ck}, 0 ≤ α ≤ A.
(2.6)
Когда в результате прямого хода значения S(α), α = 0, …, A вычислены, можно восстановить оптимальный вектор x* следующим образом. Сначала положим x*= 0, α*= А. Затем последовательно выполним шаги, на каждом из которых найдем индекс k, при котором выполняется равенство *
*
S(α*) = S(α*− ak) + ck , ak ≤ α*. Положим xk = xk + 1; α* = α* − ak и повторим шаг. Если допустимого индекса k нет, тогда полученный вектор x* оптимален. Использование рекуррентных соотношений (2.6) в случае целочисленных ak приводит к трудоемкости O(An) и объему требуемой памяти O(A + n). Наряду с задачей (I) рассмотрим задачу
⎧n ⎪∑ ak xk → min; {xk } ⎪ k n=1 ⎪ (II) ⎨∑ ck xk ≥ B; ⎪ k =1 ⎪x ∈ Z n , + ⎪⎩ которую обозначим и назовем обратной к задаче (I). Как и ранее, поместим задачу (II) в семейство {, 0 ≤ β ≤ B} и обозначим через Q(β) оптимальное значение целевой функции, а через x0(β) – оптимальное решение задачи . Справедливы рекуррентные соотношения 21
Q(0) = 0; Q(β) = min {Q(max{0, β − ck}) + ak}, 0 ≤ β ≤ B. 1≤ k≤n
Лемма 2.1. Функция Q(β) не убывает. ~ ~ Теорема 2.3. Пусть β = max{β| Q(β) ≤ A, β ≥ 0}. Тогда S(A) = β и оп~ ~ тимальное решение x0( β ) задачи является также оптимальным решением задачи . Из неубывания функции Q(β) и утверждений теоремы следует, что S* = min{β| A < Q(β + 1), β = 0, 1, …}. Это позволяет построить другой алгоритм решения задачи (I): − на этапе прямого хода находим элементы таблицы Q(β) по рекуррентным соотношениям для задачи (II), последовательно полагая β = ~ ~ ~ 0,1,…, пока для некоторого β не получим А< Q( β +1). Это значение β и есть оптимальное значение целевой функции S* задачи < n, ≤ A >; − по полученной таблице {Q(β), β = 0, 1, …, S*} находим оптимальное решение x0(S*) обратной задачи , совпадающее с искомым решением x*(A) прямой задачи < n, ≤ A >. Справедлива также следующая теорема. Теорема 2.4. Пусть α~ = min{α| S(α) ≥ B, α ≥ 0}. Тогда Q(В) = α~ и оптимальное решение x*( α~ ) прямой задачи < n, ≤ α~ > является также оптимальным решением x0(В) обратной задачи . Утверждения последних двух теорем позволяют осуществлять переход от прямой задачи к обратной и наоборот. В каких случаях этот переход оправдан? Отметим два: 1) если в прямой (обратной) задаче параметры ak (ck) не целочисленные, а ck (ak) целочисленные; 2) если в прямой (обратной) задаче число A (B) большое и ak (ck) достаточно большие параметры, чтобы быстро выполнилось неравенство A < Q(β + 1) (S(α − 1) < B). В первом случае переход к обратной (прямой) задаче необходим для конечности реализации алгоритма. Во втором − переход к обратной (прямой) задаче может уменьшить трудоемкость.
22
Проиллюстрируем решение прямой задачи (ПЗ) путем перехода к обратной задаче (ОЗ) на примере булевой задачи о ранце. Запишем обе задачи:
⎧n ⎪∑ ri xi → max; { xi } ⎪ i =n1 (ПЗ) ⎪ ⎨∑ hi xi ≤ b; ⎪ i =1 ⎪ x ∈ {0,1}, i = 1, ..., n. ⎪⎩ i
⎧n ⎪∑ hi xi → min; { xi } ⎪ i =n1 ⎪ (ОЗ) ⎨∑ ri xi ≥ d ; ⎪ i =1 ⎪ x ∈ {0,1}, i = 1, ..., n. ⎪⎩ i
Так как переменные принимают два значения, рекуррентные соотношения для ОЗ запишем в виде
⎧0, y = 0; ⎪ Q1(y) = ⎨ h1 , 0 < y ≤ r1 ; , y = 0, …, d; ⎪ +∞, y > r ; ⎩ 1 ⎧Q ( y ), xk = 0; ⎫ Qk(y) = min ⎨ k −1 ⎬ , k = 2, …, n, y = 0, …, d. h Q (max{ 0 , y r }), x 1 ; + − = k −1 k k ⎩ k ⎭ Величины Qk(y), согласно приведенным выше утверждениям, нужно вычислять увеличивая y = 0, 1, … , пока не будет выполнено неравенство A < Q(β + 1). Тогда оптимальное значение функционала ПЗ S* = β и решение ОЗ с d = β будет оптимальным и для ПЗ. Разберем следующий пример. Пример 2.4. Пусть параметры ПЗ заданы табл. 2.5, а b = 110.
Таблица 2.5 i ri hi
1 6 45
2 5 33
3 4 28
4 3 16
5 2 13
6 1 9
Решение. Решение ПЗ приведет к заполнению таблицы размерностью 6 × 110. Чтобы избежать громоздких расчетов, перейдем к ОЗ и в процессе работы прямого хода алгоритма ДП вычислим Qk(y), k = 1, …, 6 для тех y = 0, 1, …, для которых выполняются неравенства Qk(y) ≤ 110. Прочерками в таблице обозначим бесконечно большие величины (когда нет допустимых решений). В столбцах, соответствующих Q4, Q5, Q6, вычисления прекращены, как только соответствующие величины стали больше b = 110. Кроме значений Qk(y), отразим в табл. 2.6 (через дробь) в соответствующей ячейке также значение условно-оптимального решения. Если условнооптимальных решений несколько, то мы запоминаем одно из них. 23
Обратный ход. Максимальное значение y, при котором Q6(y) = 107 ≤ ≤ b = 110, равно 16. Следовательно, оптимальное значение целевой функции ПЗ S* = 16. При этом условно-оптимальное решение x 06 (16) = 0 определяет значение последней компоненты оптимального вектора ПЗ x *6 = 0. 5
Отсюда следует, что
∑
rixi ≥ 16. Вот почему для определения x *5 следует
i =1
воспользоваться ячейкой Q5(16), в которой условно-оптимальное решение определяет x *5 = 1. Значит,
4
∑
rixi ≥ 16 − r5 = 16 − 2 = 14. Переходим в
i =1
ячейку Q4(14) табл. 2.6, откуда определяем x *4 = 1. Таблица 2.6 y 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Q1 0 45 / 1 45 / 1 45 / 1 45 / 1 45 / 1 45 / 1 − − − − − − − − − − −
Q2 0 33 / 1 33 / 1 33 / 1 33 / 1 33 / 1 45 / 1 78 / 1 78 / 1 78 / 1 78 / 1 78 / 1 − − − − − − 3
Следовательно,
∑
Q3 0 28 / 1 28 / 1 28 / 1 28 / 1 33 / 1 45 / 1 61 / 1 61 / 1 61 / 1 73 / 1 78 / 0 106 / 1 106 / 1 106 / 1 106/1 − −
Q4 0 16 / 1 16 / 1 16 / 1 28 / 1 33 / 1 44 / 1 44 / 1 49 / 1 61 / 0 73 / 0 77 / 1 77 / 1 89 / 1 94 / 1 106 / 0 122 / 1 −
Q5 0 13 / 1 13 / 1 16 / 0 28 / 0 29 / 1 41 / 1 44 / 0 49 / 0 57 / 1 62 / 1 74 / 1 77 / 0 89 / 0 90 / 1 101 / 1 107 / 1 119 / 1
Q6 0 9/1 13 / 0 16 / 0 25 / 1 29 / 0 38 / 1 44 / 0 49 / 0 57 / 0 62 / 0 71 / 1 77 / 0 86 / 1 90 / 0 99 / 1 107 / 0 116 / 0
rixi ≥ 14 − r4 = 14 − 3 = 11. Значение x *3 = 0 остав-
i =1
ляет нас в той же строке таблицы, но переводит в предыдущий столбец, из 24
которого имеем x *2 = 1. Значит, r1x1 ≥ 11 − r2 = 11 − 5 = 6. Шестая строка первого столбца определяет первую компоненту оптимального вектора x 1* = 1 и решение задачи x* = (1, 1, 0, 1, 1, 0). 2.3. Задача о ближайшем соседе
Рассмотрим проблему оптимального разбиения линейного объекта на участки, известную под названием задача о ближайшем соседе. Пусть задано целое положительное число M и неотрицательная функция f(x, y), отражающая затраты, связанные с «обслуживанием» отрезка [x, y] ⊆ [0, M]. Требуется разбить отрезок [0, M] на n частей таким образом, чтобы суммарные затраты, соответствующие этому разбиению, были минимальны. Ниже приведена математическая постановка задачи:
⎧n ⎪∑ f ( xk −1 , xk ) → min; x ⎨ k =1 ⎪⎩0 = x0 ≤ x1 ≤ ... ≤ xn = M , которую обозначим . Пусть Sn(M) – оптимальное значение целевой функции задачи , которую поместим в семейство задач {, k = 1, …, n, y = 1, …, M}. Пусть Sk(y) – оптимальное значение целевой функции задачи . Справедливы рекуррентные соотношения:
⎧⎪ f (0, y ), k = 1, y = 1, ..., M ; {S k −1 ( x ) + f ( x, y )}, k = 2, ..., n; ⎪⎩1min ≤ x≤ y
Sk(y) = ⎨
y = 1, ..., M .
Пример 2.5. Решить задачу <4, 8> с функций f(x, y), заданной табл. 2.7. Таблица 2.7 x/y 0 1 2 3 4 5 6 7 8
1 3 0 − − − − − − −
2 19 6 0 − − − − − −
3 24 18 11 0 − − − − −
4 41 26 19 13 0 − − − − 25
5 42 39 35 25 3 0 − − −
6 63 48 44 27 15 3 0 − −
7 66 56 55 45 24 16 12 0 −
8 83 77 56 53 37 27 21 16 0
Решение. Прямой ход. Пользуясь рекуррентными соотношениями, заполним табл. 2.8, в каждой ячейке которой поместим соответствующее значение Sk(y), k = 1, …, 4, y = 0, …, 8 и через дробь (/) условнооптимальное решение x(y), которое соответствует правой точке оптимального разбиения отрезка [0, y]. Обратный ход. На последнем шаге прямого хода найдены минимальные затраты S* = S4(8) = 59, соответствующие оптимальному разбиению исходного отрезка [0, 8], и оптимальное значение последней точки разбиения x *3 = 5. Следовательно, отрезок [0, 5] необходимо оптимально разбить на 3 части. Значение x *2 получим как условно-оптимальное решение, соответствующее величине S3(5) табл. 2.8: x *2 = 4. Последней точкой оптимального разбиения отрезка [0, 4] является x 1* = 1. В результате получили следующие точки оптимального разбиения исходного отрезка [0, 8] на 4 части: x *0 = 0, x 1* = 1, x *2 = 4, x *3 = 5, x *4 = 8. В табл. 2.8 выделены ячейки, по значениям которых восстанавливается оптимальное решение. Таблица 2.8 y 0 1 2 3 4 5 6 7 8
S1(y) 0 3 19 24 41 42 63 66 83
S2(y) 0 3/0 9/1 21 / 1 29 / 1 42 / 0 45 / 5 58 / 5 69 / 5
S3(y) 0 3/0 9/1 20 / 2 28 / 2 32 / 4 44 / 4 53 / 4 65 / 2
S4(y) 0 3/0 9/1 20 / 2 28 / 2 31 / 4 35 / 5 48 / 5 59 / 5
Методом ДП можно решить также задачу о ближайшем соседе, в которой число отрезков разбиения n не задано: ⎧ n f ( x k −1 , x k ) → min ⎪ x ,n ⎨ k =1 ⎪0 = x < x < ... < x = M , n > 0, 0 1 n ⎩
∑
которую обозначим <M>∈{|y = 1, …, M}. Эту задачу можно свести к последовательности задач , n = 1, …, M, вычислить Sn(M) и найти n* = arg min{Sn(M), n = 1, …, M}. Такой подход имеет вычислительную сложность O(M3) и требует память O(n*M). Однако для такой задачи справедливы простые рекуррентные соотношения: 26
~ S (y) =
min
x =0,1,..., y −1
~ S (0) = 0; ~ { S (x) + f(x,y)}, y = 1, …, M.
Заметим, что в постановке задачи мы заменили нестрогие неравенства на строгие. Это можно сделать, если f(x, x) ≥ 0. Таким образом, когда оптимальное решение не единственно, будет найдено то из них, в котором n минимально. Пример 2.6. Решить задачу из примера 2.5 с произвольным n > 0. ~ Решение. Прямой ход. Вычислим значения S (y) для y = 0, 1, …, 8 и запомним, как и прежде, соответствующие условно-оптимальные решения (табл. 2.9). Таблица 2.9 y ~ S (y)
0 0
1 3/0
2 9/1
3 20 / 2
4 28 / 2
5 31 / 4
6 34 / 5
7 46 / 6
8 55 / 6
Обратный ход. Имеем минимальные затраты, связанные с разбиением ~ ~ отрезка [0, 8] на оптимальное количество частей, S* = S (M) = S (8) = 55 и последнюю точку оптимального разбиения, равную 6. Здесь необходимо отметить, что количество точек оптимального разбиения неизвестно, и мы не можем сказать, какой по счету является точка 6. Следующей (справа) точкой разбиения является 5 (см. столбец 6 табл. 2.9), затем – 4, 2 и 1. Значит, x *0 = 0, x 1* = 1, x *2 = 2, x *3 = 4, x *4 = 5, x *5 = 6, x *6 = 8. Следовательно, n*= 6. Если n является переменной, для которой дополнительно требуется выполнение неравенств a ≤ n ≤ b, то такую задачу о ближайшем соседе следует решать в четыре этапа: 1) решить задачу с произвольным n > 0. Получим некоторое оптимальное значение n*. Если n* ∈ [a, b], то задача решена. Иначе переходим к выполнению следующего этапа; 2) выполнить прямой ход для задачи с фиксированным значением n = b; 3) найти n*, для которого S n* (M) = min Sn(M); a ≤n ≤b
4) для восстановления оптимального решения осуществить обратный ход при n = n*. Пример 2.7. Решить задачу из примера 2.5 с количеством отрезков разбиения n, удовлетворяющим неравенствам 2 ≤ n ≤ 5. Решение. Этап 1. Из предыдущего примера имеем, что n*= 6, поэтому * n ∉ [2, 5]. 27
Этап 2. Положим n = b = 5 и выполним прямой ход для задачи <5, 8>. Результат помещен в табл. 2.10, в которой, как и прежде, кроме значений Sk(y), k = 1, …, 5, y = 0, …, 8, в соответствующие ячейки через дробь (/) помещены условно-оптимальные решения. Этап 3. Найдем n*, для которого S n* (8) = min Sn(8) = min{69, 65, 59, 56} = 56. n = 2,...,5
Имеем n*= 5. Этап 4. Обратный ход для n*= 5 позволяет восстановить оптимальное разбиение для последней задачи: x *0 = 0, x 1* = 1, x *2 = 4, x *3 = 5, x *4 = 6, x *5 = 8. Таблица 2.10 y 0 1 2 3 4 5 6 7 8
S1(y) 0 3 19 24 41 42 63 66 83
S2(y) 0 3/0 9/1 21 / 1 29 / 1 42 / 0 45 / 5 58 / 5 69 / 5
S3(y) 0 3/0 9/1 20 / 2 28 / 2 32 / 4 44 / 4 53 / 4 65 / 2
S4(y) 0 3/0 9/1 20 / 2 28 / 2 31 / 4 35 / 5 48 / 5 59 / 5
S5(y)
56 / 6
В табл. 2.10 выделены ячейки, значения которых позволяют осуществить обратный ход и получить оптимальное решение.
Упражнения 1. Решить распределительную задачу, в которой fi(xi) = f(xi), i = 1, …, n и функция f – строго выпуклая и дифференцируемая. 2. Решить линейную задачу о ранце без требования целочисленности переменных. 3. Имеется 8 предметов, каждый из которых характеризуется своей ценностью и весом. Определить набор предметов максимальной ценности, общий вес которых не превосходит 55, если исходные данные заданы следующей таблицей: 28
Номер предмета Вес предмета Стоимость предмета
1 2 4
2 8 2
3 17 3
4 4 1
5 26 5
6 2 2
7 23 10
8 9 8
4. Завод может производить 4 вида продукции. Обозначим gi(x) – количество единиц сырья для производства x единиц продукции i-го вида, ci – доход от реализации единицы продукции i-го вида. Пусть всего имеется 50 единиц сырья. Требуется определить, сколько производить продукции каждого типа, чтобы максимизировать доход, если доходы от реализации единицы продукции заданы таблицей 1 2
i ci
2 3
3 1
4 1
а расход сырья на единицу продукции − таблицей x 1 2 3 4 5
g1 15 25 35 44 48
g2 20 30 35 40 50
g3 20 21 22 23 28
g4 15 18 20 23 25
5. Разбить отрезок [0, 8] с минимальными затратами на не более чем 4 части, если затраты f(x, y), связанные с отрезком [x, y] характеризуются следующей таблицей: x/y 0 1 2 3 4 5 6 7 8
0 0 − − − − − − − −
1 0 0 − − − − − − −
2 14 7 0 − − − − − −
3 21 8 9 0 − − − − −
4 95 26 5 0 0 − − − −
29
5 77 100 1 8 1 0 − − −
6 58 59 88 1 9 2 0 − −
7 81 60 98 78 10 0 2 0 −
8 83 98 64 97 82 0 8 8 0
6. На рисунке изображено дерево T = (V, E) с корнем в r ∈ V и весами вершин cv, v ∈ V. r 1 −2
2 2
−1
3 −8
4 −6 5 −1 6
9 5
8 2
−1 7
10 3
11 −2
12 13 3 3
С помощью динамического программирования найти поддерево с корнем в r максимального веса.
30
3. Сетевые модели планирования и управления проектами Проектом называют совокупность работ, направленных на достижение некоторой цели. Работы проекта, как правило, частично упорядочены. Выполнение работы не может быть начато до завершения всех предшествующих ей работ. Продолжительность выполнения каждой работы известна. Предполагается, что начатая работа продолжается без перерыва до ее завершения. Проект считается выполненным, если выполнены все его работы. Сетевая модель – это графическое представление проекта. Она позволяет найти минимальные сроки завершения проекта и отдельных работ, а также определить множество критических работ, увеличение продолжительности выполнения любой из которых приводит к увеличению времени выполнения всего проекта. 3.1. Построение сетевой модели проекта Пример 3.1. (строительство дома). При строительстве дома необходимо выполнить такие работы, как создание подъездных дорог, подготовка котлована, возведение фундамента, подводка коммуникаций, монтаж здания, крыши, отделочные работы и т. п. Каждую работу проекта можно начать выполнять только после завершения всех предшествующих ей работ. Например, фундамент возводится только после подготовки котлована. В то же время некоторые работы, например подводка коммуникаций и отделочные работы, могут осуществляться параллельно. Сетевая модель проекта представляет собой графическое описание плана работ, показывающее взаимосвязь между всеми работами, выполнение которых необходимо для завершения проекта. В терминах теории графов сетевая модель – это ориентированный граф без контуров и петель с неотрицательными весами вершин или дуг. При анализе проектов используются два типа сетевых моделей, которые условно можно назвать: 1) «работы-вершины»; 2) «работы-дуги». В сетевой модели первого типа вершины являются образами работ, а дуги служат для отображения отношения предшествования между работами. В модели второго типа, наряду с работами-дугами, рассматриваются также новые понятия – события, которым соответствуют вершины сети. 31
Событие отражает результат – завершение одних работ и возможность начала других. Направление дуги сети задает отношение предшествования работ проекта. Указанные выше модели являются эквивалентными в том смысле, что для любого проекта можно построить как одну, так и другую модель. В данном пособии, как и в [1, 3], рассматриваются сетевые модели типа «работы-дуги». В таких моделях для задания соотношения предшествования работ-дуг часто приходится вводить фиктивные дуги нулевой длины (продолжительность выполнения соответствующих фиктивных работ равна нулю). Нефиктивные дуги будем называть также фактическими. Определение 3.1. Сети с одним и тем же множеством фактических дуг назовем эквивалентными, если они задают одно и то же отношение предшествования дуг-работ. Вершину, не имеющую входящих в нее дуг, будем называть входом, а вершину, из которой не выходит ни одной дуги, – выходом сетевой модели. Без ограничения общности можно считать, что сетевая модель имеет один вход и один выход. Если исходная сеть не обладает этим свойством, то можно ввести фиктивный вход (выход) и связать с ним все входы (выходы) фиктивными дугами. Полученная сеть, очевидно, эквивалентна исходной сети. Пример 3.2. Привести сетевую модель, изображенную на рис. 3.1 к эквивалентной сети с одним входом и одним выходом. 3
9 12
1 6 10 4 7 11 2 8
5
Рис. 3.1 Решение. Входами сети являются вершины 2, 4 и 6. Введем дополнительную вершину 13 и свяжем ее фиктивными дугами (13, 2), (13, 4) и (13, 6) со всеми входами. 32
Вершины 11 и 12 являются выходами сетевой модели. Добавим вершину 14 и соединим с ней фиктивными дугами (11, 14), и (12, 14) все выходы сетевой модели. 3
9 12
1 6
14
10
13
4 7 11 2 8
5
Рис. 3.2 На рис. 3.2 представлена новая сеть с одним источником 13 и одним стоком 14. Фиктивные дуги изображены пунктирными линиями. 3.2. Упрощение сетевой модели В ряде случаев исходную сеть можно упростить, исключив часть вершин и фиктивных дуг. Введем следующие обозначения: S = ( X , U ) – сеть с множеством вершин X и множеством дуг U; i(j) – начальная вершина дуги j; k(j) – конечная вершина дуги j; U – множество фактических дуг сети; Ui – множество дуг из U , принадлежащих объединению всех путей из входа сети в вершину i; Ui – множество дуг из U , принадлежащих объединению всех путей из вершины i в выход сети. Зафиксируем пару вершин i и k, для которых 1) не существует дуги j ∈ U , инцидентной одновременно i и k; 2) не существует дуг p, q ∈ U , для которых – i(p) = i(q), где k(p) = I и k(q) = k или – k(p) = k(q), где i(p) = i и i(q) = k.
33
Результатом операции склеивания вершин i и k будет сеть S′, полученная из исходной сети S удалением вершины k и замыканием инцидентных ей дуг на вершину i. Когда в результате склейки между какой-то парой вершин i и l в S′ будет более одной дуги: – если среди них есть фактическая дуга, то удаляются все параллельные ей фиктивные дуги; – если i и l в S′ связаны только фиктивными дугами, то все они кроме одной удаляются. Таким образом, если в исходной сети S дуга имела вершину k начальной (конечной), то в полученной сети S′ эта дуга имеет начальной (конечной) вершину i. Очевидно, в S′ существует путь из одной вершины в другую тогда и только тогда, когда такой путь есть в S. Эквивалентность сетей S и S′ проверяется с помощью следующего необходимого и достаточного условия. Пусть вершины i и k удовлетворяют условиям 1–2, описанным выше. Сеть S′, полученная из S склеиванием i и k и удалением k, эквивалентна S тогда и только тогда, когда выполняется хотя бы одно из условий: Ui = Uk или Ui = Uk . Пример 3.3. Упростить сетевую модель, представленную на рис. 3.3. 2
6 9
1
3
4
7
5
8
10
Рис. 3.3. Решение. Очевидно, для выполнения приведенных выше условий вершины – кандидаты на склеивание должны быть соединены фиктивной дугой. Рассмотрим такие пары вершин в данной сети. Вершины 4 и 5 удовлетворяют свойствам 1–2. Очевидно, U4 = {(1, 2),(2, 4),(1, 3),(3, 4)} = = U5. Следовательно, вершины 4 и 5 могут быть склеены. Для вершин 9 и 10 свойство 2 не выполняется, так как вершина 7 связана с обеими вершинами 9 и 10 фактическими дугами. Следовательно, 9 и 10 нельзя склеить.
34
Для вершин 2 и 6 свойства 1–2 выполняются, но U2 = {(1,2)} ≠ U6 = = {(1, 2), (2, 4), (1, 3), (3, 4), (4, 6)} и U2 = {(2, 4), (4, 6), (4, 7), (5, 8), (6, 9), (7, 9), (7, 10), (8, 10)} ≠ U6 = {(6, 9)}. Следовательно, вершины 2 и 6 не могут быть склеены с сохранением эквивалентности сетей. 3.3. Вычисление параметров сетевой модели Пусть задана сеть, вершины которой пронумерованы числами 1, …, n, а дуги – числами 1, …, m. Тогда сетевую модель можно представить списком дуг, каждая из которых закодирована числами: – j – номер дуги; – i(j) – номер начальной вершины дуги j; – k(j) – номер конечного вершины дуги j; – τj – длина дуги (длительность выполнения работы) j. Определение 3.2. Рангом Ri события i называется число дуг в пути максимальной (по числу дуг) длины, ведущему из входа сети в вершину i. Алгоритм Форда вычисляет ранги событий следующим образом: Шаг 0. Полагаем Ri = 0 для всех i = 1, …, n. Пусть в результате (k − 1) шагов найдены ранги Ri. Шаг k. Просматривая последовательно дуги (работы) j = 1, …, m, вычисляем Rk(j) = max{Rk(j), Ri(j) + 1}. Если на очередном шаге ранги всех вершин сети не изменились, то алгоритм завершает свою работу. Иначе полагаем k = k + 1 и повторяем шаг k. Пример 3.4. Найти ранги событий для сетевой модели, изображенной на рис. 3.4, где рядом с каждой дугой указан ее номер. 1
6 1
2 4
8 7
8 3
4
3 5
2
10
6
5
9 7
Рис. 3.4 Решение. На нулевом шаге полагаем Ri = 0 для всех вершин i = 1, …, 8. На первом шаге алгоритма последовательно просматриваем все дуги и пересчитываем ранги их концевых вершин: работа 1 = (1, 8) : R8 = max{R8, R1 + 1} = max{0, 0 + 1} = 1, работа 2 = (4, 1) : R1 = max{R1, R4 + 1} = max{0, 0 + 1} = 1, 35
R6 = max{R6, R8 + 1} = max{0, 1 + 1} = 2, и т. д. работа 3 = (8, 6) : Продолжая вычисления, получаем табл. 3.1. Таблица 3.1 Ранг События 1 2 3 4 5 6 7 8
Шаг 0
Шаг 1
Шаг 2
Шаг 3
0 0 0 0 0 0 0 0
1 2 1 0 3 2 3 2
1 3 1 0 4 3 3 2
1 3 1 0 4 3 3 2
На третьем шаге ранги событий не изменись. Следовательно, алгоритм завершает свою работу и ранги событий R1 = 1, R2 = 3, R3 = 1, R4 = 0, R5 = 4, R6 = 3, R7 = 3, R8 = 2. Определение 3.3. Нумерацию событий сетевой модели назовем правильной, если i(j) < k(j) для каждой работы j = 1, …, m. Правильную нумерацию событий (вершин сети) легко осуществить, зная их ранги. Вершинавход с рангом 0 получает номер 1. Вершины ранга 1 получают номера 2, …, n1, ранга 2 – номера n1 + 1, …, n2, и т. д. Пример 3.5. Осуществить правильную нумерацию событий в сетевой модели примера 3.4. Решение. Так как ранги событий найдены, то правильная нумерация событий осуществляется следующим образом: – входу (т. е. событию с рангом 0) приписываем номер 1; – событиям ранга 1 (событиям 1 и 3) – номера 2 и 3; – событиям ранга 2 (8) – номер 4; – событиям ранга 3 (6, 2 и 7) – номера 5, 6 и 7; – выходу (5) – номер 8. Определение 3.4. Длиной пути μ(i, k) из вершины i в вершину k во взвешенном графе назовем величину, равную сумме весов входящих в него дуг, которую обозначим |μ(i, k)|. Путь из i в k, имеющий максимальную длину, обозначим μ*(i, k). Далее предполагается правильная нумерация вершин, при которой, в частности, вершина 1 – это источник, а n – сток. Определение 3.5. Наиболее ранним временем наступления события i p
назовем величину T i = |μ*(1, i)|. 36
p
Величина T i соответствует минимально возможному времени выполнения всех работ, предшествующих событию i. p
Обозначим через Tкр = Tn критическое время проекта (минимальное время выполнения проекта), а через μ*(1, n) − критический путь сетевой модели. Работы и события, принадлежащие критическому пути, называются критическими. Задержка наступления любого критического события приведет к увеличению срока завершения всего проекта Tкр. Определение 3.6. Наиболее поздним временем наступления события i п
п
назовем величину T i = Tкр – |μ*(i, n)|. Величина T i равна максимальному времени свершения события i, не приводящему к увеличению времени выполнения всего проекта. p
п
Сегмент [T i , T i ] называется интервалом свободы события i. Для того чтобы событие i было критическим, необходимо и достаточно p Ti
п
= Ti .
Резервы времени выполнения работ – это величины, характеризующие максимально возможное время, на которое можно увеличить продолжительность выполнения работ или задержать начало их выполнения, чтобы время начала выполнения других работ не изменилось. Определение 3.7. Полным резервом времени выполнения работы j называется величина Π j = Tk ( j ) − Ti ( j ) − τ j . п
p
Необходимым и достаточным условием принадлежности работы критическому пути является равенство нулю ее полного резерва. Определение 3.8. Свободным резервом времени выполнения работы j называется величина Tk ( j ) − Ti ( j ) − τj. p
p
Свободный резерв может быть использован для выявления работ, задержка которых на эту величину не приводит к изменению полных резервов всех последующих работ. Наиболее ранние времена наступления событий могут быть найдены при помощи следующего алгоритма Форда: p
Шаг 0. Для каждого события i = 1, …, n полагаем Ti = 0. Пусть в результате (k − 1) шагов найдены времена Ti . p
Шаг k. Последовательно просматриваем все работы j = 1, …, m и вычисляем T
p
k( j)
{
}
= max Tk ( j ) , Ti ( j ) + τ j . p
p
p
Если все времена Ti не изменились, то алгоритм заканчивает свою работу. Иначе полагаем k = k + 1 и выполняем следующий шаг алгоритма. 37
Список дуг можно упорядочить таким образом, что Ti
p
будут найдены
за один просмотр работ. Пусть события пронумерованы правильно. Определение 3.9. Если для каждой пары дуг p и q, когда p∈ μ(1, i(q)), выполняется неравенство p < q, то говорят, что список дуг правильно упорядочен. Правильная упорядоченность дуг согласуется с отношением предшествования работ, т. е. если p предшествует q, то имеет место неравенство p < q. Для получения правильной упорядоченности дуг достаточно упорядочить их по номерам конечных вершин (при правильной нумерации последних). В вершине 1 не заканчивается ни одна дуга. Все дуги I2, входящие в вершину 2, получают номера 1, … , |I2|. Дугам I3, входящим в вершину 3, приписываются номера |I2| + 1, … , |I2| + |I3|, и т. д. p
Если дуги правильно упорядочены, то алгоритм Форда найдет T i за один просмотр дуг в порядке их нумерации j = 1, …, m. Приведем алгоритм Форда для вычисления наиболее поздних времен наступления событий: п
Шаг 0. Для каждого события i = 1, …, n полагаем T i = Tкр. Пусть в реп
зультате (k − 1) шагов найдены времена T i . Шаг k. Последовательно просматриваем все работы j = 1, …, m и вы-
{
}
числяем Ti ( j ) = min Ti ( j ) , Tk ( j ) − τ j . п
n
n
п
Если после выполнения очередного шага все времена T i не изменились, то алгоритм заканчивает работу. Иначе полагаем k = k + 1 и выполняем следующий шаг алгоритма. п
При правильно-упорядоченном списке работ величины T i находятся за один шаг алгоритма, если работы просматривать в обратном порядке j = m, … , 1. p
п
Когда величины T i и T i известны, остальные характеристики сетевой модели (критические работы, события, резервы и т. п.) могут быть найдены за один просмотр списка работ. Пример 3.6. Пусть сетевая модель задана табл. 3.2.
Таблица 3.2 Номер дуги 1 Дуга Длина дуги
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18
1–3 1–4 4–7 7–9 2–8 4–5 5–9 8–9 2–9 3–5 3–4 6–7 2–6 2–4 2–3 1–6 4–6 1–2 24 52 12 44 26 12 64 69 17 75 3
38
33 50 5
0
44 29 4
Требуется найти вход и выход сети, ранние и поздние времена наступления событий, время выполнения проекта, полные резервы времени для каждой работы-дуги, критические работы и пути. Нумерацию вершин и дуг не менять. Решение. Просматривая список дуг, выясняем, что вершина 1 не фигурирует в качестве концевой вершины ни одной дуги. Это вход сети. Аналогично для нахождения выходов сети определяем, какие из вершин не являются начальными вершинами дуг. Такая вершина одна – 9. Она является выходом сетевой модели. Найдем ранние времена наступления событий, используя алгоритм Форда. p
Полагаем T i = 0 для всех i = 1, … , 9. На первом шаге алгоритма просматриваем все работы и пересчитываем ранние времена наступления их концевых событий в соответствии с рекуррентными соотношениями алгоритма Форда. В частности, для первых двух работ имеем: работа 1 = (1, 3) :
T3 = max{ T3 , T1 +τ1} = max{0, 0 + 24} = 24,
работа 2 = (1, 4) :
T4 = max{ T4 , T1 +τ2} = max{0, 0 + 52} = 52.
p
p
p
p
p
p
Результаты вычислений ранних времен помещены в табл. 3.3, где в первом столбце находятся номера событий, а в верхней строке – номера шагов алгоритма. После третьего шага ранние времена наступления событий не изменились ни для одного из них, поэтому алгоритм завершает свою работу. Время выполнения проекта соответствует раннему времени наступлеp
ния события 9 и равно Tкр = T9 = 163.
Таблица 3.3 i/k 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0
1 0 4 24 52 99 81 64 26 128 39
2 0 4 24 52 99 81 114 30 163
3 0 4 24 52 99 81 114 30 163
Найдем поздние времена наступления событий. п
Положим Ti = Tкр = 163 для всех вершин i = 1, … , 9. Просматриваем последовательно все работы и пересчитываем поздние времена наступления событий, соответствующих концевым вершинам работ-дуг. Так для первых двух работ имеем: п
работа 1 = (1, 3): T1 = min{ T1 , T 3 − τ1 } = min{163, 163 − 24} = 139, п
п
работа 2 = (1, 4): T1 = min{ T1 , T4 − τ2 } = min{139, 163 − 52} = 111. п
п
п
Результаты вычислений помещены в табл. 3.4.
Таблица 3.4 i/k 1 2 3 4 5 6 7 8 9
0 163 163 163 163 163 163 163 163 163
1 20 24 24 57 99 86 119 94 163
2 0 24 24 57 99 86 119 94 163
3 0 24 24 57 99 86 119 94 163
Найдем полные резервы времени для каждой работы и поместим их в табл. 3.5. Таблица 3.5 Дуга j
1
2
3
4
5
6
7
8
9
10
Пj
0
5
55
5
64
35
0
64
142 0
11
12
13
14
15
16
17
18
30
5
32
48
20
42
5
20
Для примера приведем вычисления данной характеристики для первых двух работ: работа 1 = (1, 3) :
п
p
п
p
П1 = T 3 − T 1 − τ1 = 24 – 0 – 24 = 0,
работа 2 = (1, 4) : П2 = T 4 − T 1 − τ2 = 57 – 0 – 52 = 5. Критическими работами являются те, полный резерв времени которых равен нулю. В данном случае это работы 1, 7 и 10. Критическому пути принадлежат события, у которых ранние и поздние времена их свершения совпадают. В нашем примере это события 1, 3, 5, 9.
40
Упражнения 1.
Упростить сетевую модель, изображенную на рис. 3.5. 8
3
1
2
9
4
7 6
5
Рис. 3.5 2. 3.
Для сетевой модели из примера 3.6 вычислить ранги событий. Пусть сетевая модель задана табл. 3.6.
Таблица 3.6 Номер дуги 1 Дуга
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18
4–9 4–7 6–7 6–8 2–4 2–3 1–6 1–3 3–7 1–2 1–5 5–6 1–4 1–9 3–5 2–7 3–4 8–9
Длина дуги 1
52 6
13 65 52 47 20 34 30 33 64 47 60 30 66 36 44
Найти вход и выход сети, ранние и поздние времена наступления событий, время выполнения проекта, полный резерв времени для каждой работыдуги, критические работы и пути. Нумерацию вершин и дуг не менять.
41
4. Метод ветвей и границ Задачи дискретной оптимизации имеют конечное множество допустимых решений, которые теоретически можно перебрать и выбрать наилучшее (дающее минимум или максимум целевой функции). Практически же зачастую это бывает неосуществимо даже для задач небольшой размерности. В методах неявного перебора делается попытка так организовать перебор, используя свойства рассматриваемой задачи, чтобы отбросить часть допустимых решений. Наибольшее распространение среди схем неявного перебора получил метод ветвей и границ, в основе которого лежит идея последовательного разбиения множества допустимых решений. На каждом шаге метода элементы разбиения (подмножества) подвергаются анализу – содержит ли данное подмножество оптимальное решение или нет. Если рассматривается задача на минимум, то проверка осуществляется путем сравнения нижней оценки значения целевой функции на данном подмножестве с верхней оценкой функционала. В качестве оценки сверху используется значение целевой функции на некотором допустимом решении. Допустимое решение, дающее наименьшую верхнюю оценку, называют рекордом. Если оценка снизу целевой функции на данном подмножестве не меньше оценки сверху, то рассматриваемое подмножество не содержит решения лучше рекорда и может быть отброшено. Если значение целевой функции на очередном решении меньше рекордного, то происходит смена рекорда. Будем говорить, что подмножество решений просмотрено, если установлено, что оно не содержит решения лучше рекорда. Если просмотрены все элементы разбиения, алгоритм завершает работу, а текущий рекорд является оптимальным решением. В противном случае среди непросмотренных элементов разбиения выбирается множество, являющееся в определенном смысле перспективным. Оно подвергается разбиению (ветвлению). Новые подмножества анализируются по описанной выше схеме. Процесс продолжается до тех пор, пока не будут просмотрены все элементы разбиения. 4.1. Формальное описание Пусть рассматривается задача вида f(x) → min, x∈D
где f(x) – вещественная функция, а D – конечное множество допустимых решений. Пусть d ⊆ D. Функцию b(d), ставящую в соответствие множеству
42
d разбиение его на подмножества d1, ..., dN, N > 1, будем называть ветвлением. Вещественная функция Н(d) называется нижней границей для d, если 1) H(d) ≤ min f(x); x∈d
2) на одноэлементном множестве {x} верно равенство H({x}) = f(x). Алгоритм, реализующий метод ветвей и границ, состоит из последовательности однотипных шагов. На каждом шаге известен рекорд x0 и подмножества t1, t2, ... , tL непросмотренных решений. В начале работы алгоритма L = 1, t1 = D, x0 – произвольный элемент множества D или пустое множество (на пустом множестве положим значение функционала равным бесконечности). На каждом шаге алгоритм начинает работу с проверки элементов разбиения. Пусть проверяется множество tj. Множество tj отсекается в одном из двух, последовательно проверяемых случаев: а) если H(tj) ≥ f(x0); б) если H(tj) < f(x0) и найден такой элемент yj∈ tj, что f(yj) = min f(x)= x∈t j
= H(tj). В случае б происходит смена рекорда x0 = yj. Пусть t1, t2, ... , tM (M ≤ L) – неотсеченные множества (будем считать, что отсечены множества с номерами M + 1, ..., L). В случае M = 0 алгоритм заканчивает работу, и в качестве решения задачи принимается рекорд x0. При М ≥ 1 среди множеств t1, ..., tM выбирается множество для нового ветвления. Пусть таковым является множество t1. Тогда осуществляется ветвление b(t1) = (d1, ..., dN), в результате которого получаем список множеств d1, ..., dN, t2, ... , tM. Эти множества нумеруются числами от 1 до L, и начинается новый шаг алгоритма. Нетрудно убедиться в том, что описанный алгоритм находит оптимальное решение за конечное число шагов. Описанная последовательность действий является общей схемой метода ветвей и границ для решения задач на минимум. При решении конкретной задачи следует указать способы построения нижней и верхней оценок, метод ветвления, а также правило выбора перспективного множества для разбиения. При определении «перспективного» элемента разбиения в основном применяются две схемы: одновременного (многостороннего) и одностороннего ветвления. При одновременном ветвлении функция b может быть применена к любому элементу разбиения. Часто в качестве такого элемента выбирается подмножество tk с минимальной нижней границей H(tk)= min H(ti). 1 ≤i ≤ L
43
При одностороннем ветвлении номер разбиваемого подмножества известен заранее. В этом случае, не ограничивая общности, можно считать, что «перспективным» является подмножество t1. Отметим, что при односторонней схеме ветвления нет необходимости запоминать все элементы разбиения, достаточно иметь информацию о первом элементе разбиения и объединении остальных элементов. Разбиения множеств решений (ветвление) удобно представлять в виде дерева решений. На рис. 4.1 приведены примеры одновременной (а) и односторонней (б) схем ветвления. Каждая вершина дерева соответствует некоторому подмножеству решений. Дуги, исходящие из вершины, означают, что на некотором шаге это подмножество отсечь не удалось и оно было разбито на подмножества. Вершины, в которые входят эти дуги, соответствуют подмножествам, полученным в результате ветвления. Зачеркнутые висячие вершины означают отсеченные подмножества. Незачеркнутые висячие вершины соответствуют непросмотренным множествам, среди которых на следующем шаге алгоритма выбирается подмножество для дальнейшего ветвления.
a
б
Рис. 4.1. В схеме одностороннего ветвления выбирается первая (левая) вершина на нижнем уровне, а для схемы одновременного ветвления такой вершиной может быть любая. Алгоритм заканчивает работу, если зачеркнуты все висячие вершины дерева ветвлений. Графическое представление метода ветвей и границ иллюстрирует его суть – отсечение ветвей дерева поиска, которое осуществляется на основании сравнения нижней границы и значения функционала на рекорде. Это объясняет название метода. 44
При использовании описанной выше схемы для решения конкретной задачи необходимо ее уточнение, учитывающее особенности рассматриваемой задачи. В разделе 4.2 приведен пример реализации метода ветвей и границ для решения задачи коммивояжера. Пример 4.1. Построить полное дерево ветвления (без отсечений) для 3
задачи
∑ i =1
⎧ 3 x ≤2 ⎪∑ i fi(xi) → max , где множество D задано условиями ⎨ i =1 . x∈D ⎪⎩ x ∈ {0,1} i
Решение. Здесь исходное множество допустимых решений D разбито на два непересекающихся подмножества: векторы с фиксированным значением x1 = 1 и векторы с x1 = 0. Множество {x1 = 1} делится на два подмножества {x2 = 1} и {x2 = 0}. Множество {x1 = 1, x2 = 1} является одноэлементным (в силу ограничения задачи), поэтому x3 = 0. Множество {x1 = 1, x2 = 0} разбивается на два подмножества {x3 = 1} и {x3 = 0}. D
x1 = 0
x1 = 1
x2 = 1
x3 = 0
x3 = 1
x2 = 1
x2 = 0
x3 = 0
x3 = 1
x3 = 0
x2 = 0
x3 = 1
x3 = 0
Рис. 4.2 Аналогично множество {x1 = 0} разбивается на подмножества {x1 = 0, x2 = 1} и {x1 = 0, x2 = 0}, и т. д. Полное дерево ветвления изображено на рис. 4.2. 4.2. Решение задачи коммивояжера Напомним формулировку задачи коммивояжера (см. гл. 1). 45
Задан полный ориентированный граф G = (V, E) с множеством вершин V = {1, …, n} и множеством дуг E. Каждой дуге (i,j)∈ E приписана длина cij ≥ 0. В общем случае задача коммивояжера формулируется на произвольном графе, поэтому длины некоторых (в частности, не существующих) ребер могут быть сколь угодно большими. Так, считаем, что cii = + ∞. Требуется найти гамильтонов контур минимальной длины. Обозначим: – {i1, …, ip} – простой путь из i1 в ip ; – f(i1, …, in) – длина контура {i1, … , in, i1}. Будем считать, что i1 = 1. Подмножества допустимых решений зададим парой множеств (I, J), где – I = {i1, …, ip} – частичный маршрут (последовательность посещения первых p городов); – J = {j1, …, jq} ⊂ V \ I – совокупность запретов на переходы из последнего города ip частичного маршрута I. В случае p = n – 1 имеем q = 0 и пара (I, J) задает одноэлементное множество. Для случая p < n – 1 определим функцию ветвления, которая разбивает множество контуров (I, J) на два подмножества. Первое подмножество включает в себя контуры, в которых коммивояжер из конечного пункта частичного маршрута переезжает в некоторый фиксированный город, а второе – все контуры, в которых этот переезд запрещен. Для представления множеств разбиения выберем в V ′ = V \ ( I ∪ J ) некоторый элемент i. Если кроме элемента i в V′ есть только один элемент k, то искомые множества (I = {i1, …, ip, i}, J = ∅) и (I = {i1, …, ip, k}, J = ∅). В противном случае первое множество – (I = {i1, …, ip, i}, J = ∅), а второе – (I = {i1, …, ip}, J = {j1, …, jq, i}). Опишем один из способов вычисления нижней границы H(I, J) для подмножества (I, J). Будем считать, что i2 = 2, …, ip = p < n. Рассмотрим матрицу || cij′ ||, i, j = 1, …, n, в которой cij′ = + ∞ , i = 1, …, n, j ∈ I и
c′pj = +∞ , j ∈ {1, …, p − 1} ∪ J, а все остальные элементы cij′ = cij . Эти изменения в матрице расстояний сделаны для того, чтобы запрещенным маршрутам соответствовали бесконечные длины дуг. Введем величины αi = min cik′ , i = p, …, n, k =1, p +1,..., n
βk = min{cik′ − α i } , k = 1, p + 1, …, n i = p ,..., n
и определим нижнюю границу 46
p −1
H(I, J) =
∑c
n +1
n
i ,i +1
+
i =1
∑α i= p
i
+
∑β
i
,
i = p +1
полагая βn+1 = β1. Пример 4.2. Применяя метод ветвей и границ, решить задачу коммивояжера с матрицей расстояний, заданной табл. 4.1.
От города
Таблица 4.1
1 2 3 4 5
1 – 33 41 37 48
До города 2 3 4 48 27 31 – 28 44 28 – 40 35 29 – 48 25 29
5 43 43 36 46 –
Решение. Полагаем рекорд x0 равным пустому множеству и f(x0) = + ∞. Вычислим нижнюю границу на всем множестве допустимых решений D. В этом случае имеем p = 1 (коммивояжер находится в первом городе), (I = {1}, J = ∅), c′ik = cik для всех i, k = 1, …, 5. Находим: α1 = min c′1k = min {48, 27, 31, 43} = 27, k =1,2 ,...,5
α2 = min c′2k = min {33, 28, 44, 43} = 28, k =1,2 ,...,5
α3 = min c′3k = min {41, 28, 40, 36} = 28, k =1,2 ,...,5
α4 = min c′4k = min {37, 35, 29, 46} = 29, k =1,2 ,...,5
α5 = min c′5k = min {48, 48, 25, 29} = 25. k =1,2 ,...,5
β1 = min {c′i1 − αi} = min {33 – 28, 41 – 28, 37 – 29, 48 – 25}= i =1,...,5
= min{5, 13, 8, 23} = 5, β2 = min {c′i2 − αi} = min {48 – 27, 28 – 28, 35 – 29, 48 – 25}= i =1,...,5
= min{21, 0, 6, 23}= 0, β3 = min {c′i3 − αi} = min {27 – 27, 28 – 28, 29 – 29, 25 – 25}= i =1,...,5
= min{0, 0, 0, 0} = 0,
47
β4 = min {c′i4 − αi} = min {31 – 27, 44 – 28, 40 – 28, 29 – 25}= i =1,...,5
= min{4, 16, 12, 4} = 4, β5 = min {c′i5 − αi} = min {43 – 27, 43 – 28, 36 – 28, 46 – 29}= i =1,...,5
= min{16, 15, 8, 17} = 8. Результаты вычислений можно представить в табл. 4.2, где к матрице ||c′ik|| добавлены столбец α и строка β. Таблица 4.2 1 – 33 41 37 48 5
1 2 3 4 5
β
2 48 – 28 35 48 0
3 27 28 – 29 25 0
4 31 44 40 – 29 4
α
5 43 43 36 46 – 8
27 28 28 29 25
Находим нижнюю границу:
H(D) = H({1},∅) =
p −1
∑c i =1
0
=
∑c i =1
i , i +1
∑α i =1
+
∑α
i
+
i= p
5
+
n +1
n
i , i +1
∑β
i
=
i = p +1 5
i
+ β1 + ∑ β i
=
i =2
= 0 + (27 + 28 + 28 + 29 + 25) + (5 + 0 + 0 + 4 + 8) = 154. Найдем верхнюю оценку на рассматриваемом множестве допустимых решений, построив допустимое решение жадным алгоритмом: «иди в ближайший допустимый город, где еще не был». Получим контур y = (1, 3, 2, 5, 4, 1). Значение целевой функции f(y) = 27 + 28 + 43 + 29 + 37 = 164. Поскольку f(y) < f(x0), то найден новый рекорд x0 = y = (1, 3, 2, 5, 4, 1), который дает верхнюю границу f(x0) = 164. Поскольку H({1}, ∅) < f(x0), то осуществляем ветвление единственного множества D на два подмножества: 1) I = {1, 2}, J = ∅, 2) I = {1}, J = {2}. Рассмотрим первое подмножество. В этом случае p = 2, а матрица ||c′ik|| принимает вид табл. 4.3 (затемненные элементы матрицы соответствуют недопустимым переходам, их значения равны бесконечности).
48
Таблица 4.3 1 2 3 4 5
1 – 33 41 37 48
2 48 – 28 35 48
3 27 28 – 29 25
4 31 44 40 – 29
5 43 43 36 46 –
Вычислив величины α и β, получаем табл. 4.4.
Таблица 4.4 1 2 3 4 5
β
1 – 33 41 37 48 5
2 48 – 28 35 48 —
3 27 28 – 29 25 0
4 31 44 40 – 29 4
5 43 43 36 46 – 0
α — 28 36 29 25
Нижняя граница 1
H({1, 2}, ∅ ) =
∑ ci,i+1 + i =1
5
5
i =2
i =3
∑ αi + β1 + ∑ βi
=
= 48 + (28 + 36 + 29 + 25) + (5 + 0 + 4 + 0) = 175 > f(x0). Следовательно, согласно первому правилу отсечений, отсекаем множество решений ({1, 2}, ∅ ). Рассмотрим второе подмножество решений, I = {1}, J = {2}. Построив матрицу ||c′ik|| и вычислив величины α и β, получаем табл. 4.5.
Таблица 4.5 1 2 3 4 5
β
1 – 33 41 37 48 5
2 48 – 28 35 48 0
3 27 28 – 29 25 0
49
4 31 44 40 – 29 4
5 43 43 36 46 – 8
α 27 28 28 29 25
Нижняя граница 0
H({1}, {2}) =
∑c i =1
5
i ,i +1
+
∑α i =1
5
i
+ β1 +
∑β i =2
i
=
= 0 + (27 + 28 + 28 + 29 + 25) + (5 + 0 + 0 + 4 + 8) = 154. Поскольку H({1}, {2}) < f(x0), то отсечь рассматриваемое множество нельзя. Вычислим верхнюю оценку для этого множества. Жадный алгоритм строит контур y = (1, 3, 2, 5, 4, 1). Его длина f(y) = 27 + 28 + 43 + 29 + 37 = = 164 = f(x0), и рекорд не меняется. Текущее дерево ветвления изображено на рис. 4.3. НГ = 154
D НГ = 175
НГ = 154
{1,2}, ∅
{1}, {2}
Рис. 4.3 Осуществим ветвление единственного неотсеченного множества (I= {1}, J = {2}) на два подмножества (I = {1, 3}, J = ∅) и (I = {1}, J = {2, 3}). Рассмотрим первое из них. Имеем p = 2, I = {1, 3}, J = ∅. Получаем табл. 4.6. Таблица 4.6 1 2 3 4 5
β
1 – 33 41 37 48 0
2 48 – 28 35 48 0
3 27 28 – 29 25 —
4 31 44 40 – 29 0
5 43 43 36 46 – 8
α — 33 28 35 29
Нижняя граница H({1, 3}, ∅ ) = 27 + (33 + 28 + 35 + 29) + (0 + 0 + 0 + 8) = 160. 50
Имеем H({1, 3}, ∅) < f(x0), следовательно, множество не отсекается. Применяя жадный алгоритм для построения допустимого решения, в котором переход из 1 в 3 фиксирован, получаем обход y = (1, 3, 2, 5, 4, 1) длиной f(y) = 164 = f(x0). Рекорд не меняется. Нижняя граница для множества I = {1}, J = {2, 3} равна H({1},{2,3}) = 0 + (31 + 28 + 28 + 29 + 25) + (5 + 0 + 0 + 0 + 8) = 154 < f(x0), поэтому множество не отсекается. Жадный алгоритм строит контур y = (1, 4, 3, 2, 5, 1) длиной f(y) = 179 > > f(x0), следовательно, рекорд не меняется. Текущее дерево ветвления представлено на рис. 4.4.
НГ = 154
D НГ = 175
НГ = 154
{1,2},∅
{1},{2} НГ = 154
НГ = 160
{1,3},∅
{1},{2,3}
Рис. 4.4 Продолжим выполнение шагов алгоритма. Когда все множества оказываются отсеченными, рекорд x0 = (1, 3, 5, 4, 2, 1) является оптимальным решением задачи, дающим длину кратчайшего гамильтонова контура f(x0) = 160.
51
НГ = 154
D НГ = 175
НГ = 154
{1,2}, ∅
{1},{2}
НГ = 160
НГ = 154
{1, 3}, ∅ НГ = 164
{1, 3, 2},∅
{1}, {2, 3} НГ = 154
НГ = 160
{1, 4}, ∅
{1,3},{2}
НГ = 160
{1, 4, 2}, ∅
НГ = 162
{1}, {2, 3, 4} НГ = 154
{1, 4}, {2} НГ = 163
НГ = 177
{1, 4, 3}, ∅
{1, 4}, {2, 3}
Рис. 4.5 Полное дерево ветвлений изображено на рис. 4.5.
Упражнения
От города
1. Применяя метод ветвей и границ, решить задачу коммивояжера с матрицей расстояний
1 2 3 4
1 – 47 29 34
До города 2 3 4 27 44 28 – 43 36 26 – 29 35 34 –
52
От города
2. Применяя метод ветвей и границ, решить задачу коммивояжера с матрицей расстояний
1 2 3 4 5
1 – 40 41 36 31
До города 2 3 4 32 37 37 – 40 28 34 – 34 37 33 – 39 33 38
5 29 31 37 27 –
От города
3. Применяя метод ветвей и границ, решить задачу коммивояжера с матрицей расстояний
1 2 3 4 5 6 7
1 – 31 43 43 35 25 36
2 29 – 30 28 40 50 48
До города 3 4 5 34 31 44 34 34 49 – 46 48 28 – 45 48 33 – 45 47 46 43 42 37
53
6 36 47 36 25 48 – 33
7 50 31 36 34 33 44 –
5. Элементы теории матричных игр В теории игр исследуются модели и методы принятия решений в конфликтных ситуациях. В рамках теории игр рассматриваются парные игры (с двумя сторонами) или игры многих лиц. Мы ограничимся рассмотрением парных игр. Участников игры принято называть игроками. Игра состоит из последовательности действий (ходов), которые подразделяются на личные (совершаемые игроками осмысленно на основе некоторого правила – стратегии) и случайные (не зависящие от игроков). В теории игр рассматриваются ситуации, в которых обязательно присутствуют личные ходы. Стратегия игрока – это набор правил, используемых при выборе очередного личного хода. Целью игры является нахождение оптимальной стратегии для каждого игрока, т. е. такой, при которой достигается максимум ожидаемого среднего выигрыша при многократном повторении игры. Предполагается, что игроки ведут себя разумно, исключаются элементы азарта и риска. Определение 5.1. Матричная игра – это парная игра, которая задается набором чистых стратегий {1, K , n} и {1, K , m} первого и второго игроков, а также платежной матрицей ( aij ) m×n , определяющей выигрыш первого игрока при выборе игроками стратегий i и j соответственно. Целью первого игрока является максимизация своего выигрыша, а целью второго – минимизация выигрыша противника. Пример 5.1 («камень–ножницы–бумага»). Каждый игрок во время своего хода независимо от другого выбирает одну из трех стратегий, называемых «камень», «ножницы» и «бумага». Выбранные стратегии сравниваются. Если они совпадают, выигрыш первого игрока составляет 0 (ничья), в противном случае побеждает игрок с более сильной стратегией. «Камень» считается сильнее «ножниц», которые, в свою очередь, сильнее «бумаги», которая сильнее «камня». Выигрыш победившего игрока составляет 1, проигравшего −1. Платежная матрица в этом случае имеет следующий вид:
Игрок 1
«Камень» «Ножницы» «Бумага»
Игрок 2 «Камень» «Ножницы» 0 1 –1 0 1 –1
54
«Бумага» –1 1 0
Пример 5.2 («вооружение и самолет»). Первый игрок выбирает один из трех типов вооружения i = 1, 2, 3, другой – один из трех видов самолетов j = 1, 2, 3. Платежная матрица задана таблицей i/j 1 2 3
1 0,5 0,9 0,7
2 0,6 0,7 0,5
3 0,8 0,8 0,6
Элементами aij платежной матрицы являются вероятности поражения самолета вида j вооружением типа i. Целью первого игрока является поражение самолета, второго – прорыв обороны противника. 5.1. Решение матричной игры в чистых стратегиях Заметим, что в игре из примера 5.1 ни у кого из игроков нет причины предпочесть одну из стратегий другой, поскольку на каждую стратегию одного игрока найдется контрстратегия другого, обеспечивающая его выигрыш (при условии, что он знает или угадал стратегию первого). В примере 5.2 ситуация иная. Для обоих игроков целесообразным является использование чистых стратегий i = 2 для первого и j = 2 для второго. Отклонение любого из игроков от указанных стратегий может только уменьшить его выигрыш. Разница в приведенных примерах объясняется наличием во второй платежной матрице седловой точки. Определение 5.2. Седловой точкой матрицы (aij ) m×n называется такая пара (i0 , j0 ) номеров строки и столбца, что для любых i = 1, …, m и j = 1, … , n выполняются неравенства aij ≤ ai j ≤ ai j . 0
0 0
0
Таким образом, элемент ai j в матрице с седловой точкой (i0 , j0 ) явля0 0
ется одновременно максимальным в своем столбце и минимальным в своей строке, что и объясняет нецелесообразность выбора любым из игроков другой стратегии. При решении матричных игр используется принцип минимакса. Принцип минимакса. Предположим, что противник заранее знает все ходы соперника. Тогда на каждую стратегию i = 1, …, m он отвечает наилучшей контрстратегией j(i), для которой aij ( i ) ≤ aij для всех j = 1, …, n.
55
Обозначим αi0 = aij ( i ) = min aij , i = 1, …, m. В описанной ситуации наи1≤ j ≤ n
лучшей чистой стратегией первого игрока является стратегия i, максимизирующая α i0 , которая называется максиминной стратегией. Величину
α 0 = max min aij = αi0 1≤i ≤ m 1≤ j ≤ n
0
назовем нижней ценой игры в чистых стратегиях. Если первый игрок поступает в соответствии с максиминной стратегией, он гарантированно получит выигрыш не менее α 0 независимо от действий второго игрока. Однако второй игрок, руководствуясь аналогичными соображениями и оставаясь в рамках чистых стратегий, должен поступать так, чтобы минимизировать величину β 0j = ai ( j ) j = max aij . 1≤i ≤ m
При таком выборе стратегии j0 (минимаксной стратегии второго игрока) он гарантированно проиграет не более β 0 = min max aij = β 0j0 . 1≤ j ≤ n 1≤i ≤ m
Величина β
0
называется верхней ценой игры в чистых стратегиях.
В примере 5.1 имеем α 0 = −1, β 0 = 1, т. е. нижняя цена меньше верхней. В примере 5.2 получаем следующие значения: α 0 = max αi0 = max{0,5, 0,7, 0,5} = 0,7 = α 20 , i
β 0 = min β 0j = min{0,9, 0,7, 0,8} = 0,7 = β 20 . j
Имеем совпадение верхней и нижней цен игры и седловую точку (i0 , j0 ) = (2, 2). Заметим, что нижняя цена игры не может быть больше верхней в силу следующей леммы. Лемма 5.1 (о максимине и минимаксе). Для любой функции f(x, y), x ∈ X , y ∈ Y справедливо неравенство max min f ( x, y ) ≤ min max f ( x, y ) . x∈X
y∈Y
y∈Y
x∈X
Из этой леммы вытекает утверждение. Утверждение 5.1. Необходимым и достаточным условием равенства нижней и верхней цен матричной игры в чистых стратегиях является существование седловой точки в платежной матрице (aij ) m×n . Седловая точка в матричной игре определяет некоторое положение равновесия, когда ни одному из игроков не выгодно отклоняться от оптимальной стратегии, если противник придерживается своей оптимальной стратегии. В случае существования седловой точки верхняя и нижняя цены 56
игры совпадают и называются ценой игры. Решением игры в чистых стратегиях называется нахождение оптимальных стратегий для каждого из игроков и вычисление цены игры. Заметим, что решение в чистых стратегиях существует только в том случае, когда в платежной матрице существует седловая точка. Пример 5.3. Найти решения в чистых стратегиях, если они существуют, для игр со следующими платежными матрицами: ⎛1 2 3 4 5 ⎞ ⎜ ⎟ ⎛− 2 0 1 ⎞ ⎛1 2 3 − 4⎞ ⎟ ⎟ ⎜ ⎜ ⎜ 3 2 1 0 − 1⎟ а) ⎜ 3 4 5 ⎟; б) ⎜ 4 3 2 − 1 ⎟; в) ⎜ . 1 3 5 4 2⎟ ⎜ 2 7 − 2⎟ ⎜ 0 3 1 − 3⎟ ⎜ ⎟ ⎠ ⎠ ⎝ ⎝ ⎜3 1 −1 0 2 ⎟ ⎝ ⎠ Решение. а) Найдем нижнюю и верхнюю цены игры в чистых стратегиях:
α 0 = max α i0 = max{−2, 3, − 2} = 3 = α 20 ; β 0 = min β 0j = min{3, 7, 5} = 3 = β10 . Верхняя и нижние цены совпадают, следовательно, существует решение игры в чистых стратегиях. Это решение соответствует седловой точке i0 = 2 и j0 = 1 , и значению платежной матрицы a 21 = 3. Оптимальные стратегии игроков соответственно равны i0 = 2 и j0 = 1. Задачи б и в предлагаются в качестве упражнения. Заметим, что в некоторых играх одна из стратегий может быть заведомо менее целесообразной, чем другая. Например, стратегия i = 2 в игре из примера 5.3 а дает первому игроку больший выигрыш, чем стратегия i = 1 при любом выборе стратегии вторым игроком: a2 j ≥ a1 j , j = 1, …, n. Это означает, что вторая строка платежной матрицы доминирует первую. Определение 5.3. Будем говорить, что строка i1 доминирует строку i2 , если для всех j = 1, …, n справедливы неравенства ai j ≥ ai j и сущест1
2
вует такая стратегия j0, что ai j > ai j . 1 0
2 0
Если из платежной матрицы убрать все доминируемые строки, то решение игры с полученной матрицей совпадает с решением исходной игры. Таким образом, иногда можно уменьшить размерность платежной матрицы путем удаления доминируемых строк. Аналогично доминирование определяется и для столбцов.
57
Определение 5.4. Столбец j1 доминирует столбец j 2 , если для любого i = 1, …, m справедливы неравенства aij ≤ aij и существует такая страте1
2
гия i0, что ai j < ai j . 0 1
0 2
Платежная матрица может быть упрощена также с помощью удаления доминируемых столбцов. Пример 5.4. Матрицы из примера 5.3 а, б могут быть упрощены следующим образом: ⎛− 2 0 1 ⎞ ⎜ ⎟ ⎛3 4 5 ⎞ ⎛3 5 ⎞ ⎟⎟ → (3 5) → (3); ⎟⎟ → ⎜⎜ а) ⎜ 3 4 5 ⎟ → ⎜⎜ ⎜ 2 7 − 2⎟ ⎝ 2 7 − 2⎠ ⎝ 2 − 2⎠ ⎝ ⎠ ⎛1 2 3 − 4⎞ ⎛ − 4⎞ ⎜ ⎟ ⎜ ⎟ б) ⎜ 4 3 2 − 1 ⎟ → ⎜ − 1 ⎟ → (− 1). ⎜ 0 3 1 − 3⎟ ⎜ − 3⎟ ⎝ ⎠ ⎝ ⎠ В матрице из примера 5.3 в нет доминирующих строк и столбцов. Пример 5.5. Решить матричную игру с платежной матрицей ( aij ) m×n = (i − j ) m×n .
Решение. Рассмотрим две строки с номерами i > k. Для любого столбца j выполняется aij − akj = i − j − ( k − j ) = i − k > 0. Таким образом, строка с бóльшим номером доминирует строку с меньшим номером, и строка m доминирует все остальные. Аналогично, если j > l – два номера столбца, то для любого i = 1, …, m имеем aij − ail = i − j − (i − l ) = l − j < 0, т. е. столбец с бóльшим номером доминирует столбцы с меньшими номерами. В результате получаем оптимальные чистых стратегии i0 = m, j0 = n, цена игры равна ν = amn = m − n. Как мы видим, игры с матрицами, в которых существует седловая точка, решаются достаточно просто. В следующих разделах будет рассмотрен более общий случай решения задачи – так называемое решение в смешанных стратегиях. Далее будем предполагать, что в платежных матрицах рассматриваемых игр все возможные упрощения уже проведены и доминирующих строк и столбцов нет.
58
5.2. Смешанные стратегии Если седловая точка в платежной матрице отсутствует, то решения в чистых стратегиях не существует. В таких случаях ищут решение игры в смешанных стратегиях. Определение 5.5. Смешанной стратегией называют произвольное вероятностное распределение на множестве чистых стратегий:
⎧ m ⎫ pi = 1, pi ≥ 0 ⎬ , ∑ ⎩ i =1 ⎭ n ⎧ ⎫ q = ( q1 , K , qn ) ∈ Qn = ⎨ q | ∑ q j = 1, q j ≥ 0 ⎬ . ⎩ j =1 ⎭
p = ( p1 , K , pm ) ∈ Pm = ⎨ p |
Применение смешанных стратегий означает чередование чистых стратегий согласно их вероятностям при многократном повторении игры. Платежная функция при этом определяется как математическое ожидание выигрыша первого игрока при применении игроками смешанных стратегий p и q и равна E( p, q ) = aij pi q j .
∑∑ i
j
В соответствии с принципом минимакса каждый игрок должен выбирать такую смешанную стратегию, которая максимизирует его наименьший гарантированный выигрыш. Аналогично случаю использования чистых стратегий наименьший гарантированный выигрыш первого игрока называется нижней ценой игры и равен α = max α ( p ) = max min E( p, q ). p∈Pm
p∈Pm q∈Qn
Аналогично определяется верхняя цена игры β = min β ( q) = min max E( p, q). q∈Qn
q∈Qn
p∈Pm
Основным результатом теории матричных игр является теорема 5.1. Теорема 5.1 (фон-Неймана). В любой матричной игре существует такая пара смешанных стратегий ( p*, q *), что 1) E( p, q*) ≤ E( p*, q*) ≤ E( p*, q) для любых p∈ Pm, q∈ Pn; 2) α = β = E( p*, q*). Число ν = E( p*, q*) называется ценой игры в смешанных стратегиях. По теореме фон-Неймана любая матричная игра имеет пару оптимальных смешанных стратегий. Для решения матричной игры необходимо отыскать эти оптимальные стратегии и цену игры. Определение 5.6. Чистая стратегия называется активной, если она используется в некоторой оптимальной смешанной стратегии с ненулевой вероятностью. 59
Теорема 5.2 (об активных стратегиях). Если один из игроков использует оптимальную стратегию, то его противник достигает цены игры ν при любой своей смешанной стратегии, в которой используются только активные чистые стратегии. a12 ⎞ ⎛a ⎟⎟ без седловой Пример 5.6. Для игры, заданной матрицей ⎜⎜ 11 ⎝ a 21 a 22 ⎠ точки, найти оптимальные смешанные стратегии и цену игры. Решение. Пусть p* = ( p1* , p2* ) – оптимальная стратегия первого игрока. В силу теоремы об активных стратегиях, если первый игрок использует оптимальную стратегию, то второй достигает цены игры ν при любой своей смешанной стратегии, в которой используются только активные чистые стратегии, например при q1 = (1, 0) и q 2 = (0,1) . Записывая для них выражения соответствующей цены игры, получаем ν 1 = a11 p1∗ + a21 p2∗ = ν ,
ν 2 = a12 p1∗ + a 22 p2∗ = ν и, учитывая соотношение p1∗ + p2∗ = 1 , имеем систему из трех уравнений с тремя неизвестными, решив которую, находим a 22 − a 21 a11 − a12 ; p 2* = ; p1* = a11 − a12 − a 21 + a 22 a11 − a12 − a 21 + a 22 a 22 a11 − a12 a 21 . a11 − a12 − a 21 + a 22 Поменяв игроков местами и проведя аналогичные вычисления, получаем выражения для оптимальной стратегии второго игрока: a22 − a12 a11 − a21 q1* = ; q2* = . a11 − a12 − a21 + a22 a11 − a12 − a21 + a22
ν=
Рассмотрим игру 2 × n. Найдем оптимальную смешанную стратегию первого игрока p* = ( p1* , p 2* ), на которой достигается максимум α ( p ) = min E( p, q) → max . q∈Qm
p∈Pn
Положим x = p 2 , 1 − x = p1 , 0 < x < 1. Обозначим f ( x) = α ( p ). Тогда по теореме об активных стратегиях n
f ( x ) = min ∑ [a1 j + (a2 j − a1 j ) x ]q j = minν j ( x ), q∈Qm
1≤ j ≤ n
j =1
60
где ν j ( x) = a1 j + (a 2 j − a1 j ) x, j = 1, …, n. В итоге получаем задачу максимизации миноранты семейства линейных функций в интервале (0, 1): min ν j ( x) → max . 1≤ j ≤ n
p1* ,
0< x<1
p 2*
Поскольку известно, что > 0 и миноранта семейства линейных функций вогнута, непрерывна и кусочно-линейная, то ее максимум на отрезке (0, 1) достигается в одной из внутренних точек излома и может быть найден за время O(n 2 ). Пусть максимум миноранты достигается на пересечении прямых ν jk −1 ( x) и ν jk (x) (рис. 5.1).
f(x)
ν j (x) k
ν j ( x) k −1
x * 2
p
0
1
Рис. 5.1 Тогда для решения игры достаточно рассмотреть матричную игру 2 × 2 с a1 jk ⎞ ⎛ a1 j ⎟. матрицей ⎜⎜ k −1 ⎟ ⎝ a 2 jk −1 a 2 jk ⎠ Пример 5.7. Решить матричную игру с платежной матрицей ⎛ 4 2 3 − 1⎞ ⎜⎜ ⎟⎟. ⎝− 4 0 − 2 2 ⎠
61
Решение. Запишем уравнения прямых ν j (x) :
ν 1 ( x) = 4 − 8 x, ν 2 ( x) = 2 − 2 x, ν 3 ( x) = 3 − 5 x, ν 4 ( x) = −1 + 3x. Максимум миноранты достигается на пересечении прямых ν 1 ( x) и ν 4 ( x ) (рис. 5.2), поэтому для решения исходной задачи используем матрицу
⎛ 4 −1 ⎞ . ⎜ −4 2 ⎟ ⎝ ⎠
4 3 2 1 0 –1 –2 –3 –4
4 3 2 1 •
x= p = 5 2 11
1 –1 –2 –3 –4
x
Рис. 5.2 Применяя полученные ранее формулы, получаем 8 ⎞ 4 ⎛ 6 5⎞ ⎛ 3 p * = ⎜ , ⎟, q* = ⎜ , 0, 0, ⎟, ν = . 11 ⎠ 11 ⎝ 11 11 ⎠ ⎝ 11
Игра m × 2 решается аналогично сведением к задаче минимизации мажоранты m линейных функций. Заметим также, что игра с платежной матрицей A = (aij ) m×n сводится к игре с матрицей − AT перестановкой игро-
(
ков, а игра m × 2 сводится к игре 2 × n.
62
)
5.3. Метод фиктивного розыгрыша Брауна–Робинсон
Идея метода заключается в поочередном выборе каждой стороной наилучшей чистой стратегии против наблюдаемого эмпирического распределения чистых стратегий противника. На первом шаге противники выбирают произвольные чистые стратегии i1 и j1 соответственно. Пусть противниками на первых N шагах последовательно выбирались стратегии (i1 , i2 , K , iN ) и ( j1 , j2 , K , jN ) и xiN , y Nj – количество шагов, на которых первым и вторым игроками выбирались m
n
i
j
∑ xiN = ∑ y Nj = N .
стратегии i и j соответственно. Очевидно,
относительные частоты применения стратегий i и j через и q Nj =
Обозначим piN =
xiN N
y Nj
. Таким образом, на каждом шаге N имеем наблюдаемые смеN шанные стратегии p N = ( p1N ,K, p mN ) и q N = (q1N ,K, q nN ). Эти векторы определяют эмпирическое распределение стратегий после первых N шагов. На шаге (N + 1) выбираются такие чистые стратегии i N +1 и j N +1 , что n
n
j =1
j =1
n
n
i =1
i =1
α N = max ∑ aij q Nj = ∑ aiN +1 j q Nj , 1≤i ≤ m
β N = min ∑ aij piN = ∑ aij N +1 piN . 1≤ j ≤ n
Частоты стратегий пересчитываются по следующим формулам: ⎧ Nq Nj ⎧ NpiN , j ≠ jN +1 , ≠ , , i i ⎪ N +1 ⎪⎪ ⎪ N +1 N +1 q Nj +1 = ⎨ N piN +1 = ⎨ N ⎪ Npi + 1 , i = i ; ⎪ Nq j + 1 , j = j . N +1 N +1 ⎩⎪ N + 1 ⎩⎪ N + 1 Авторами метода доказано, что с ростом N эмпирические распределения сходятся к оптимальным смешанным стратегиям:
p N → p*, q N → q * и ν
N
=
αN + βN 2
→ν .
Метод прост в описании и реализации, сложность одной итерации составляет O(n+m). Недостатком метода является его медленная немонотонная сходимость. На практике остановка алгоритма происходит после выполнения достаточно большого числа итераций.
63
Пример 5.8. Выполнить 12 итераций метода Брауна−Робинсон для решения матричной игры с платежной матрицей
⎛1 3 2⎞ ⎜ 2 1 3⎟ . ⎜ ⎟ ⎜3 2 1⎟ ⎝ ⎠ Решение. Запишем изменение эмпирических распределений на каждом шаге алгоритма. Шаг 1. i1 = 1, j1 = 1 ⇒ p1 = (1, 0, 0), q1 = (1, 0, 0). 2 1 Шаг 2. α = 3, i2 = 3 p = (1/ 2, 0, 1/ 2 ) β 1 = 1, j2 = 1 q 2 = (1, 0, 0 )
ν1 =
α1 + β 1 2
2 Шаг 3. α = 3, β 2 = 3 / 2,
i3 = 3 p 3 = (1/ 3, 0, 2 / 3) j3 = 3 q 3 = ( 2 / 3, 0, 1/ 3)
ν2 =
Шаг 4. α = 7 / 3, β 3 = 4 / 3,
i4 = 3 p = (1/ 4, 0, 3 / 4 ) j4 = 3 q 4 = (1/ 2, 0, 1/ 2 )
ν3 =
4 Шаг 5. α = 5 / 2, β 4 = 5 / 4,
i5 = 2 p 5 = (1/ 5, 1/ 5, 3 / 5 ) j5 = 3 q 5 = (1/ 3, 0, 2 / 3)
ν4 =
5 Шаг 6. α = 8 / 3, β 5 = 8 / 5,
i6 = 2 p 6 = (1/ 6, 2 / 6, 1/ 2 ) j6 = 3 q 6 = (1/ 4, 0, 3 / 4 )
ν5 =
3
4
= 2.
α2 + β2 2
α3 + β3 2
=
9 = 2, 25. 4
=
11 ≈ 1,833. 6
α4 + β4 2
α5 + β 5 2
6 Шаг 7. α = 11/ 4, β 6 = 11/ 6,
i7 = 2 p 7 = (1/ 7, 3 / 7, 3 / 7 ) j7 = 3 q 7 = (1/ 5, 0, 4 / 5 )
ν 6 ≈ 2, 291.
7 Шаг 8. α = 14 / 5, β 7 = 12 / 7,
i8 = 2 p8 = (1/ 8, 1/ 2, 3 / 8 ) j8 = 2 q8 = (1/ 6, 1/ 6, 2 / 3)
ν 7 ≈ 2, 257.
= 1,875. ≈ 2,133.
На дальнейших шагах получаем следующие значения: ν 8 ≈ 2, 02, ν 9 ≈ 1,98, ν 10 ≈ 1,875, ν 11 ≈ 1,984, ν 12 ≈ 2, 208.
64
ν 2,3 2,2 2,1 2,0 1,9 1,8
Номер итерации 1
2
3
4
5
6
7
8
9 10 11 12
Рис. 5.3 Из рис. 5.3 видно, что процесс не монотонен, поэтому его остановка по критерию | ν N − ν N −1 | ≤ ε не корректна.
Упражнения 1. Первый игрок загадывает любое целое число от 1 до 3. Второй игрок должен отгадать это число. Если второй игрок указывает число правильно, он получает выигрыш, равный значению этого числа. В противном случае этот выигрыш получает первый игрок. а) Определите число стратегий игроков и составьте платежную матрицу задачи. б) Определите нижнюю и верхнюю цену игры. Установите, существует ли в данной игре решение в чистых стратегиях. 2. Решить матричные игры в чистых стратегиях для матриц:
⎛ 1 2 −1 3 0 ⎞ а) ⎜ 2 2 0 2 1 ⎟ ; б) ⎜ ⎟ ⎜2 1 1 7 1⎟ ⎝ ⎠
65
⎛2 ⎜0 ⎜ ⎜3 ⎜ ⎝5
1 −1 ⎞ 1 −5 ⎟⎟ . 1 10 ⎟ ⎟ 2 2⎠
3. Решить матричную игру с матрицей ( aij ) m×n = ( f (i ) + g ( j ) )m×n . 4. Решить матричные игры в смешанных стратегиях:
⎛ 1 2 1 −2 ⎞ ⎛ 1 2 3 3 −1 ⎞ 2 −1 ⎞ ⎜ 0 1 1 −2 −2 ⎟ ; в) ⎜ 3 2 1 −3 ⎟ . а) ⎛⎜ ; б) ⎟ ⎜ ⎟ ⎜ ⎟ ⎝1 3 ⎠ ⎜1 2 3 3 ⎟ ⎜2 3 6 2 1 ⎟⎠ ⎝ ⎠ ⎝ 5. Осуществить 10 итераций метода фиктивного розыгрыша Брауна−Робинсон для решения матричной игры
⎛ 1 −1 3 ⎞ ⎜ 2 1 −3 ⎟ . ⎜ ⎟ ⎜2 3 1 ⎟ ⎝ ⎠
66
6. Потоки в сетях В данном разделе сеть – это связный ориентированный граф G = (V, E) без петель и мультидуг с одним источником s и одним стоком t, в котором каждой дуге (i, j) ∈ E приписана пропускная способность bij ≥ 0. Потоком из источника s в сток t (или s-t-потоком) в сети G назовем множество неотрицательных чисел xij, (i, j)∈E, удовлетворяющих условиям сохранения потока ⎧ − v , j = s; ⎪ x jk = ⎨ 0, j ≠ s, t ; ∑ xij −k :( ∑ i : ( i , j )∈ E j , k )∈ E ⎪ v, j = t ⎩ и ограничениям на дуговые потоки 0 ≤ xij ≤ bij , (i,j)∈E, где переменная v – общая величина потока. 6.1. Нахождение максимального потока Задачу нахождения потока максимальной мощности (максимального потока) можно записать в виде v =
∑x
sj j :( s , j )∈E
→ max; x
⎧ − v , j = s; ⎪ xij − ∑ x jk = ⎨0, j ≠ s, t ; ∑ i :( i , j )∈E k :( j , k )∈E ⎪ v, j = t ; ⎩ 0 ≤ xij ≤ bij , (i,j)∈ E.
(6.1)
(6.2)
(6.3)
С задачей (6.1)–(6.3) связано следующее понятие. Определение 6.1. Пусть множества X и X есть разбиение V. Разрезом (X, X ) сети называется множество дуг {(i, j)∈ E}, для которых: – i∈ X, j∈ X или – i∈ X , j∈ X. Нас будут интересовать разрезы, разделяющие узлы s и t, которые назовем s-t-разрезами. Будем предполагать при этом, что s ∈ X, а t ∈ X .
67
Определение 6.2. Пропускной способностью разреза (X, X ) назовем величину C ( X , X ) = ∑ bij . i∈X , j∈X
Очевидно, в общем случае C(X, X ) ≠ C( X , X). Заметим, что s-t-разрез является узким местом сети. Из (6.2) и (6.3) следует, что величина потока v не может превосходить пропускную способность любого s-t-разреза, т. е. v ≤ C(X, X ), s ∈ X, t ∈ X . Справедлива следующая теорема. Теорема 6.1 (Форда–Фалкерсона). В любой сети величина максимального s-t-потока равна пропускной способности минимального s-t-разреза. Обозначим s-t-поток через Fst – это множество неотрицательных чисел {xij}, удовлетворяющих условиям (6.2) и (6.3). Определение 6.3. Пусть P − некоторый путь, по которому идет положительный поток из источника в сток. Дуга (i, j) ∈ P является прямой дугой пути P, если направление потока в пути совпадает с ее ориентацией. Все другие дуги пути назовем обратными. Будем называть путь из s в t увеличивающим поток Fst, если xij < bij на всех прямых дугах и xji > 0 на всех обратных дугах этого пути. Следствие 6.1. Поток Fst максимален только тогда, когда не существует пути, увеличивающего поток Fst. Пусть в дальнейшем пропускные способности дуг и, следовательно, величина потока – целые неотрицательные числа. Приведем алгоритм построения максимального потока, который часто называют алгоритмом расстановки пометок Форда–Фалкерсона. Во время работы алгоритма каждый узел может находится в одном из трех состояний: – не помечен; – помечен; – помечен и просмотрен. Шаг 1 (расстановка пометок). Вначале все узлы не помечены. Метка узла j состоит из двух частей: 1) индекса i+, если можно увеличить поток из i в j, или индекса i-, если можно уменьшить обратный поток из j в i; 2) числа ε(j), указывающего максимальную величину потока, которую можно послать из источника s в j, не нарушая ограничений на пропускные способности. Сначала источник s получает метку [s+,ε(s)=∞]. Теперь вершина s помечена, а все остальные узлы не помечены. Выберем любой помеченный, но не просмотренный узел j. Пусть он имеет метку [i+,ε(j)] или [i−,ε(j)]. Каждому непомеченному узлу k, смежно68
му с j, для которого xjk < bjk, припишем метку [j+,ε(k)], где ε(k) = min{ε(j), bjk − xjk}. Такие вершины k теперь помечены. Всем смежным с j непомеченным вершинам k, для которых xkj > 0, припишем метки [j−,ε(k)], где ε(k) = min{ε(j), xkj}. Такие вершины k теперь также помечены. Когда все смежные с j узлы получили пометки, вершина j считается помеченой и просмотренной. Рассмотрим другие помеченные, но не просмотренные узлы и повторим процедуру расстановки пометок, пока t не окажется помеченным, либо нельзя больше пометить ни одну вершину, и сток t остался не помечен. В последнем случае не существует пути из s в t, увеличивающего поток, т. е. текущий поток максимален. Если узел t помечен, то на шаге 2 найдется путь, по которому будет увеличен поток. Шаг 2 (увеличение потока). Если сток t имеет пометку [k+,ε(t)], то положим xkt = xkt + ε(t). Если t имеет пометку [k−,ε(t)], то положим xtk = xtk − ε(t). Перейдем к узлу k. Если k имеет пометку [j+,ε(k)], то положим xjk = xjk + ε(t). Если k имеет пометку [j−,ε(k)], то положим xkj = xkj − ε(t). Переходим к узлу j. Продолжим этот процесс, пока не достигнем вершины s. Сотрем все пометки и перейдем на шаг 1. В момент завершения работы алгоритма (на шаге 1) множество помеченных вершин X таково, что дуги (i, j), i ∈ X, j ∈ X насыщены, т. е. xij = bij, и нет обратных дуг (j, i), для которых xji > 0. Следовательно, (X, X ) является минимальным разрезом, а полученный поток максимален. Пример 6.1. На рис. 6.1 приведена сеть, где рядом с каждой дугой указаны два числа – пропускная способность и поток по дуге. Воспользуемся алгоритмом расстановки пометок для нахождения максимального s-tпотока. Шаг 1. Припишем узлу s метку [s+, ∞]. Узел s имеет две смежные вершины 1 и 2. Пометить 1 нельзя, так как дуга (s, 1) насыщена и нет дугового потока x1s > 0. Узлу 2 приписываем метку [s+, 1], поскольку ε(2) = min{ε(s), bs2 – xs2} = min{∞, 1} = 1. Теперь узел s просмотрен, а 2 − помечен. Узел 2 имеет две непомеченные смежные вершины 1 и t. Вершина t не может быть помечена (дуга (2, t) насыщена), а узел 1 получает метку [2−,1], поскольку ε(1) = min{ε(2), x12} = min{1, 1} = 1. Теперь узел 2 просмотрен, а 1 − помечен. У вершины 1 один непомеченный смежный узел t, который получает метку [1+, 1] , поскольку ε(t) = min{ε(1), b1t – x1t}= min{1, 3 – 0} = 1. На рис. 6.1 указаны метки вершин. Вершина t оказалась помеченной, значит существует увеличивающий путь, который будет найден на шаге 2. 69
[s−, 1]
1 3,0
1,1
s [s+,
∞]
t
1,1
[1+, 1]
2,1 2,2
2 [s+,
1]
Рис. 6.1 Шаг 2. Узел t имеет метку [1+, 1]. Полагаем x1t = x1t + 1 = 1 и переходим к узлу 1, имеющему пометку [2−, 1]. Полагаем x21 = x21 − 1 = 0 и переходим к узлу 2, имеющему пометку [s+, 1]. Полагаем xs2 = xs2 + 1 = 2. Новый поток изображен на рис. 6.2. Вернемся к шагу 1.
1 3,1
1,1
s [s+,∞]
t
1,0 2,2 2,2
2
Рис. 6.2 Шаг 1. Припишем узлу s метку [s+,∞]. Смежные вершины 1 и 2 не могут быть помечены, так как дуги (s, 1) и (s, 2) насыщены. Следовательно, найден поток максимальной мощности (см. рис. 6.2).
70
6.2. Потоки минимальной стоимости Пусть дополнительно каждой дуге сети приписан неотрицательный вес cij, равный стоимости транспортировки единицы потока по дуге (i, j)∈ E. Задача поиска s-t-потока заданной мощности v и минимальной стоимости имеет вид Z=
∑c x
( i , j )∈E
ij ij
→ min;
(6.4)
x
⎧ − v , j = s; ⎪ xij − ∑ x jk = ⎨0, j ≠ s, t ; ∑ i :( i , j )∈E k :( j , k )∈E ⎪ v, j = t ; ⎩
(6.5)
0 ≤ xij ≤ bij , (i, j) ∈ E.
(6.6)
Приведем два алгоритма решения задачи (6.4)−(6.6). Алгоритм Басакера–Гоуэна Шаг 0. Положить все дуговые потоки и, следовательно, величину потока v = 0. *
Шаг 1. Определить модифицированные дуговые стоимости cij , зависящие от величины найденного потока
⎧cij , 0 ≤ xij < bij ; c = ⎪⎨ + ∞, xij = bij ; ⎪ − c , x > 0. ji ji ⎩ * ij
Шаг 2. Найти путь из s в t минимальной длины (полагая длину каждой *
дуги (i, j), равной cij ) и увеличить на единицу поток по этому пути. Если величина нового потока равна v, то алгоритм заканчивает работу. В противном случае перейти на шаг 1. Заметим, что, когда задана неориентированная сеть с выделенными источником s и стоком t, ориентация ребер, инцидентных s и t, определяется однозначно. Рассмотрим следующий пример. Пример 6.2. Неориетированная сеть изображена на рис. 6.3 а, где первое число рядом с ребром равно пропускной способности, а второе – стоимости транспортировки единицы потока. Требуется найти поток величины v = 2 минимальной стоимости. 71
Проп. спос.
3 1,1 s
1,1
Стоимость
1,2 1,2
1
2
1,1
2,2
t
a
t
b
2,2 4
3 1 s
1 1
1
2 1
1 1
4
Рис. 6.3 Применим алгоритм Басакера–Гоуэна. Шаг 0. Полагаем все дуговые потоки xij = 0. Шаг 1. Определяем модифицированные стоимости cij* = cij . Шаг 2. Находим минимальную по длине (стоимости) цепь из s в t по матрице расстояний || cij* ||. Это цепи {s, 1, 2, t} и {s, 3, 2, t}. Возьмем первую из них. Получим xs1 = x12 = x2t =1. Перейдем на шаг 1. *
Шаг 1. Пересчитаем cij
cs*1 = ∞, так как xs1 = bs1 = 1; c1s* = −1; * * c12 = ∞, так как x12 = b12 = 1; c21 = −1;
c2t* = ∞, так как x2t = b2t = 1; ct*2 = −1. Все остальные cij остаются без изменений. *
Шаг 2. Находим цепь из s в t минимальной длины, используя cij . Это {s, 3, 2, 1, 4, t}, длина которой равна 5. Пропустив единицу потока по этой цепи, получим поток, изображенный на рис. 6.3 б. Его величина рана 2. Стоп.
72
Алгоритм Клейна Шаг 1. Найти произвольный допустимый s-t-поток величины v. (Это может быть сделано с помощью решения задачи (6.1)–(6.3), в которой нужно увеличивать поток, пока он не станет равным v.) Шаг 2. Определить модифицированные дуговые стоимости
⎧cij , 0 ≤ xij < bij ; xij = bij ; ⎪ − c , x > 0. ji ji ⎩
c ij = ⎪ ⎨ + ∞, *
Шаг 3. Найти в сети цикл отрицательной стоимости. (Процедура нахождения отрицательных циклов описана в замечании 6.1.). Если отрицательного цикла нет, то найденный поток оптимален. Иначе увеличить поток по отрицательному циклу на величину δ = min{bij – xij, xji}, где минимум берется по всем дугам цикла, и перейти на шаг 2. (Если в сети существует несколько отрицательных циклов, то увеличить поток по каждому из них.) Теорема 6.2. Поток величины v оптимален только тогда, когда в сети *
с модифицированными дуговыми стоимостями c ij не существует отрицательных циклов. Пример 6.3. Найти поток максимальной мощности минимальной стоимости в сети, изображенной на рис. 6.4, где первое число рядом с каждым ребром равно пропускной способности, а второе – стоимости.
1
25,2
50,3 50,2 s
30,6
15,8
4 45,1
10,3 10,1
3
6
20,3
Рис. 6.4 73
80,4
7
60,5 5
10,2
10,1
10,8
15,8
2 15,2
90,9
10,1 20,2 8
10,3
t 10,3
9
Воспользуемся алгоритмом Клейна. Шаг 1. Найдем поток максимальной мощности v = 85. Он изображен на рис. 6.5, где полужирные линии – дуги минимального разреза.
1
25
20
40
4
15 s
30
15
65
7 20
10
15
15
3
9
20 0
8
20
t 10
10
5
10
10
10
10
5 2
6
Рис. 6.5 *
Шаг 2. Определим модифицированные стоимости c ij . Шаг 3. Каждая дуга минимального разреза насыщенная, следовательно, *
соответствующие c ij = ∞, и ни одна дуга этого разреза не может войти в отрицательный цикл. Именно поэтому сеть можно разбить на две части и искать отрицательные циклы отдельно в каждой из них. Модифицированные стоимости cij* в левой части помещены в табл. 6.1. Таблица 6.1 i/j s 1 2 4 6
s ∞ –3 –6 ∞ ∞
1 3 ∞ –2 –2 ∞
2 ∞ 2 ∞ –1 ∞
74
4 ∞ ∞ 1 ∞ –9
6 ∞ ∞ ∞ 9 ∞
*
Модифицированные стоимости c ij
в правой части представлены
в табл. 6.2. Таблица 6.2 i/j 3 5 7 8 9 t
3 ∞ –1 ∞ –3 ∞ ∞
5 ∞ ∞ –5 ∞ ∞ ∞
7 ∞ 5 ∞ ∞ –1 –4
8 ∞ ∞ –2 ∞ 3 ∞
9 ∞ ∞ ∞ 3 ∞ –3
t ∞ ∞ 4 ∞ ∞ ∞
Замечание 6.1. Для нахождения отрицательных циклов можно воспользоваться следующей процедурой. Пусть (dij) – матрица расстояний между узлами сети и dij не обязательно неотрицательные. Рассмотрим следующую тернарную (трехместную) операцию: (6.7) dik = min{dik, dij + djk}, i, k ≠ j. Если выполнять операцию (6.7) последовательно для каждого узла j = 1, …, n, то полученные в результате значения dik будут длинами кратчайших цепей между всеми парами узлов. Таким образом, если существует i, такое, что dii < 0, то вершина i принадлежит отрицательному циклу. Если применить тернарную операцию к табл. 6.1, то получим отрицательный цикл {2, s, 1, 2}. Добавив bs1 – xs1 = 10 единиц потока по этому циклу, получим сеть без отрицательных циклов. То есть найден оптимальный поток. В заключение отметим, что трудоемкость алгоритма Басакера–Гоуэна зависит от величины искомого потока, поэтому данный алгоритм не рекомендуется применять при большой величине потока. В случае v >> 1 лучше использовать алгоритм Клейна.
Упражнения 1. Найти все минимальные s−t-разрезы в смешанной сети на рис. 6.6. (Число рядом с каждым ребром / дугой равно его пропускной способности.)
75
1
2
1
3
2
2 1
s 3
1 2
2
4 1
2
5
t
1
6
1
1 7
Рис. 6.6 2. Найти максимальный s-t-поток в сети на рис. 6.6. 3. Пусть в сети, изображенной на рис. 6.6, стоимость единичного потока по каждой дуге равна 1, а по каждому ребру – 2. Найти s-t-поток мощностью 3 минимальной стоимости с помощью алгоритма Басакера–Гоуэна. 4. Найти s-t-поток мощностью 2 в сети, изображенной на рис. 6.6, если стоимость единицы потока по ребрам / дугам помещены в следующей таблице: i/j s 1 2 3 4 5 6 7
s – – – – – – – –
1 4 – – – – – – –
2 6 – – 3 – – – –
3 – 3 3 – – – 1 –
76
4 – – – 3 – – – –
5 – – – 4 – – 3 –
6 – – 5 1 – 3 – –
7 – – – – – – 4 –
t – – – – 8 3 – 4
Библиографический список 1. Береснев В. Л., Дементьев В. Т. Исследование операций. Введение: Учеб. пособие. Новосибирск: Изд-во НГУ, 1979. 2. Гимади Э. Х., Глебов Н. И. Экстремальные задачи принятия решений: Учеб. пособие. Новосибирск: Изд-во НГУ, 1982. 3. Гимади Э. Х., Глебов Н. И. Дискретные экстремальные задачи принятия решений: Учеб. пособие. Новосибирск: Изд-во НГУ, 1991. 4. Вентцель Е. С. Исследование операций. М.: Сов. радио, 1972. 5. Гермейер Ю. Б. Введение в теорию исследования операций. М.: Наука, 1971.