(пример) Файл 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 гендерных команд. Кажется, что все, что я пытаюсь сделать, случайно увеличивает эти цифры.
Мне был предоставлен сгенерированный CSV-файл со сведениями о 6000 учащихся в формате: [code]Tutorial Group,Student ID,School,Name,Gender,CGPA[/code] [code]G-1,5002,CS,John Doe,Male,4.02[/code] (пример) [b]Файл CSV отсортирован по Группе обучения, в каждом уроке участвуют 50 учащихся.[/b]
Я должен разделить эти 6000 студентов на группы по 5 человек так, чтобы: [list] [*]В каждой команде должно быть хорошее соотношение учеников мужского и женского пола. [*]В команде не должны доминировать ученики из одной школы. [*] в команде не должно быть только учеников с низким или высоким баллом CGPA. [*]Учащиеся в команде должны быть из одной учебной группы (файл CSV отсортирован по группе Tut) [/list] Я создал рабочий алгоритм, использующий алгоритм жадной сортировки для отбора идеальных учеников на каждой итерации каждой команды. Вот как работает код : [list] [*]Перебирать учебные группы [*]Сортировать группы по возрастанию CGPA [*]Выберите студента по полу и критериям [*]Переверните отсортированную группу Tut (так, чтобы CGPA теперь уменьшался) [*]Запишите команду в файл output.csv и удалить участников команды из Tut [*]Продолжайте, пока Tut не станет пустым, и переходите к следующей учебной группе [/list]
# 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() [/code]
Результат [list] [*]Команды с нежелательным соотношением полов (4+ одного пола) : 73 [*]Команды с пятью представителями одного пола: 42 [*]Команды с нежелательным соотношением школ (3+ из одной школы): 15 Всего команд: 1200. [/list] Я имею в виду, что из 1200 это довольно неплохо, но я понятия не имею, как это сократить дальше, особенно для 5 гендерных команд. Кажется, что все, что я пытаюсь сделать, случайно увеличивает эти цифры.
Я работаю над системой управления школой в PHP, где мне нужно реализовать функцию маркировки посещаемости. Вот что я сделал до сих пор и чего я хочу достичь:
Что я сделал:
Я успешно извлекал студентов из таблицы студентов, выбрав имя класса и...
Я работаю над системой управления школой в PHP, где мне нужно реализовать функцию маркировки посещаемости. Вот что я сделал до сих пор и чего я хочу достичь:
Что я сделал:
Я успешно извлекал студентов из таблицы студентов, выбрав имя класса и...
Принимать шаблон, содержащий список последовательностей M, каждая из которых имеет длину M. Это список выровненные последовательности.
Использование его в классе AlignedScore, который создает...
Какие возможности существуют для эффективного создания графической формы в C#, которая позволяет редактировать файл JSON на основе схемы JSON? P>
Есть ли какие -нибудь альтернативы или даже совершенно другой подход?
Я реализовал на Java метод проверки учащихся по отпечаткам пальцев. Этот метод основан на библиотеке SourceAFIS для сопоставления отпечатков пальцев и предназначен для одновременной обработки нескольких отпечатков пальцев. Однако когда количество...