Python随机座位生成器带有记忆功能

4

我已经搜索了一些类似的项目,但还没有找到任何能引导我解决这个项目的方向,所以我来到Stack上寻求建议。我并不是在寻找完整的解决方案,而是只是想要一些关于如何处理这个问题的建议。

我的目标

我正在尝试编写一个程序,用于随机生成8周课程的座位表。 它从Excel文件中读取80个姓名,并输出另一个Excel文件,其中包含8个工作表,每个工作表都有一个不同的8x10随机生成的座位表。 看起来很简单吧?

然而,我还有三个附加条件:

  • 我希望避免任何一个学生在两周内坐在同一学生旁边(前面、后面或侧面)
  • 我不希望任何一个学生在前排或后排连续坐两周
  • 这些学生住在宿舍里,我不希望在任何一周中,来自同一房间的学生坐在一起

这是为一个为期8周的MBA班级,我之所以要做这个,是为了让学生们认识新同学,激发新的对话。

目前我已经做了什么

from openpyxl import Workbook, load_workbook
import random
import itertools


load_wb = raw_input('What is the name of the file containing your students?\n')
num_of_weeks = int(raw_input('How many weeks would you like?\n'))


dest_filename = 'seating_chart.xlsx'
students = []


load_wb = load_workbook(load_wb).active

for cell in load_wb.iter_rows():
  students.append(cell[0].value)


def make_grid():
  #Make the 8 x 10 grid
  y_list = list(range(1, 11))
  x_list = list(range(1, 9))
  grid = []

  for y in y_list:
    for x in x_list:
      grid.append((x,y))

  return grid



save_wb = Workbook()
grid = make_grid()
for week in range(num_of_weeks):
  week +=1 
  if week == 1:
    ws = save_wb.active
  else:
    ws = save_wb.create_sheet()
  ws.title = 'Week '+str(week)

  #Randomly shuffle the students array
  random.shuffle(students)
  for x, student in itertools.izip(grid, students):
    x,y = x
    ws.cell(row=x, column=y, value=student)


save_wb.save(filename=dest_filename)

我知道我显然需要存储每个学生每周的座位信息,并在生成随机图表时引用这些信息,但我对Python比较陌生,不确定最佳方法是什么。
提前感谢大家的建议! :)
Joey

1
我认为这个问题有两个方面,软件设计和算法。我认为后者是某种着色问题,最好在数学SE上讨论。 - Tobia Tesan
1
你可能可以随机生成座位安排并检查你的标准。至于读写Excel工作表,我没有使用openpyxl的经验。如果你在使用它时遇到任何问题,你可以像我一样:导出为csv文件,然后编写csv文件并将其导入Excel。 - Elektito
此外,这并不是 Stack Overflow 所期望的问题类型。如果您提出更具体的分离问题,并保持足够的一般性,例如如何生成符合特定标准的座位安排,或如何在 Python 中读写 Excel 文档等,您可能会有更多的运气。 - Elektito
Excel文件不是必须的,我已经能够读写Excel文件了,这很容易。如果使用CSV文件可以使事情更简单,我甚至可以摆脱Excel文件。我更感兴趣的是实现座位安排的三个标准。谢谢大家的建议! - Joey Orlando
@JoeyOrlando: 是始终有10组8个学生,还是有(k>=10)组不超过8个学生的组合? - Eric
显示剩余3条评论
1个回答

0
这里有一种方法:
  1. 将班级分成两组,使得A组中没有人与B组住在同一个房间(如果所有宿舍组都有8个人,则可能,否则仍然几乎可能)
  2. 将A组排列成棋盘图案,并要求他们保持座位不变
  3. 将B组排列成棋盘图案,围绕A组坐。每节课时,将B组在短维度上移动3个座位,在长维度上移动一个座位。向两侧像环面一样包裹。在这里你可以得到恰好8个座位之后的重复,这很方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接