Подтвердить что ты не робот

Методы планирования

Я работаю над PHP-приложением для компании по уходу на дому. У них есть x количество опекунов, которые планируются каждую неделю, чтобы посещать дома х количество пользователей (клиентов). Каждый пользователь службы имеет набор "расписание", когда они должны быть посещены, включая периоды плюс продолжительность посещения в минутах.

Так, например, пользователь службы может иметь следующее расписание.

      AM   Lunch   Tea   Late   Night   Respite
Mon   30m  -       30m   60m    -       -
Tue   30m  -       -     60m    -       -
Wed   20m  25m     30m   60m    120m    -
Thu   -    -       30m   -      -       -
Fri   30m  25m     -     -      -       -
Sat   -    -       -     -      -       -
Sun   20m  25m     -     -      -       -

Эти периоды в настоящее время хранятся в базе данных в следующем формате:

Table: Service_user_schedules
id   service_user_id   day   period   duration

Каждую неделю ухаживающие заполняют таблицу того, в какие периоды они могут работать. Эти данные затем вводятся в систему и сохраняются в базе данных в следующем формате:

Table: Carer_available_shifts
id   carer_id   day   period

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

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

Кто-нибудь выполнял такую ​​задачу раньше, и если да, то нашел ли вы простой способ ее завершить. Я бы предпочел сделать его объектно ориентированным, чтобы я мог повторно использовать один и тот же общий класс, но на данный момент у меня полная потеря!

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

Я бы предположил, что это препятствие будет довольно распространено во многих приложениях типа "укомплектование персоналом", и я удивляюсь, как мало обсуждается это в любом месте в Интернете!

UPDATE

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

Сейчас я немного потеряю, кто наградит щедрость. duedl0r приложил много усилий к его (или ее) ответу. Это дало мне отличное представление о мире генетического алгоритма - методе решения проблем, с которым я никогда раньше не сталкивался. Однако ответ, предоставленный Tak, дает решение, которое я буду использовать для этого проекта. Поэтому я наградил щедрость Таку.

4b9b3361

Ответ 1

Я подошел бы так вот так. Сначала таблица базы данных, которая связывает расписания с доступными опекунами...

Table schedules_shifts
id   service_user_schedules_id   carer_available_shifts_id

Теперь функция, соответствующая доступным опекунам, к требуемым слотам расписания и заполняет таблицу...

* Fetch service_user_schedules for the next week
* For each service_user_schedules row
 * Fetch carer_available_shifts that match the schedule slot
 * For each carer_available_shift row
  * If results
   * Fetch schedules_shifts rows where carer_available_shifts_id is already used
   * If no results
    * Insert a row in the schedules_shifts table for each carer
   * Otherwise carer is busy, do nothing and continue
  * If no results, flag for review or trigger e-mail to manager, or other action
* Trigger e-mail or save log of completion for peace of mind

В новой таблице теперь есть возможное совпадение соискателя для расписаний, без дублирования выделения времени опекуна. Тем не менее, он соответствует нескольким режимам удержания с расписанием. Это может быть особенностью! Оставьте их как есть и добавьте столбец confirmed в schedules_shifts, чтобы менеджер мог вручную назначить работу, или опекуны могут добровольно или автоматически пометить первое совпадение как confirmed и сохранить остальные строки в качестве альтернатив в случае, если первый опекун не может этого сделать.

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

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

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

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

Генетические алгоритмы кажутся интересными, и если у вас есть время исследовать их ^ _ ^

Надеюсь, что это поможет?

Ответ 3

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

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

Наверное, это немного перебор, но это интересная тема..:) Я хотел упомянуть об этом, потому что это может быть новый способ решить вашу проблему. По крайней мере, стоит подумать;)

Некоторые ссылки: Генетический алгоритмический ресурс, Учебник по генетическому алгоритму, Wikipedia


Изменить: более конкретное объяснение генетических алгоритмов.

Генетический алгоритм состоит в моделировании теории эволюционного развития. Эволюционное развитие нуждается в популяции определенных существ. Затем вы имитируете развитие популяции, используя определенные биологические эффекты, такие как мутация, отбор, скрещивание и т.д. Как Дарвин узнал несколько лет назад:)

Теперь вам нужно сопоставить свою проблему с таким существом (или с ДНК). Это означает, что каждое существо представляет собой решение в вашем проблемном пространстве (каждая ДНК является решением вашей проблемы).

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

Отображение от вашей проблемы к такой ДНК может быть сделано по-разному. Сначала вам нужен массив для представления вашей ДНК. Вы можете указать, например, следующее:

Вы создаете куски из 42 элементов для каждого пользователя службы (6 слотов в день, 7 дней в неделю). Тогда ваша первая запись в массиве - это слот "AM" /Mon для пользователя службы. Ваша вторая запись "Lunch" /Mon slot для пользователя службы 1. Ваша 43-я запись - это слот "AM" /Mon для пользователя службы 2 Это определяет ДНК вашего существа. Затем вы позволяете им сжимать друг друга, чтобы они могли развиваться:)

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

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

Очень короткое введение в генетические алгоритмы. Если у вас есть достаточно времени, и если вы также заинтересованы в теме, в которой она действительно стоит, то вы можете в нее поработать. Но имейте в виду, он может стать также грязным и сложным:)