调度方法

Dan*_*ves 13 php time codeigniter scheduling date

我正在为家庭护理公司开发一个PHP应用程序.他们每周安排x个护理人员参加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     -     -      -       -
Run Code Online (Sandbox Code Playgroud)

这些期间当前以以下格式存储在数据库中:

Table: Service_user_schedules
id   service_user_id   day   period   duration
Run Code Online (Sandbox Code Playgroud)

护理人员每周都会填写一份表格,列出他们可以工作的时间.然后将此数据输入系统并以下列格式存储在数据库中:

Table: Carer_available_shifts
id   carer_id   day   period
Run Code Online (Sandbox Code Playgroud)

现在问题是,我需要创建一个控制器来获取这些数据,并根据他们提供的可用性自动将护理者分配给服务用户.这需要是可编辑的,以便在没有人可用于特定护理者的情况下,用户可以选择一个不可用的,并且它们仍将被添加到数据库中.

目前,我有一堆乱七八糟的循环,函数和回声来检查护理人员是否可用于特定服务用户并使其可编辑.

有没有人之前执行过这种任务,如果有的话,你找到了一种简单的方法来完成它.我宁愿让它面向对象,所以我可以重用相同的泛型类,但此刻,我完全失去了!

编辑:我现在已经为这个问题增加了一笔赏金.我目前正在研究遗传算法(我从来没有听说过,更不用说了!)作为基于一些答案的这个问题的解决方案.我想知道你们是否有人使用其他方法来解决这类问题,或者你们是否使用过遗传算法,你能否就如何将它们应用于这一特定问题提供一般性的解释.

我认为这个障碍在许多"人员配备"类型的应用程序中相当普遍,并且对网上任何地方的讨论很少感到惊讶!

UPDATE

对于这个特定的项目,我想我最终可能会使用Tak所描述的数据库方法,但如果我有更多的开发时间,将来可能转换为使用GA.

我现在对于将赏金奖励给谁感到有点失落.duedl0r在他(或她)的回答中付出了很多努力.它让我对遗传算法的世界有了深刻的了解 - 这是一种我以前从未遇到过的问题解决方法.但是,Tak提供的答案提供了我将用于此项目的解决方案.因此,我已将此奖励给了德.

Tak*_*Tak 1

我会这样处理它。首先是一个数据库表,将时间表空档链接到可用的护理人员......

Table schedules_shifts
id   service_user_schedules_id   carer_available_shifts_id
Run Code Online (Sandbox Code Playgroud)

现在有一个功能,可以将可用的护理人员与所需的时间表时段进行匹配并填充表格......

* 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
Run Code Online (Sandbox Code Playgroud)

新表现在具有可能的护理人员与日程安排时段的匹配,并且不会重复分配护理人员的时间。然而,它确实将多个护理人员的轮班与时间表时段相匹配。这可能是一个功能!将它们保留原样并添加一confirmed列,schedules_shifts以便经理可以手动分配工作,或者护理人员可以志愿工作,或者自动将第一个匹配标记为confirmed并保留其他行作为替代,以防第一个护理人员无法完成任务。

这都可以由每周的 cron 触发,或者当最终的职业更新他们的一周的日程安排时触发。可能是第一个,因为用户通常是不可预测的。

现在,自动数据位于表格中,您可以将其打开进行编辑。创建一个普通的管理控制台,根据需要更改行schedules_shifts,或将不同的行标记为“已确认”。

将其转换为通用类应该不会太困难 - 只需使用通用术语即可。已经很晚了,但我想不出任何办法:)

可以在 PHP 数组中进行所有数据筛选,而不是在我上面创建的数据库舞蹈中进行,但我认为 SQL 更适合对数据进行排序并进行修改。

遗传算法听起来很有趣,如果你有时间研究一下^_^

希望有帮助吗?