Я - трехмерная анимационная наставница с очень фундаментальным знанием Python, и я бил головой о стену, пытаясь закодировать то, что, по моему мнению, может быть ОЧЕНЬ полезным сценарием. Any помощь, включая простую точку в правильном направлении, была бы очень оценена. Заранее спасибо.Разделить группу людей пополам на основе предпочтений
Вот мой сценарий: Мой класс из 18 студентов вот-вот вступит в модуль «групповой проект». В этом году я хотел бы разделить класс пополам, чтобы проекты были более управляемыми, а также поощрять здоровое соревнование. Студенты уже заполнили опросы, в которых они аннотировали свое предпочтение работать со всеми другими учениками, задавая каждому номер между 0 и 5. Моя идея заключается в том, что я могу использовать эти опросы для математического расчета наилучшего возможного разделения в терминах предпочтения.
Теперь я сделал очень простой старт в CodeSkulptor - эмуляторе на основе python на основе браузера. В этой версии прототипа я начинаю с всего лишь 4 образцов «учеников» - A, B, C и D. Каждый студент дал свое мнение о других и чтобы все было просто, их мнение о себе все установлено на 0, (хотя это может так же легко быть любое значение, так как вы не можете нЕ работать с самим собой ..)
Вот мой psuedocode:
Создать пустой набор «студентов», который будет содержать все студенты , т. е. [A, B, C, D]
Создайте пустые набор «комбинаций», которые будут заполнены al л(), ((A, D) (B, C))]
определить класс, содержащую информацию о предпочтениях для каждого студента, как только все возможные комбинации были определены, эта информация будет использоваться для расчета комбинации с общим высшим «Счастьем»/«Настроение» ..
Создайте функцию, которая циклически проходит через все возможные комбинации, возвращая их в виде списков списков, которые добавляются к установленным комбинациям.
(еще не добавлено) Создайте функцию, которая циклически перебирает все комбинации в наборе «комбинации» и вычисляет общее «счастье» на основе предпочтений, сохраненных в классе ученика.
(еще не добавлено) Создайте функцию, которая печатает комбинации с наивысшим счастьем.
В этом случае он должен напечатать:
print"A,B/C,D = 7"
print"A,C/B,D = 10"
print"A,D/B,C = 15"
print"Highest possible split is A,D/B,C with overall happiness of 15!"
Я отчасти смущен, чтобы показать WIP .. но вот это:
http://www.codeskulptor.org/#user17_EEvOfHGg7AAZt1w_1.py
Или для тех, что лучше остановиться на этой странице:
people = set([])
combinations = set([])
class person:
def __init__(self, name, A = 3, B = 3, C = 3, D = 3):
self.name = name
self.A = A
self.B = B
self.C = C
self.D = D
def get_name(self):
return self.name
def get_A(self):
return self.A
def get_B(self):
return self.B
def get_C(self):
return self.C
def get_D(self):
return self.D
# make all the possible combinations
#def combine(people):
#combine any 2 given people into a new group
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = range(r)
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
####[A,B,C,D]
people.add(person("A", 0, 1, 2, 4))
people.add(person("B", 3, 0, 3, 4))
people.add(person("C", 1, 5, 0, 2))
people.add(person("D", 3, 3, 2, 0))
combinations(people,2)
Функция комбинаций - я действительно поднял ее прямо с страницы документации itertools, но я не совсем уверен, работает она или даже если это лучший способ разделить группы. Я не могу импортировать itertools напрямую, поскольку CodeSkulptor поддерживает только несколько модулей (математика, случайность, время и т. Д.). Я попытался использовать реальный python, но он функционирует много иначе, чем я привык. Я многому научился в своих исследованиях, таких как вычисление чего-то вроде этого может занять годы для того, чтобы компьютер прошел через 24310 различных возможностей разделения. Другим вариантом было бы, чтобы код просто генерировал 100 случайных возможностей разделения на и я мог следить за самым высоким результатом каждого прохода. В общем, это был забавный сценарий, чтобы попытаться выяснить - на самом деле это слишком весело. Я не могу физически оторваться от него, хотя я и не сделал реального прогресса. Так что, пожалуйста, если кто-то может намекнуть/показать мне, куда идти отсюда, я очень благодарен за помощь.
Приветствия,
- Эли
, которую вы фактически разделив класс пополам (с группами 9), или вы раскалываете класс в группы из двух? – user2357112
Половина (две группы из 9) Это было упомянуто во втором абзаце. и, no - ((A,), (B, C, D)) будет недействительным –
Я предлагаю посмотреть встроенный модуль под названием itertools - очень полезный инструмент. Я думаю, вы можете найти [itertools.combinations] (http://docs.python.org/2/library/itertools.html#itertools.combinations), чтобы быть очень полезными – charmoniumQ