Ищете решение "Посудомоечная машина на работе" - PullRequest
9 голосов
/ 23 апреля 2009

Я ищу алгоритм для решения проблемы «посудомоечная машина на работе».

Хотя замечательно иметь возможность ставить в него грязные кофейные чашки и т. Д., Вы быстро сталкиваетесь с «каково состояние посуды?» дилемма. Если вы идете на кухню, можете ли вы взять посуду из посудомоечной машины, потому что она чистая и просто не убрана? Можете ли вы поставить грязную посуду в посудомоечную машину или это лишит ее чистоты?

Кажется, что проблема должна иметь программный эквивалент. У вас есть общий процесс, который запускается асинхронно и перемещает объекты из одного состояния в другое. Вы должны быть в состоянии узнать состояние объектов в любой момент времени. Какие алгоритмы можно применять?

Мой вариант запуска - создать на посудомоечной машине флажок «чистый» и «грязный». Когда посудомоечная машина опорожнена, она должна быть переключена на «грязную», когда она работает, она должна быть включена на «чистую». Есть ли проблемы с этим алгоритмом? Есть ли лучший / менее подверженный ошибкам один?

Примечание. Нет алгоритмов, использующих расписание опроса, пожалуйста ...

Ответы [ 12 ]

0 голосов
/ 23 апреля 2009

Простым решением этого является поддержание инвариантов, которые всегда верны. Примером такого набора инвариантов может быть:

  • Если посудомоечная машина пуста / не полностью заполнена - все блюда грязные
  • Если посудомоечная машина заполнена - тогда все блюда чистые.

Задача объекта, который взаимодействует с посудомоечной машиной, - поддерживать эти инварианты в порядке. Если кто-то добавляет чашку в посудомоечную машину, и это наполняет ее, он также должен включить ее, чтобы следующий посетитель обнаружил, что посудомоечная машина заполнена и все чашки чисты.

0 голосов
/ 23 апреля 2009

Вам нужен только один флаг, как вы указали (чистый / грязный). Посудомоечные машины обычно предоставляют такой механизм: (физический) замок.

  • Посудомоечная машина запускается пустой, разблокирована
  • Посудомоечная машина разблокирована, поэтому в нее можно ставить грязную посуду
  • Перед запуском посудомоечной машины она заблокирована
  • После запуска он все еще заблокирован, показывая, что все внутри грязное
  • Если вы удалите что-то из него, и это не последний элемент, вы снова его заблокируете

В программном смысле блокировка заключается только в том, что можно ставить посуду в посудомоечную машину - вы знаете, чистая или грязная извлекаемая посуда, в зависимости от того, заблокирована она или нет, но может поставить только посуду если он разблокирован. Если вы берете последнее блюдо, вы разблокируете его.

...