一道关于班次排列的数据分析题

来源:百度知道 编辑:UC知道 时间:2024/04/30 12:18:20
有早、中、晚3个班次类型,每个班次类型中有4个班次,早班次类型有A1、A2、A3、和A4等四个班次,中班次类型有B1、B2、B3、B4等四个班次,晚班次类型中有C1、C2、C3、C4等四个班次。每个班次的工作时间为8小时。A1、A2、A3、A4、B1、B2、B3、B4、C1、C2、C3、C4的开始时间分别为08:00、08:30、09:00、09:30、12:00、12:30、13:00、13:30、15:00、15:30、16:00、16:30。
有30天,每天需要的班次个数分别为{a11、a12…c13,c14……a301、a301……c303、c304},其中c304表示第30天需要C4班次的个数。
假设有16个班组,每个班组采用的循环顺序为A1、A2、A3、A4、B1、B2、B3、B4、C1、C2、C3、C4,只是循环次序不一样。按照这样的循环,可以得到每天每个班次的个数。
班次间隔指相邻两个班次之间的间隔,要求班次间隔大于10小时。如果按照下面的循环,班次C4后紧跟着班次A1,这两个班次之间的间隔只有7个半小时,是不允许的,需要将A1调整为其他的班次,比如调整为B1及以后的班次都可以满足要求。但这种调整会导致两个方面的问题:一是这天B1班次过多,而其他班次不足。二是该班组30天某班次类型过多,比如晚班过多等
问题,设计算法:
1 满足每天各个班次的需求;
2 满足班次间隔的要求;
3 满足班组30天班次类型均衡,班组之间相同班次类型最多相差1;
4 不用任何工具;
5 如果能用程序实现更好,不限语言(不做要求)。

日期 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
班组1 A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 A1 A2 A3
班组2 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 A1 A2 A3 A4
班组3 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 A1 A2 A3 A4 B1
班组4 A4 B1 B2 B3 B4 C1 C2 C3 C4 A1 A2 A3 A4 B1 B2
班组5

1.首先建立一个资料基本档,用数组实现,大小12*5,
数据如下(班次,始发时间,到达时间,序列号,类型):
A1 8:00 16:00 1 A(早班)
A2 8:30 16:30 2 A
... ...

再建立一个结果数组30列(即30天),里面存放某一班组30天的排班.

2.
向结果数组里填充班次,首先在第一天放A1班次.
执行check()过程=>
结果为1,代表成功,向第二天顺次放班次(如A1)
结果为0,代表不成功,向第二天顺次放下一个班次(如A2)
结果为-1,代表这一天放任何一个班次都不满足条件,返回到上一天去顺次放下一个班次.
一直执行到30天都填充满为止,退出.

check()过程主要是加入判断的条件:
同一班组前后两天的班次间隔大于10小时.
同一班组早中晚班各只能出现六次(即不大于6次).
同一班组的同一班次不能超过3次.
同一班组的班次为3次的班次不能超过6次.
以上成功则为1,不成功则为0.
当班次为C4时,表明所有的班次都不符合,所以为-1.
3.以上为一个遍历的过程,肯定是能找出一组符合条件的班组的.
4.最后再往后挪位得出其它15组数据.完毕.

A,B,C只3个班次,你一天排16个班当然有某班次类型过多,而且看 半天找不到明显的规律,只能给出一个笨办法:
建立2个数据库:数据库一:编号1(输入1—30) 班组;(编号1为那30天)
数据库二:
班次 编号2(需要输入)
公式:1=A1,2=A2,3=A3,4=A4,5=B1,6=B2,7=B3……
一个数据原,包含两个数据库
公试:班组=编号2
编号2=编号1
编号2=编号1+1
编号2=编号1+2
编号2=编号1+3
……
取0<编号2<17
注意区分变量和常量,并注意数据类型
得到结果为输入第某天,排列出当天的16个班次
思路就这