- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在为学生研究这种通用分配算法。
它的伪代码(Python 实现)是:
for a student in a dictionary of students:
for student preference in a set of preferences (ordered from 1 to 10):
let temp_project be the first preferred project
check if temp_project is available
if so, allocate it to him and make the project unavailable to others
break
很简单,这将尝试从最喜欢的项目开始分配项目。它的工作方式是,在一组假设 100 个项目中,你列出 10 个你想做的。因此,第 10 个项目不会是“总体上最不受欢迎的”,而是在他们选择的集合中最不受欢迎的,这还不错。
显然,如果无法分配项目,学生只会恢复到基本情况,即无分配,等级为 11。
我正在做的是根据等级的加权和计算分配“质量”。因此,数字越低(即更多高度偏好的项目),分配质量越好(即更多学生拥有高度偏好的项目)。
这基本上就是我目前所拥有的。简单有效。
现在我正在研究这个试图在本地最小化分配权重的算法(这个伪代码有点乱,抱歉)。
这可能有效的唯一原因是因为我的“搜索空间”并不是特别大(请注意,这只是一个非常普遍的轶事观察)。由于该项目仅针对我的部门,因此我们有自己的限制。所以学生人数不能超过100人,偏好人数也不能超过10人。
for student in a dictionary/list/whatever of students:
where i = 0
take the (i)st student, (i+1)nd student
for their ranks:
allocate the projects
and set local_weighting(N) to be sum(student_i.alloc_proj_rank, student_i+1.alloc_proj_rank)
these are the cases:
if N is 2 (i.e. both ranks are 1):
then i += 1 and
and continue above
if N > 2 (i.e. one or more ranks are greater than 1):
let temp_N be N:
pick student with lowest rank
and then move him to his next rank
and pick the other student and reallocate his project
temp_N is sum of the the ranks
if temp_N is < N:
then allocate those projects to the students
i += 1
and move on for the rest of the students
更新评论:
我正在尝试做的事情:
我正试图在两个学生组之间实现“最低权重分配”(即本地)
权重分配是学生指定排名的总和。我们希望学生获得总体排名最高的项目。因此,如果学生 A 获得了他排名第 1 的项目,而学生 B 获得了她排名第 5 的项目,则他们的本地分配权重为 6。如果我们将学生 A 移至他排名第 2 的项目,因此,学生 B 将移至她的排名3 项目然后权重现在是 5. 5 < 6 总体上更好。
因此,我从我的学生集合开始,然后开始遍历他们
我从第一个和第二个学生开始,给他们分配他们的项目
然后我按上述方法计算权重。考虑到权重等于排名,如果两者都排在第 1 位,则权重为 2。这已经很好了,我们想继续第二和第三位学生。
现在,如果权重大于2,说明一个或多个项目的排名大于2,我们尝试得到一个更好的版本。
因此,我们选取排名最低的学生,然后将他/她降一级(因此,如果他/她是排名 1,则将他降到排名 2)
然后我们尝试将其他学生重新分配到另一个等级。
现在,如果权重比以前的权重更好,那么我们就将其作为新的权重,并让他们拥有这些项目。如果它更差或相等,那么我们就转到下一组学生。
在本地,对于学生来说,这个东西一直在尝试,直到它达到最小重量并且不能做得更好。
希望这能解释我想做什么?
那么,问题:
这是模拟退火的一种修改,但如有任何评论,我们将不胜感激。
我如何跟踪哪个学生是 (i) 以及哪个学生是 (i+1)
如果我的学生总数是 100,那么在 (i+1) = 101 时事情会搞砸,因为没有学生。我怎样才能避免这种情况?
有任何可以立即发现的缺陷吗?
额外信息:
我的学生词典是这样设计的:
students[student_id] = Student(student_id, student_name, alloc_proj, alloc_proj_rank, preferences)
where preferences is in the form of a dictionary such that
preferences[rank] = {project_id}
最佳答案
好像Assignment Problem可能对你有用,可以使用 Hungarian Algorithm 解决(如您在其他问题中所述:Student-Project allocation algorithms?)。
显然有一个匈牙利算法的 python 实现:http://pypi.python.org/pypi/hungarian/0.2
我建议只使用一种众所周知且已经实现的算法,而不是尝试提出自己的算法。
如果您真的想使用自己的算法并希望获得有关如何让它发挥作用的建议,我建议您清楚地解释您正在尝试做什么,而不仅仅是提供代码。
祝你好运,希望对你有所帮助。
关于python - 分配算法帮助,使用Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2936675/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!