我是一名具有非常基本的Python知识的3D动画导师,一直在抨击墙壁试图编写我认为可能是非常有益的脚本的代码。 任何帮助,包括正确方向的简单点,将非常感谢。提前谢谢。
这是我的情景: 我的18名学生即将进入“小组项目”模块。 今年我想将课程分成两半,以使项目更易于管理,并鼓励健康的竞争。 学生们已经填写了调查表,他们通过给每个学生提供0到5之间的数字来注释他们与所有其他学生一起工作的偏好。 我的想法是,我可以使用这些调查以数学方式计算最佳可能的偏好。
现在我在CodeSkulptor中开始了一个非常基本的开始 - 一个基于浏览器的python模拟器。 在这个原型版本中,我开始只有4个样本“学生” - A,B,C和D. 每个学生都给出了他们对其他人的看法并且保持简单,他们对自己的看法都设置为0,(虽然这可能很容易成为任何价值,因为你不能与自己一起工作..)
这是我的伪代码:
创建包含所有学生的空集“学生”,即[A,B,C,D]
创建一个空集“组合”,将填充所有可能的组合,即[((A,B),(C,D)),((A,C),(B, d)),((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个随机分割可能性,我可以跟踪每个变换的最高结果。 总而言之,这是一个有趣的剧本,试图找出 - 实际上有点太有趣了。 即使我已经停止取得实际进展,我也无法将自己从身体上撕掉。 所以,如果有人能暗示/告诉我从哪里开始,我会非常感谢你的帮助。
干杯,
答案 0 :(得分:1)
from itertools import combinations
import numpy as np
import string
def get_maxhappiness(results):
max_happiness = max(results)
index = results.index(max_happiness)
#Printing the result! (There may be more than one best result, but this will only show 1)
print "Optimal Groups: Point value of",max_happiness,"\n",groups[index],"\n", anti_groups[index]
results[index] = 0
return results
def calculateHappiness(points,group):
happiness = 0
for i in range(len(group)):
person_prefs = points[group[i]]
others = group[i:] + group[:i]
for other in others:
happiness += person_prefs[other]
return happiness
if __name__ == "__main__":
people = string.letters[26:44]
groups = list(combinations(people,9))
anti_groups = [tuple(set(people).difference(set(x))) for x in groups]
#Making fake results
survey_results = dict()
for person in people:
results = dict(zip(people,np.random.randint(0,10,size=(len(people)))))
results[person] = 0
survey_results[person] = results
#Printing Survey Results
for name,values in survey_results.items():
print "Student:", name, "has preferences:", values
#Calculating happiness for every group
results = []
for i in range(len(groups)):
results.append(calculateHappiness(survey_results,groups[i])+calculateHappiness(survey_results,anti_groups[i]))
#Finding the largest happiness value
top_n = 5
while top_n > 0:
results = get_maxhappiness(results)
top_n -= 1
收率:
...
Student: N has preferences: {'A': 5, 'C': 5, 'B': 0, 'E': 0, 'D': 3, 'G': 6, 'F'
: 8, 'I': 8, 'H': 3, 'K': 1, 'J': 4, 'M': 4, 'L': 9, 'O': 0, 'N': 0, 'Q': 3, 'P'
: 2, 'R': 2}
Student: Q has preferences: {'A': 9, 'C': 0, 'B': 3, 'E': 4, 'D': 3, 'G': 2, 'F'
: 2, 'I': 7, 'H': 5, 'K': 2, 'J': 3, 'M': 0, 'L': 9, 'O': 2, 'N': 5, 'Q': 0, 'P'
: 2, 'R': 0}
Student: P has preferences: {'A': 2, 'C': 3, 'B': 0, 'E': 9, 'D': 3, 'G': 6, 'F'
: 7, 'I': 1, 'H': 7, 'K': 9, 'J': 7, 'M': 4, 'L': 8, 'O': 2, 'N': 6, 'Q': 5, 'P'
: 0, 'R': 7}
Student: R has preferences: {'A': 5, 'C': 3, 'B': 7, 'E': 1, 'D': 5, 'G': 6, 'F'
: 1, 'I': 6, 'H': 9, 'K': 9, 'J': 3, 'M': 6, 'L': 8, 'O': 8, 'N': 5, 'Q': 1, 'P'
: 3, 'R': 0}
Optimal Groups: Point value of 709
('A', 'B', 'F', 'G', 'J', 'K', 'O', 'Q', 'R')
('C', 'E', 'D', 'I', 'H', 'M', 'L', 'N', 'P')
(x4)