自动排档期算法

博客已经遍地是草,今天来清一清。即将退出学生会,想给学校留下一个礼物,所以编写了一个学生的广播平台,方便学生互动,并提供一个师生交流的平台,预计校运会上线。

广播部OA系统的前端大部分自主开发,包括但不限于样式表、函数库;后端部分采用 Thinkphp 框架编写,因为学习成本低。

自动排档期的算法是整个程序略为复杂的一部分,我自己有两个方案。

CONFIG

先总的介绍这一模块的数据表结构和配置:

bcs_schedule 所有工作日
bcs_schedule_day 单日节目安排表
bcs_schedule_song 节目信息

NOON_TIME = 1800 中午工作时间
AFTERNOON_TIME = 1800 下午工作时间
ALLOW_EXCEED = 185 允许超过时间

配置以秒为单位;bcs_ 为表前缀,下文省略

0x01

我们的设定是最多安排到两周的节目,所以要设置 CRON 任务,每天凌晨一点自动创建第14天的工作日,以确保第14天的节目有工作日可安排。

当一个节目要进入单日安排表时,服务器首先计算节目的时间并转换为以秒为单位的时间量,其次在数据库查询最近一个工作日的安排情况 ( shedule_day ),若节目设置在中午播放,就计算该节目与当天中午其它节目的时间总和,若小于或等于 ( NOON_TIME + ALLOW_EXCEED )的和,则安排成功,否则安排失败,服务器将继续查询下一个工作日然后重复以上操作直至第 14 日。

0x02__

第二方案十月提出,与第一方案相比主要在于减少大量的数据库查询。

服务器按节目的需求进行安排,若安排在中午时段,就一次性查询近 14 个工作日中午节目的时间量。如果该节目时间量和近一个工作日中午节目的时间量之和小于或等于(NOON_TIME + ALLOW_EXCEED),则安排到这个工作日,否则该节目时间量与下一个工作日午间节目量相加,重复以上工作直至第十四个工作日。