Оптимизировать алгоритм жадной сортировки, используемый для разделения учащихся на группы по 5 человек с одинаковым соотPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Оптимизировать алгоритм жадной сортировки, используемый для разделения учащихся на группы по 5 человек с одинаковым соот

Сообщение Anonymous »

Мне был предоставлен сгенерированный CSV-файл со сведениями о 6000 учащихся в формате:

Код: Выделить всё

Tutorial Group,Student ID,School,Name,Gender,CGPA

Код: Выделить всё

G-1,5002,CS,John Doe,Male,4.02
(пример)
Файл CSV отсортирован по Группе обучения, в каждом уроке участвуют 50 учащихся.

Я должен разделить эти 6000 студентов на группы по 5 человек так, чтобы:
  • В каждой команде должно быть хорошее соотношение учеников мужского и женского пола.
  • В команде не должны доминировать ученики из одной школы.
  • в команде не должно быть только учеников с низким или высоким баллом CGPA.
  • Учащиеся в команде должны быть из одной учебной группы (файл CSV отсортирован по группе Tut)
Я создал рабочий алгоритм, использующий алгоритм жадной сортировки для отбора идеальных учеников на каждой итерации каждой команды.
Вот как работает код :
  • Перебирать учебные группы
  • Сортировать группы по возрастанию CGPA
  • Выберите студента по полу и критериям
  • Переверните отсортированную группу Tut (так, чтобы CGPA теперь уменьшался)
  • Запишите команду в файл output.csv и удалить участников команды из Tut
  • Продолжайте, пока Tut не станет пустым, и переходите к следующей учебной группе
Мой код

Код: Выделить всё

# config
school = ['CS', 'EE', 'BS', 'HS', 'COM', 'CE', 'MS', 'SS', 'CEB', 'MED']
team_size = 5
toggle_cgpa = 0

# open and copy records
fp = open('records.csv','r')
pool = [i.replace('\n','').split(',') for i in fp.readlines()][1:]
tuts = [sorted(pool[i:i+50], key = lambda x: x[5]) for i in range(0,len(pool),50)]
fp.close()
fo = open('output.csv','w')

# fetch desirable student from the tutorial group
def fetch_std(tut,gender='MaleFemale',schools=[]):
global toggle_cgpa
toggle_cgpa = (toggle_cgpa+1)%2 # switch between 0 and 1
if toggle_cgpa: tut = tut[::-1] # reverse tut group every other run

gnd, sch = [], []
for std in tut:
if std[4] in gender and std[2] not in schools: return std
if std[4] in gender: gnd.append(std)
if std[2] not in schools: sch.append(std)
if gnd: return gnd[0]
elif sch: return sch[0]
else: return tut[0]

# for each tutorial group
for tut in tuts:
# prioritize three of majority gender
m_tut = f_tut = 0
for std in tut:
if std[4]=='Male': m_tut += 1
else: f_tut += 1

while tut:
if len(tut)f_tut: k = fetch_std(tut,gender='Female')
else: k = fetch_std(tut,gender='Male')
team.append(k)
tut.remove(k)

# fetch and append
while len(team)1]

if m>3: team.append(fetch_std(tut,gender='Female',schools=school_bl))
elif f>3: team.append(fetch_std(tut,gender='Male',schools=school_bl))
else: team.append(fetch_std(tut,schools=school_bl))

# remove selected team members from the pool
for k in team:
if k in tut: tut.remove(k)

for i in team: fo.write(','.join(i)+'\n')
fo.write('\n')

fo.close()
Результат
  • Команды с нежелательным соотношением полов (4+ одного пола) : 73
  • Команды с пятью представителями одного пола: 42
  • Команды с нежелательным соотношением школ (3+ из одной школы): 15
    Всего команд: 1200.
Я имею в виду, что из 1200 это довольно неплохо, но я понятия не имею, как это сократить дальше, особенно для 5 гендерных команд. Кажется, что все, что я пытаюсь сделать, случайно увеличивает эти цифры.


Подробнее здесь: https://stackoverflow.com/questions/791 ... ps-of-5-wi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»