我是一名 3d 动画导师,具有非常基本的 Python 知识,并且一直在努力编写我认为可能是非常有益的脚本的代码。任何帮助,包括正确方向的简单点都会非常非常感激。提前致谢。
这是我的场景:我班 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 个随机拆分可能性,并且我可以跟踪每次运行的最高结果。总而言之,这是一个有趣的脚本,可以尝试并弄清楚——实际上有点太有趣了。我可以' 即使我已经停止取得实际进展,也不要从身体上把自己从它身上撕下来。所以,如果有人可以提示/告诉我从这里去哪里,我将非常感谢您的帮助。
干杯,
- 伊莱