Файл: Соловейчик, Р. Э. Программирование на АЛГОЛ-60 учеб. пособие.pdf

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

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

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

Добавлен: 31.10.2024

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

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

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

лежащих на главной диагонали, то приписываем рассматриваемому элементу значение этой суммы.

Теперь можно дать пояснение к разбираемой процедуре. Эта процедура состоит в последовательном применении изложенного правила прямоугольника к элементам, расположенным в первой строке, затем во второй, в последующих и, наконец, в последней строке. Изобразим эту процедуру на двух последующих чертежах

i

\

1

2

3

4

в

в

7

 

 

 

 

 

 

 

I

 

О

М

м

М

м

м

м

2

 

М

О

м

м

м

м

м

3

 

М

2

о

м

м

м

м

4

 

3

М

м

о

м

м

м

в

 

Ш Ш

М

м

в

о

м

м

в

Ш ш

м

м

2

м

о

м

 

 

 

 

 

 

 

 

7

 

жв

3

¥ Ш а

м

в

о

 

 

 

 

 

' Ш р

 

 

 

На первом из них начерчены прямоугольники и заштрихованы те значения, которые подлежат изменению. На втором дана мат­ рица наискорейших связей, т.е. окончательное решение задачи, а заштрихованы те значения, которые подверглись изменению.

Если это покажется недостаточно наглядным, то можно ре-


86

комевдовать построение новой матрицы после просмотра элементов каждой строки и соответственного построения "прямоугольников". В заключение приведем две схемы.

На первой из них изображена исходная матрица продолжительнос­ ти прямых связей, на второй - итоговая матрица продолжитель­ ности наискорейших, но не прямых связей.

Расчет критического пути

В разбираемом алгоритме расчета критического пути пред­ полагается, что события (вершины сети) рационально пронумеро­ ваны. Этот алгоритм описан процедурой под названием critioal-

path

, имеющей следующие

параметры:

 

п

- общее число работ, входящих в сеть;

1 {k] , j [к]

- вектор-пара, представляющая k -р работу, которая

 

 

понимается как стрелка, связывающая событие

 

 

i Г k J (начало работы) с событием j [ к ] (конец

 

 

работы), при этом должно выполняться условие

 

 

1 0 1 ^ 3 И

для к= 1 ,2 ,... , п ;

did

.[к]

- продолжительность к-й работы.

 

 

 

87

 

 

 

 

Предполагается,

что имеют место соотношения:

 

 

1 Ь ]

- 1

*

 

 

 

 

 

 

1 [к] £ i [к 4 1] ,

 

 

 

 

 

i [к] < J

[к + ij

 

'(общее начало работ),

выражающие условие рациональной нумерации

событий. В результа­

те выполнения процедуры для к »

1 ,2 ,...,п определяются:

а1

Гк] ~

самый ранний

срок начала k -й работы;

s2

[к] -

"

поздний

"

" к

"

;

f1

£к] -

"

ранний

" окончания k -й

"

;

f2

[k]_

"

поздний

"

"

k -й

"

;

 

[к]- полный резерв времени k -й работы;

 

f t

[к]- свободный резерв времени k -й работы.

Искомый критический путь определяется цепочкой работ, у

которых равны нулю полные резервы времени. Кроме того, в про­ цедуре предусматривается возможность выхода из нее в трех случаях:

если

i

[к] У/ j £к]

, т.е. при неправильной нумера­

ции событий,с

помощью метки

out 1 ;

 

если

i

[к]

лежит вне

последовательности,

с помощью

метки out

2

;

 

 

.

если

1

[*]

пропущено, т.е. нет такого

события, с

помощью метки

out 3

 

 

Все эти метки не локализованы в данной процедуре.

Кроме

этих величин,в процедуре будут использованы два

одномерных массива, через посредство которых получаются ре­ зультаты:

procedure critical

path

(n,i,j,dij) reeults

 

 

 

 

 

 

(S1 , 32, f1,

£2,

tf,

£f),

value n

;

in teg er n j

 

 

 

in t e g e r

a r ra y

i, j ,dij ,Si ,32,£i.,f2,

tf,

ff

t


begin inte ge r к, index, max,min; integer

a rra y

t i , t e

[ 1in j

i

index

: ■

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fo r к

t

>

1 step 1 n n tll

 

n

do

 

 

 

 

 

 

 

 

begin

it

i

[ k] ^ 3 [ k ]

 

then go to

out i

»

 

 

 

i f

 

i

[ k ]

<Tindex

 

 

then go to oat 2 »

 

 

 

it

i

j\J > index

 

 

t 1

then

g<4

to

out3

*

 

 

i f

 

i

£kJ

aindex

 

 

 

1

then

index»

ai [

k ]

;

 

t i [к ].' •-

0 » t* [ к ] * - M

 

 

 

 

 

 

end

j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fo r kr

»

1

otep

1

n n tll

 

n

do

 

 

 

 

 

 

 

 

begin

maxi

 

t i j i f k ] ]

 

 

 

 

 

 

 

 

 

 

 

 

 

i f

t i

[j

[k ] J

<

 

* x

Jjhen

t i |

j [

k j j

 

 

 

end

t i

»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

te [ J

H ]

»

-

t i

[j

 

[n]j

;

 

 

 

 

 

 

 

 

 

for к »

=

n step

-

1

until

1 do

 

 

 

 

 

 

 

begin

min: a

te

[j [k]j

 

-

dij

[k]

;

 

 

 

 

 

 

i f

te [ i

[k]|

>

min

then te

[ i

[k jJ

I

т

min

 

 

end te :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

к: э

1

step

 

1

 

u n til

n

do

 

 

 

 

 

 

 

 

begin 31

[kj

 

»

*

t i

i

[kj

 

 

 

 

 

 

 

 

 

 

e2

[к ]

 

:

a

te

■j

M

~ dij

[h]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f1

[k ]

 

t

=

t i

4

[k j

> d ij

[k ]

 

 

 

 

 

 

f 2

[k ]

 

»

=

te

[*

M]

 

 

 

 

[\])

 

 

 

 

t f

[ k ]

 

»

a

te

P

[k j]

“ t i

[i f k j ] - d ij

 

 

 

 

 

WJ

 

 

 

 

 

 

f f [ k ] : » t i [J w j -

end

»nd o ritio e lp a th


89

Поясним работу этой процедуры на конкретном примере. Пусть входные данные для этого примера будут следующими:

k

C1* » ^k

)

 

1

(1Д)

2

2

(ГД)

1

3

(1,4)

В

4

(2.4)

2

В

(2,в)

6

в

' (2,7)

В

7

(8,4)

2

8

(ад)

7

8

(4Д)

6

10

(4Д)

2

11

(ВД)

4

12

(6,7)

2

IS

(6Д)

7

14

(7Д)

4

Первым циклом проверяется правильность нумерации событий

и присваиваются начальные значения

 

 

 

массиву

ti [к]

« - о

для всех

к

,

массиву

Чв [к]

| - V

для всех

к

,

где М - некоторое очень большое число

(нацример.М =

10^ дней).

В нашем примере выходов из процедуры нет, так как нумерация со-: бытий сделана правильно.

Вторым циклом определяются самые ранние даты наступления

событий

 

,

 

 

 

 

 

 

max:-ti[l]

+

0

t

2

»

2

t l [2 ]= 0< 2

t l [ 2] i - 2

aaxi-ti[t]

4

aijjVj» 0

1

з

1

ы[з]=" 0 < Г

[з] « =• 1