Тип 22 № 57429 
Многопроцессорные системы. Задания для подготовки
i
В файле содержится информация о совокупности N вычислительных процессов, которые могут выполняться параллельно или последовательно. Будем говорить, что процесс B зависит от процесса A, если для выполнения процесса B необходимы результаты выполнения процесса A. В этом случае процессы могут выполняться только последовательно.
Информация о процессах представлена в файле в виде таблицы. В первом столбце таблицы указан идентификатор процесса (ID), во втором столбце таблицы — время его выполнения в миллисекундах, в третьем столбце перечислены с разделителем «;» ID процессов, от которых зависит данный процесс. Если процесс является независимым, то в таблице указано значение 0.
Типовой пример организации данных в файле:
| ID процесса B | Время выполнения процесса B (мс) | ID процесса (-ов) A |
|---|
| 1 | 4 | 0 |
| 2 | 3 | 0 |
| 3 | 1 | 1; 2 |
| 4 | 7 | 3 |
Задание 22
Определите минимальное время, через которое завершится выполнение всей совокупности процессов, при условии, что все независимые друг от друга процессы могут выполняться параллельно.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Решение. Отсортируем данные в таблице так, чтобы все независимые процессы оказались в начале таблицы и любой процесс был расположен после всех процессов, от которых он зависит. Также в таблицу добавим столбец «Время окончания процесса» и запишем туда длительности независимых процессов.
Рассчитаем время выполнения процессов.
Процессы 1, 2 и 4 не зависят от других процессов.
f(1) = 8;
f(2) = 3;
f(4) = 10;
f(3) = 5 + max(f(1), f(2)) = 5 + 8 = 13;
f(5) = 9 + max(f(3), f(4)) = 9 + 13 = 22;
f(6) = 2 + f(3) = 2 + 13 = 15;
f(7) = 3 + f(5) = 3 + 22 = 25;
f(8) = 4 + f(5) = 4 + 22 = 26;
f(9) = 10 + f(8) = 10 + 26 = 36;
f(10) = 8 + f(7) = 8 + 25 = 33;
f(11) = 6 + max(f(6), f(7)) = 6 + 25 = 31;
f(12) = 5 + f(11) = 5 + 31 = 36;
f(13) = 3 + f(11) = 3 + 31 = 34;
f(14) = 7 + f(11) = 7 + 31 = 38;
f(15) = 9 + max(f(12), f(13),f(14)) = 9 + 38 = 47.
f(16) = 10 + max(f(9), f(10)) = 10 + 36 = 46.
| ID процесса | Время выполнения | ID процессов A | |
|---|
| 1 | 8 | 0 | 8 |
| 2 | 3 | 0 | 3 |
| 3 | 5 | 1;2 | 13 |
| 4 | 10 | 0 | 10 |
| 5 | 9 | 3;4 | 22 |
| 6 | 2 | 3 | 15 |
| 7 | 3 | 5 | 25 |
| 8 | 4 | 5 | 26 |
| 9 | 10 | 8 | 36 |
| 10 | 8 | 7 | 33 |
| 11 | 6 | 6;7 | 31 |
| 12 | 5 | 11 | 36 |
| 13 | 3 | 11 | 34 |
| 14 | 7 | 11 | 38 |
| 15 | 9 | 12;13;14 | 47 |
| 16 | 10 | 10;9 | 46 |
Ответ: 47.
Приведём решение на языке Python.
def f(d):
if d[2] == [0]:
return d[1]
else:
maxx = 0
for i in d[2]:
if maxx < f(index[i - 1]):
maxx = f(index[i - 1])
return maxx + d[1]
from csv import reader
with open("22_1.csv") as F:
s = reader(F, delimiter=';', quotechar='"')
next(s)
index = []
for i in s:
index.append([int(i[0]), int(i[1]), list(map(int, str(i[2]).split(';')))])
for i in range(len(index)):
print(i + 1, f(index[i]))
Примечание.
Для считывания информации из файла необходимо конвертировать его из xlsx в csv.
Приведём решение Михаила Глинского на языке Python.
f=open('1_22.txt')
sl={'0':0}
for s in f:
s=s.replace(';',' ')
s=s.replace('"',' ')
n,t,*fun=s.split()
sl[n]=max([sl[i] for i in fun])+int(t)
print(max(sl.values()))
Примечание.
Для считывания информации из файла необходимо конвертировать его из xlsx в txt и удалить первую строку.
Ответ: 47