Файл: Цой, С. Синтез оптимальных сетей в системе управления горными предприятиями.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.10.2024

Просмотров: 111

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

между работами i и j покажет, что ;-я работа сможет выпол­

няться через промежуток

времени

t iy т. е.

после работы £.

Условимся считать длиной дуги иi7-

графа

продолжитель­

ность (заданную оценку

tt) той вершины,

из которой дуга

Uij выходит. Следовательно, все дуги

и^

( у = 1, 2, . . . , N)

будут иметь одну и ту же длину £г,

равную оценке вершины

г, из которой эти дуги выходят.

 

 

 

 

Считаем, что в каждой вершине графа заданы все необ­ ходимые параметры работы: продолжительность выполне­ ния, используемые ресурсы и соответствующие коэффициен­ ты, выражающие зависимость времени и ресурсов. Напри­ мер, для реализации на ЭВМ алгоритма синтеза и оптимиза­ ции сетевого графика по стоимости задаются следующие па­ раметры: di и — соответственно минимальная и макси­ мальная продолжительность г-й работы; at и — коэффи­ циенты из формулы

ri—bia{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