В файле содержится информация о совокупности N вычислительных процессов, которые могут выполняться параллельно или последовательно. Будем говорить, что
Информация о процессах представлена в файле в виде таблицы. В первом столбце таблицы указан идентификатор процесса (ID), во втором столбце таблицы — время его выполнения в миллисекундах, в третьем столбце перечислены
| ID процесса B | Время выполнения процесса B (мс) | ID процесса (-ов) A |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 3 | 0 |
| 3 | 1 | 1; 2 |
| 4 | 7 | 3 |
Определите минимальное время, через которое завершится выполнение всей совокупности процессов, при условии, что все независимые друг от друга процессы могут выполняться параллельно.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Заметим, что время выполнения всей совокупности процессов равно времени выполнения самого длинного процесса.
Посчитаем время выполнения
Посчитаем время выполнения процессов, зависящих от одного
Посчитаем время выполнения процессов, зависящих от двух
Посчитаем время выполнения процессов, зависящих от трех
Найдем максимальное время выполнения самого длинно процесса, введя формулу =МАКС(D2:D17), и получим время выполнения всех процессов — 37.
Ответ: 37.
Приведём решение Евгения Джобса на языке Python.
# скопируем содержимое таблицы в файл
# и прочитаем его.
# Заменим точки с запятой на пробелы
file = open('22.txt').read().replace(';', ' ')
# преобразуем данные в список строк из чисел
nums = [[int(x) for x in s.split()]
for s in file.split('\n')]
# создадим словарь вида
# №процесса: (время выполнения, процессы)
pr = {c[0]:(c[1], c[2:]) for c in nums[:-1]}
# определим функцию, которая
# возвращает время работы процесса
# n - номер процесса
def f(n):
# если номер равен 0, то время выполнения 0
# (начало всех процессов)
if n == 0: return 0
# иначе максимальное время выполнения
# для всех предыдущиъ процессов
# плюс время выполнения процесса n
return max(f(x)
for x in pr[n][1]) + pr[n][0]
# находим максимальное значение
print(max(f(x) for x in pr))
Примечание.
Из файла следует удалить строку заголовков и разбить ячейки с перечнями процессов, от которых зависит данный процесс, на отдельные ячейки с помощью мастера «Текст по столбцам». Файл следует сохранить в формате txt.
Приведём решение Михаила Глинского на языке Python.
f=open('22.txt')
res={'0':0}
for s in f:
n,t,*ff=s.split()
res[n]=max([res[x] for x in ff])+int(t)
print(max(res.values()))
Примечание.
Из файла следует удалить строку заголовков и разбить ячейки с перечнями процессов, от которых зависит данный процесс, на отдельные ячейки с помощью мастера «Текст по столбцам». Файл следует сохранить в формате txt.

