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

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

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

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

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

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

Ответы [ 12 ]

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

Основная проблема в вашей проблеме возникает, когда поток User хочет поместить грязную Dish в чистую посудомоечную машину.

Решение простое. Создайте еще один Dishwasher объект.

Один Dishwasher держит грязную посуду в ожидании, чтобы почистить ее, другой - недавно очищенную посуду.

Когда Dishwasher, содержащий чистую посуду, пуст, начните чистить грязную посуду в другой Dishwasher.

В этот момент потоки User могут помещать грязную посуду в то, что раньше было Dishwasher (которое теперь пусто).

Продолжайте чередовать роли двух Dishwashers бесконечно. User нити всегда могут выпасть из грязной тарелки без необходимости KitchenCounterBuffer.

Примечание: это решение не решает проблему голодания. User резьба все еще может блокировать ожидание завершения очистки посудомоечной машиной.

Примечание 2: В стесненных условиях, где Dishwasher является одиночным, укажите KitchenCounterBuffer, а также DishwasherOperator, чтобы убрать посуду и поместить грязные блюда от KitchenCounterBuffer до Dishwasher. Затем KitchenCounterBuffer принимает роль грязного Dishwasher в приведенном выше алгоритме. Однако это может привести к тому, что потоки User сгенерируют исключения или умрут.

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

Не связано с программированием, но это может помочь ответить на ваш логический вопрос ... У моей посудомоечной машины есть индикатор "Чистый", который включается при запуске стиральной машины. Индикатор остается включенным, если вы просто открываете дверь на короткое время (т.е. вынимаете чистую чашку), но гаснет, если вы держите дверь открытой в течение более длительного времени (достаточно времени, чтобы опорожнить стиральную машину) Он не идеален, но гораздо надежнее, чем флаг на передней панели, который должен быть (немного забывчивым) человеком.

1 голос
/ 21 июня 2009

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

Это совершенно другая архитектура. Со стандартной посудомоечной машиной вы считаете «чистым / грязным» атрибутом посудомоечной машины. «Чистый» означает «не содержит грязной посуды». В конвейерной посудомоечной машине «чистый / грязный» не является признаком посудомоечной машины.

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

1 голос
/ 21 июня 2009

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

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

Если получение чистой копии блюда было обычной операцией (что звучит так, как в вашей ситуации), вы можете добавить метод .AsClean () к вашему объекту Dish, который автоматически вернет вам чистый клон. Если производительность стала узким местом, это можно было бы оптимизировать, возвращая this, если экземпляр уже очищен.

Конечно, это предполагает, что вы находитесь в среде с разумным пространством кучи и автоматической сборкой мусора.

1 голос
/ 21 июня 2009

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

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

Может быть Конечный автомат соответствует задаче, которую вы хотите решить?

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

Мне нравится ваша аналогия, но основная проблема беспокоит меня. По моему опыту, хорошо спроектированная система всегда знает (обычно неявно) тип состояния, на которое вы ссылаетесь. Например, ресурс в очереди общих ресурсов доступен для использования другими процессами - если бы его не было, его бы не было в очереди. Или же ресурс, изменяемый рабочим потоком, находится в том состоянии, в котором, по словам обработки потока, он находится - что более важно, ни одному другому потоку не нужно , чтобы знать, является ли он "чистым" или "грязным".

Существует ошеломляющее количество допустимых шаблонов дизайна, с которыми я еще не сталкивался (или еще не изобрел :-), но то, что вы описываете, имеет намек на запах дизайна (или грязную посуду), а не на правильный шаблон .

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

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

Всего несколько мьютексов должны сделать свое дело.

У вас есть четыре состояния.

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

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

  • Когда вы хотите что-то вставить, вы ждете на DirtyMutex
  • Когда вы хотите начать стирку, вы ждете на DirtyMutex, чтобы не тратить воду;)
  • Когда стирка заканчивается, вы сигнализируете CleanMutex
  • Когда вы хотите очистить посудомоечную машину, вы ждете на CleanMutex
  • Когда посудомоечная машина пуста, вы даете сигнал DirtyMutex

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

0 голосов
/ 21 июня 2009

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

Использовать съедобные тарелки?

0 голосов
/ 21 июня 2009

Можете ли вы сделать так, чтобы посудомоечная машина автоматически выкидывала посуду в конце цикла мойки?

Это похоже на идею Марка Латтона, аналогичную отправке очищенных блюд в (возможно, временную) очередь известных чистых блюд, из которых они могут быть сняты.

...