
книги из ГПНТБ / Цой, С. Синтез оптимальных сетей в системе управления горными предприятиями
.pdfмежду работами i и j покажет, что ;-я работа сможет выпол
няться через промежуток |
времени |
t iy т. е. |
после работы £. |
||
Условимся считать длиной дуги иi7- |
графа |
продолжитель |
|||
ность (заданную оценку |
tt) той вершины, |
из которой дуга |
|||
Uij выходит. Следовательно, все дуги |
и^ |
( у = 1, 2, . . . , N) |
|||
будут иметь одну и ту же длину £г, |
равную оценке вершины |
||||
г, из которой эти дуги выходят. |
|
|
|
|
Считаем, что в каждой вершине графа заданы все необ ходимые параметры работы: продолжительность выполне ния, используемые ресурсы и соответствующие коэффициен ты, выражающие зависимость времени и ресурсов. Напри мер, для реализации на ЭВМ алгоритма синтеза и оптимиза ции сетевого графика по стоимости задаются следующие па раметры: di и — соответственно минимальная и макси мальная продолжительность г-й работы; at и — коэффи циенты из формулы
ri—bi—a{tb
выражающей зависимость времени и ресурсов.
Известно также общее количество потребляемых ресур сов R q, выделенных для осуществления всего проекта. Ис ходную информацию о графе представим двумя массивами: L и К. В массиве L в произвольном порядке в десятичной системе счисления записываем информацию о дугах графа, не принадлежащих полным контурам. Для дуг, входящих в состав полного контура, информация в массиве L не зада ется. При формировании массива L следует учитывать, что каждая вершина полного контура должна быть связана вхо дящей и выходящей дугами с внешними вершинами, не от носящимися к рассматриваемому полному контуру.
Зная параметры г-й вершины dif Лг, aif можно запи сать информацию о каждой дуге, выходящей из вершины i и входящей в j-ю, двумя 37-разрядными ячейками:
а) “N> h dh
a + l) + O if bif а*.
Каждый из параметров i, j, Dh bit db at может принимать десятичные значения от 0 до 999. Нумерация вершин графа г осуществляется подряд от 0 до 999 в произвольном поряд ке.
В массиве К содержится информация о вершинах графа, входящих в состав полных контуров. Вершины одного пол ного контура в массиве К следуют одна за другой в любом порядке. О начале каждого нового контура говорит знак
130
«минус». Номер контурной вершины фиксируется в млад ших разрядах ячейки. Например, для графа, содержащего два полных контура, информация массива запишется так:
к) — 000 000 и
й+1)+000 000 z2
fe+2) — 000 000 U
fe+3)+000 000 и
k + 4)+000 000 г5
k+ 5) — 000 000 000.
Здесь вершины с номерами ц и гг входят в первый полный контур, вершины U, U, h составляют второй полный контур, а отрицательный ноль в ячейке к-\-Ъ свидетельствует об окончании массива полных контуров.
Порядок следования контуров в массиве К произволь ный.
Кроме массивов L и К для графа задаются дополнитель но следующие параметры:
I — количество связей в массиве L без учета контурных связей;
N — общее количество вершин на графе;
k — количество вершин, принадлежащих полным конту рам;
io— номер фиктивной миноранты; iN— номер фиктивной мажоранты;
Ro— общее количество ресурсов, выделенных на осущест вление проекта;
h — шаг изменения величин в пределах [<2*, Z)f]. Фиктивные миноранта io и мажоранта iN вводятся на
графе независимо от того, входит ли в исходный граф одна или несколько начальных (конечных) вершин. При наличии одной входящей (выходящей) вершины фиктивная верши на io (i n) соединяется с ней дугой. Если на графе несколько входящих (выходящих) вершин, то все они соединяются ду гами с фиктивной вершиной. Параметры dit Dit ait bt вновь введенных фиктивных вершин io и iN берутся равными нулю.
Прежде чем приступить к решению задачи, массив L необходимо дополнить кодами, несущими информацию о фиктивных дугах, выходящих из го и входящих в г^, т. е.:
а)+го i \ 000
а + 1 )+ 0 0 0 000 000
131
a-\-K) -j-/* iV ООО
a + t f + l ) - f ООО ООО ООО.
Параметры I и N задаются с учетом введенных вершин io, In и дуг, соединяющих эти вершины с вершинами графа.
Контроль правильности задания исходной информации
При задании исходной информации о графе с полными контурами могут быть допущены такие ошибки: наличие контуров, отличных от полных; присутствие на графе ви сячих вершин; наличие нескольких минорант и т. д. В свя зи с этим необходимо провести перед началом счета соот ветствующий контроль и выявить все ошибки. Ниже излага ются вычислительные алгоритмы, позволяющие установить все допущенные в исходной информации ошибки.
Алгоритм выявления на сетевом графе висячих вершин.
С помощью этого алгоритма проверяется, правильно ли за дана исходная информация, т. е. фиксируется наличие на графе нескольких минорант или мажорант, а также отсут ствие вершин, номера которых лежат в интервале от 0 до N. Считается, что нумерация вершин графа должна быть сквоз ной и не обязательно упорядоченной. Если на графе N вер шин, то им в произвольном порядке должны присваиваться номера от 1 до N.
Для выполнения указанного контроля отводится в МОЗУ N рабочих ячеек (N — количество вершин на графе). Сово купность этих ячеек составляет некоторое множество F. Каждой ячейке в F соответствует одна вершина графа.
Контроль можно осуществить выполнением следующих шагов:
1.Массив ячеек F очищаем нулями.
2.В массиве L просматриваем ячейки с кодами i, j, dt. При этом для i-й вершины в ячейку (/+ г) из F заносим еди ницу по первому адресу, а для j-й вершины в ячейку ( /+ ;) — единицу по второму адресу. За один просмотр массива L в массиве F будут зафиксированы все входы и выходы из вер шин графа.
3.Анализируем все ячейки /+*' массива F. При этом мо
гут быть такие варианты:
а) первый и второй адреса рассматриваемой ячейки (/-Н ) отличны от нуля (это говорит о том, что для i-й вер шины графа существуют входящие и выходящие из нее ду ги);
б) содержимое ячейки ( /+ 0 равно нулю (это свидетель
132
ствует о том, что в массиве L вершина с номером 0 <Ci<iN пропущена и ее следует ввести в исходную информацию);
в) первый адрес ячейки (/+£) равен нулю, т. е. выхода из i-й вершины нет (если 1ф1н,то это говорит о том, что на графе имеется новая мажоранта с номером i и ее необходи мо соединить фиктивной дугой с г#);
г) второй адрес ячейки ( /+ 0 равен нулю (если Ьфц, то на графе есть новая миноранта с номером i, которую следу ет соединить с io).
При анализе ячеек массива F все выявленные ошибки выдаются на печать. Перед началом вычислений, согласно сделанным распечаткам, в массив L необходимо внести со ответствующие исправления.
Алгоритм поиска на графе контуров, отличных от пол ных. Сущность этого алгоритма заключается в том, что граф с полными контурами преобразуется в обычный сетевой путем «сжатия» полных контуров в узел (одну вершину). На полученном в результате этого графе все обычные контуры устанавливаются с помощью метода Форда. Найденные кон туры необходимо исключить, т. е. внести соответствующие изменения в массив L.
Основные шаги вычислительного алгоритма:
1.В массиве L анализируем последовательно коды типа (i, j, d{). Считаем, что массив L рассортирован в порядке воз растания номеров вершин i и j. Для сортировки можно вос пользоваться методом Шелла [51].
2.Массив F из N рабочих ячеек очищаем нулями.
3.Просматриваем коды в массиве полных контуров К
ианализируем их знаки «плюс» и «минус» (000 000 гА). При
знаке |
«минус» |
переходим к шагу 4, при знаке «плюс» — |
к шагу 5. |
«минус», то код (000 000 ik) фиксируется |
|
4. |
Если знак |
в рабочей ячейке R-j-1. Далее выполняется блок 5.
5. Содержимое R-f-1 заносим в ячейку (/+£&) массива F, где ik взято из кода, анализируемого на знак в шаге 3. Далее переходим к шагу 3. В результате действия пяти ша гов за один просмотр кодов всем вершинам каждого полного контура будет присвоен один и тот же номер i, находящий ся в массиве К со знаком «минус». Новые номера контур ных вершин необходимо затем зафиксировать в массиве L, т. е. выполнять шаги 6 и 7.
6. Коды i, j, dt из массива L просматриваем один раз. При этом анализируем в F содержимое ячеек (/+£) и (/+ j), в которых зафиксированы новые номера £* и j*.
7. Если содержимое ячеек (/+ г) и (/+ ;) отлично от ну ля, то i и j в коде из L заменяем на г*, j* из F.
Шаги 6 и 7 повторяем до полного просмотра кодов мас
133
сива L. После замены старых номеров на новые в массиве L могут появиться одинаковые коды: ik, j k, dk и ц, Ju dih где
ik=zii* Jk Jh dk dii.
Одинаковые коды из массива L необходимо удалить. Для этого массив L сортируем по возрастанию номеров i и j, а за тем выполняем шаг 8.
8. Коды массива L просматриваем один раз и сравнива ем. Из-за рассортированности одинаковые коды в L стоят рядом. При совпадении рядом стоящих кодов первый из них удаляется. Тогда оставшаяся часть кодов массива L будет представлять информацию, характеризующую обычный се тевой граф, в котором каждый полный контур «сжат» в узел, т. е. представлен как вершина. В полученном сете вом графе необходимо выявить контуры, отличные от пол ных. Этот процесс поиска осуществляется на шагах 9— 14.
9. Веса всех дуг нового графа условно принимаем рав ными единице. Очищаем нулями ячейки массива F и пять
рабочих ячеек l?-f-l-r-.R-|-5. |
<2г) |
в массиве L |
|
10. Просматриваем очередной код (г, |
|||
и проверяем неравенство а7- ^ а г + 1 , где |
aj |
и |
а* — содер |
жимое ячеек /-Н и f-\-j из F, а единица — вес |
дуги utj . |
При соблюдении этого неравенства анализируется следую
щий код в L. В противном случае при aj <Ccti + 1 |
осущест |
|
вляется шаг 11. |
заносим в ячейку (/+ ;) по первому |
|
11. Величину (cfi + 1 ) |
||
адресу, а номер вершины i — по второму адресу. |
Признак |
|
этого занесения фиксируем в рабочей ячейке -R-J-1, т. е. до |
||
бавляем единицу в |
1). Максимальную из |
величин |
(а^+1) в ходе просмотра записываем в рабочей ячейке -R-f- + 3 , а номер ячейки (/+ ;), где достигается этот максимум (т. е. номер вершины ;'),— в ячейке (R+ 4).
12. Проверяем неравенство N ^ a j, где N — максималь
ный номер вершины графа, а значение а бер ется из (Л+3)-й ячейки. При N ^ a j переходим к повторению шага 10, в про тивном случае при aj ^>N выполняются шаги 13 и 14. Не равенство aj^>N свидетельствует о наличии на графе кон тура, который отыскивается на шаге 13.
13. Номер вершины ;ft, входящей в контур, находится в
ячейке (R +4). Анализируя второй |
адрес ячейки (fk~\-ik)> |
фиксируем следующую вершину jk- 1 |
искомого контура. За |
тем в ячейке (/-J-j*—i) отмечаем контурную вершину jk — 2, и процесс повторяем до тех пор, пока не придем вновь к вершине jk> В этом случае контур j k-^ jk -i- к . --+ik будет найден. По результатам, выданным на печать, необходимо в массив L внести соответствующие исправления, т. е. удалить коды полученного контура.
134
14. Этот шаг выполняем в том случае, если за один пол ный просмотр кодов массива L не будет соблюдено неравен ство N '> a j. Затем анализируем содержимое ячейки (Д +1),
и если оно отлично от нуля, то вновь повторяем шаги 10— 13, а ячейку (/2+1) очищаем. Наличие нуля в (/2+1) гово рит об отсутствии на графе контуров. На этом действия ал горитма заканчиваются.
Алгоритм упорядочения вершин на графе. При построе нии оптимального сетевого графа в целях сокращения вы числительных операций целесообразно использовать инфор мацию о графе с упорядоченными номерами вершин. Дру гими словами, всем вершинам графа должны быть заданы номера в соответствии с порядком следования работ, обу словленным технологией. Рассмотрим алгоритм упорядоче ния вершин на графе с полными контурами.
Основные шаги алгоритма:
1.На графе удаляем контурные связи, т. е. дуги, соот ветствующие каждому полному контуру. Для полученного графа массив L сортируем методом Шелла [51] по возраста нию номеров вершин i и j. Ячейки рабочего массива F очи щаем нулями.
2.Просматриваем коды (i, j, d{) массива L. При этом в ячейку (/+ ;) по первому адресу добавляем единицу. В ре зультате за один просмотр кодов из L в (/+ ;)-й ячейке мас сива F накопится число тп, равное количеству дуг, входящих
ввершину ;.
3.В рабочей ячейке /2+0 фиксируем порядковый номер для присвоения его очередной вершине графа. Нумерацию вершин начинаем с единицы. Присвоение номеров осущест
вляем с миноранты го» т. е. с вершины, у которой нет входя щих дуг и 7?г=0. В массиве F в ячейке (/+го) по второму ад ресу добавляем единицу — новый номер миноранты и затем присваиваем знак «минус»— признак вычеркивания входя щих дуг. В ячейку (/2+0) по второму адресу А 2 заносим число 2 — порядковый номер для очередной вершины графа.
4. Ячейки (/+& ) массива F просматриваем одну за дру гой и запоминаем номер к, т. е. первоначальный номер вер шины исходного графа, у которой вычеркнуты все входя щие дуги (т = 0, знак «минус») и присвоен новый номер (вто рой адрес А 2 ФО). Первоначально это будет ячейка, соответ ствующая миноранте + При выборе номера к выполняется шаг 5.
5. В массиве L находятся все коды (г, j, dt ), у которых но
мер вершины г совпадает с номером к, |
зафиксированным |
на шаге 4. Эти коды из L отмечаем знаком «минус», что рав |
|
носильно вычеркиванию дуг, выходящих |
из k-й вершины. |
135
Одновременно по первому адресу ячейки (/+ ;) вычитаем единицу из т и присваиваем знак «минус» независимо от первоначального знака. Поскольку массив L рассортирован по возрастанию номеров i, то коды с одинаковыми значени ями i располагаются рядом. После анализа всех кодов с i=
— k ячейке (f-\-k) из F присваиваем знак «плюс» и продол жаем дальнейший просмотр кодов в F, т. е. повторяем шаг 4.
6. Этот блок выполняется только в том случае, когда в шаге 4 проанализированы все ячейки массива F. Основные действия этого шага сводятся к следующему. В массиве F выбираем те ячейки, у которых т= 0 и которым присвоен знак «минус», а второй адрес А г = 0. Эти ячейки соответст вуют вершинам, у которых вычеркнуты все входящие в них дуги, но новый порядковый номер еще не присвоен. Подоб ным ячейкам в порядке их просмотра приформировываем по
второму адресу номер из (Л-fO), |
после чего в ячейку (Л-(- |
4-0) сразу добавляем единицу. |
ячейки (Л-fO). При (Д-+- |
7. Анализируем содержимое |
4-0)<2V4-l (N — количество вершин на графе) продолжаем просмотр кодов из F, по окончании которого опять повторя ем шаги 4, 5, 6. В случае (Л 4-0)=Л 7-|-1 присвоение новых номеров считаем законченным и переходим к следующему шагу.
8. Массив L просматриваем один раз и прежние номера вершин i и j в кодах из L заменяем на новые: г* и зафик сированные соответственно в ячейках (/-j—г) и (/-f-j). Все даль нейшие рассуждения проводим для графа с новыми упоря доченными номерами вершин.
Алгоритм упорядочения полных контуров. Как указы валось выше, при задании исходной информации о графе в массиве К порядок следования полных контуров может быть произвольным. При вычислениях по основному алго ритму необходим вполне определенный порядок их следо вания. Полный контур, анализируемый в первую очередь, не должен иметь входящих дуг из другого полного контура, вершины которого просматриваются позже. Поэтому все полные контуры в исходном графе должны быть упорядоче
ны, т. е. |
закодированная информация — коды в массиве |
полных |
контуров К — должна иметь вполне определенный |
порядок следования, который отвечает требованию упоря дочения всех вершин на графе.
Основные шаги алгоритма упорядочения полных конту ров на графе:
1. Исходный граф с полными контурами, преобразуем сетевой, на котором все полные контуры «сжаты» в один узел — вершину; код ее в массиве К имеет знак «ми
136
нус». Для проведения указанного преобразования можно воспользоваться алгоритмом упорядочения вершин на гра фе [3].В результате будут внесены определенные изменения
вмассив L — часть кодов из L удалится.
2.К вновь полученному массиву L применяем алго ритм [3]. Тогда у каждой вершины графа будет новый по рядковый номер. Все новые номера фиксируем по второму адресу ячеек массива F.
3. Анализируем отрицательные коды — 000 000 i в массиве полных контуров К. Затем по номеру г-й контурной вершины из (/+£)'й ячейки массива F выделяем новый по рядковый номер 77, который приформировываем к кодовой части всех кодов рассматриваемого полного контура из мас сива К. В результате всем вершинам одного полного контура присваиваем свой номер 77, который указывает порядок сле дования полных контуров.
4.Этот шаг выполняем для того, чтобы контурным вер шинам, входящим в массив К, были присвоены новые но мера, соответствующие единой системе упорядочения вер шин сетевого графа с полными контурами. Поэтому, преж де чем установить порядок следования полных контуров, необходимо предварительно упорядочить все вершины ис ходного графа. Это можно сделать с помощью алгоритма [3], после реализации которого в массиве F будут зафикси рованы новые номера.
5.Первоначальные номера i контурных вершин в кодах (d=77, 000, i) массива К заменяем на новые: ±77, 000, i*.
6.Массив К сортируем в порядке возрастания значений 77 и г*. В результате все коды из К располагаются в искомом порядке следования полных контуров. При этом все контур ные вершины имеют другие (отличные от исходных) номе ра, соответствующие общей системе упорядочения номеров вершин исходного графа.
§2. ВЫЧИСЛИТЕЛЬНЫЙ АЛГОРИТМ ПОИСКА МАКСИМАЛЬНОГО ПУТИ НА ГРАФЕ С ПОЛНЫМИ КОНТУРАМИ
Во второй главе рассматривался метод нахождения мак симального пути на любом графе. В последующих главах этот метод использовался при решении больших и сложных задач распределения ресурсов, где неоднократно вычисля лись критические пути на графе с полными контурами. Учитывая специфику построения сетевого графа с полными контурами, а также в целях сокращения вычислительных операций на ЭВМ можно воспользоваться более простым вычислительным алгоритмом.
Предлагаемый алгоритм предназначен для определения
137
величины максимального пути на сетевом графе с полными контурами, построенном на языке «работа — связь». Метод включает небольшое количество операций и прост для реа лизации на ЭВМ
Постановка задачи. Дан граф G(X, U) с полными конту рами, где X — {дгг } — множество вершин, и = { и ц } — мно жество дуг. Обозначим множество полных контуров через тогда I i = { x k] — один полный контур, a Xk — вер шина этого контура. Необходимо найти на графе с полны
ми контурами путь максимальной длины от любой верши ны х i до мажоранты x N.
Метод решения поставленной* задачи предназначен для реализации на ЭВМ, поэтому изложение начнем с задания исходной информации. Представим все связи — дуги графа Uij — в виде упорядоченного массива L с кодами -f-г, j, tit где i, j — номера работ (вершин), £г — продолжительность работы x t.
Полные контуры / г условимся представлять в ЭВМ в ви де массива с набором кодов ±000, 000, х^ где x k— верши ны одного контура (k = l, 2, . . .). Знак «минус» свидетельст вует о начале очередного полного контура Ii.
В качестве рабочего массива F фиксируем набор из N рабочих ячеек (/Ч-д^), (г= 1 , 2, . .. , iV), где N — количество вершин (работ) графа G(X, U). Множество X = { x t } упоря дочено.
Действие алгоритма основано на следующем очевидном свойстве. Если максимальный путь от любой вершины х-г графа до мажоранты идет через вершину xk полного конту ра 7/, то он будет проходить через все остальные вершины X j^ li контура и продолжением его будет максимальный
из путей, связывающих вершины этого контура с мажоран той.
Рассмотрим действие алгоритма по шагам.
Шаг 1. Коды массива L -f-г, j, ti просматриваем в произ вольном порядке. Значения £* заносим в рабочую ячейку (/-f-г) массива F. За один просмотр кодов массива L в ячей ках (/-{-г) зафиксируем все временные оценки tt для вершин графа xt.
Шаг 2. Коды массива L просматриваем вторично. Из яче ек (/+ ;) массива F величину tj заносим в код i, j, t t на ме
сто прежнего значения £*. В кодах массива L параметр tj бу дет теперь соответствовать индексу j: -f-г, j, tj.
Шаг 3. Массив L сортируем в порядке уменьшения ин дексов г.
Шаг 4. Анализируем коды ±000, 000, Xk массива пол ных контуров К. Для каждого полного контура Ii опреде-
138
ляем сумму временных оценок 7* вершин Найден ную величину 27* со знаком «минус» заносим во все ячей ки (/+ * * ) массива F.
Шаг 5. В массиве L из очередного кода + г, j, t} выделя ем индекс j и анализируем знак ячейки (/-f-j) из F. При зна
ке «плюс» |
в L |
выбираем следующий код. В противном слу |
чае (знак |
«минус») из ячейки (/+ /) величину 27* заносим |
|
в код -Н, j, tj |
xkGIi |
|
на место tj. |
Одновременно массив L дополняем новыми кодами г, J*, 2 7*» где ik— номера вершин Xk^-h (при условии, что ко-
h eIi |
Аналогичные действия вы |
дов -j-i, ik, tjk в массиве L нет). |
|
полняем для каждого кода из L, |
после чего массив F очища |
ем нулями. В результате будет |
сформирован расширенный |
массив Lpac. |
|
Шаг 6. Определение максимального пути L**. Искомые значения L * фиксируем в ячейках массива F. Полагаем зна чение Ь*=п для мажоранты iN равным нулю. Коды (i, j, tj) расширенного массива Lpac анализируем в порядке их сле дования. Пересчет L * осуществляем по формуле
Li*=m ax{L i/*, 7/^+7;}, |
(6.1) |
где L j * — путь максимальной длины от j-й вершины до мажо ранты x N. Эту величину берем из ячейки (/-f-у) массива F. Величина L /* из ячейки (/+ i) есть искомый максимальный путь Li*, вычисленный к данному моменту по формуле (6.1).
Вновь найденное значение L * заносим в ячейку (/+ г) массива F и просмотр кодов расширенного массива Lpac продолжаем.
Действие алгоритма закончится, как только будут про анализированы все коды из L и проведены вычисления по формуле (6.1). Все искомые величины максимальных путей L *от вершин i до мажоранты iN будут зафиксированы в со ответствующих ячейках рабочего массива F.
§ 3. АВТОМАТИЗАЦИЯ ПРОЦЕССА ВЫЧИСЛЕНИЯ ОСНОВНЫХ ПАРАМЕТРОВ СЕТЕВОГО ГРАФА
Здесь описываются алгоритмы вычисления основных параметров, используемых при анализе сетевого графа. Та кими параметрами являются: продолжительность критиче ского пути Ткр, ранние начала работ 7Р*Н, поздние окончания
работ 7"-°, резервы времени работ и др.
Алгоритм определения максимального пути от миноран
139