有了数据源接下来就是把各种选择各种组合的考生安排到考室,使之达到每个考室最多有两种组合且有公共选科的考生,甚至只有一种组合的考生.
分析需要各种选科的人数表,考室容量表:
这是考场容量表:容量的含义是该考室最多容纳人数,可以少,意味着40人的考室有富于的话 可以当成32和28人的考室使用,32人考室也是可以当成28人考室使用.地点 就不完整截取了.
这是各种组合的选择人数:
考虑组合化生:
temp = 40i+32i2+28*i3
dx1 = temp -151
anpai=[i,i2,i3]
这样dx1 被定义为 此种安排下第一种组合富余的座位,空座位.
很明显 dx1必须要在合理范围内,最大值为:总座位数-总考生数
因为太繁琐了,这里就写出第一种组合的dx求法和对应的安排列表,
if temp - na > 0 and temp - na < 19:
这个条件被我定义为合理的安排条件,能安排下,但是空座位不超过总的空座位数.
subs = ['化生', '化政', '化地', '生政', '生地', '政地']
# 尝试六种 不组合 排考室
dx1 = []
anpai1 = []
for i in range(20):
for ii in range(6):
for iii in range(3):
temp = 40 * i + 32 * ii + 28 * iii
if temp - na > 0 and temp - na < 19:
dx1.append(temp - na)
anpai1.append([i, ii, iii])
anpais = []
dxs = []
dxs.append(dx1)
anpais.append(anpai1)
把每一种合理的可能安排用两种量来描述: dx表示 空座位
anpai[]表示具体使用的各类考室数量.,他们是成对出现的,所以在总体的列表中的偏移量是一致的.
为了更好的观察是否正确,把这些做成了一个新的df表
data1 = pd.DataFrame({
'dx': dxs[0], "项目安排": anpais[0]})
print(data1, '项目1')
每个组合,都这样处理一遍,就获得了dxs[],以及每个dx对应的anpai[]列表.这些安排都符合所有考室只有一种组合,现在只要满足另一个要求:考室数量不能超过每种类型的最大值.
dxs[0]是一个列表 表示组合1的空座位;
那么dxs[0][i1] +dxs[2][i2]+dxs[3][i3] +dxs[4][i4]+dxs[5][i5] +dxs[6][i6]
再把i1—i6分别在各自的范围内遍历起来,就能获得所有的安排自由搭配下空座位的总数.再把这个总数 <总座位数-总考生数,那么就可以缩小范围.
for i1 in range(len(data1.dx))