Найти в Дзене
Философские байки

Задача об обедающих философах. Решения

Оглавление

Начало здесь

Итак, у нас есть пять философов, пять вилок и бесконечная лапша. Философ может есть только двумя вилками. За раз он может взять или положить только одну вилку.

Как сделать такой алгоритм поведения философов, чтобы ни один из философов не оставался вечно голодным?

Benjamin D. Esham / Wikimedia Commons
Benjamin D. Esham / Wikimedia Commons

В прошлый раз мы обсуждали, почему это задача не так тривиальна, как может показаться. Сейчас мы рассмотрим три разных способа решения задачи.

1. Официант

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

2. Иерархия вилок

Нумеруем вилки от 1 до 5. Каждый раз философ берёт вилку с меньшим номером, а потом с большим, а кладёт — наоборот. Если вилки с наименьшим номером нет, то философ ничего не берёт. Тогда следующим шагом эту вилку возьмёт тот философ, который уже взял одну вилку.

3. Монитор

Философы, прежде чем начать брать вилки, проверяют, что их соседи не едят. Тогда сначала будут есть философы 1 и 3, потом — 2 и 4. Чтобы философ 5 (или любой другой философ) не остался голодным, можно ещё отслеживать, сколько раз голодный философ ел, прежде чем он возьмёт первую вилку. Если философ ел больше раз, чем другие, он тоже не может приступить к еде.

Сцена симпосия (ритуализированного древнегреческого пиршества). Фрагмент фрески на саркофаге из «Гробницы ныряльщика», V в. до н.э
Сцена симпосия (ритуализированного древнегреческого пиршества). Фрагмент фрески на саркофаге из «Гробницы ныряльщика», V в. до н.э

Темпоральная логика

Ещё один способ решения подобных задач — задать функции, зависящие от времени.

Для упрощения логических рассуждений в XX веке была предложены различные темпоральные логики — разделы логики, в которых учитывается временной аспект. Темпоральные логики являются частью философии и широко применяются в информатике для решения самых разных задач.

Пример использования:

Сначала первый философ берёт обе вилки. Остальные — как получится. Когда философ 1 поест, начинается следующий раунд. В следующем «раунде» в приоритете философ 2, и так далее.

Это ещё один пример того, как часто мы используем философию, иногда сами об этом не подозревая.