R-lp.assign()中的赋值算法

R-lp.assign()中的赋值算法,r,algorithm,R,Algorithm,有人知道用R函数来解决组合优化中的分配问题吗 例如:假设我有N=3个学生(1,2,3),S=4个可能的工作岗位(A、B、C、D)。每个N=3的学生对所有S=4的工作安排进行排名。1个位置显然不会有学生(缺失表示为“.”)。这是一个现实(因为N小于S),这很好。有(我想)4个!此处可能的分配: A B C D 1 2 3 . 1 . 2 3 1 3 . 2 1 . 3 2 1 3 2 . And so on for the next 18 possible ways... 如果N和S很小

有人知道用R函数来解决组合优化中的分配问题吗

例如:假设我有N=3个学生(1,2,3),S=4个可能的工作岗位(A、B、C、D)。每个N=3的学生对所有S=4的工作安排进行排名。1个位置显然不会有学生(缺失表示为“.”)。这是一个现实(因为N小于S),这很好。有(我想)4个!此处可能的分配:

A B C D
1 2 3 .
1 . 2 3   
1 3 . 2
1 . 3 2
1 3 2 .

And so on for the next 18 possible ways...

如果N和S很小,我可以考虑学生被分配到工作的所有可能的“现实”。我可以从每个“现实”中总结出等级。并选择最小和等级的现实作为(在一个公平的系统中)大多数学生得到他们想要的东西的现实

您试图解决的问题是运筹学中一个著名的问题,称为

贪婪算法不起作用,因为它强烈依赖于分配给学生的顺序,并且可能做出非常糟糕的决定

您可以简单地使用python中的
itertools
库来循环所有排列(如中所示),并选择最佳排列,但这样做确实非常昂贵(有可能的工作分配的阶乘)。。。虽然这是调试算法的一种方法;)

正如维基百科的文章所说,你可以用匈牙利算法来解决这个问题(但我不会自己去实现,这有点棘手),或者用最小成本流算法

Python中已经有了一个实现,并附带了一些示例:

要安装它,只需使用pip:

pip install munkres

您试图解决的问题是运筹学中一个著名的问题,称为

贪婪算法不起作用,因为它强烈依赖于分配给学生的顺序,并且可能做出非常糟糕的决定

您可以简单地使用python中的
itertools
库来循环所有排列(如中所示),并选择最佳排列,但这样做确实非常昂贵(有可能的工作分配的阶乘)。。。虽然这是调试算法的一种方法;)

正如维基百科的文章所说,你可以用匈牙利算法来解决这个问题(但我不会自己去实现,这有点棘手),或者用最小成本流算法

Python中已经有了一个实现,并附带了一些示例:

要安装它,只需使用pip:

pip install munkres

对于R中的示例,假设矩阵
m
如下,其中每行是学生,每列是工作,1表示学生的首选,2表示第二选择,依此类推。9表示该学生未对该工作进行排名。共有3名学生和4项任务,因此我们在最后一行的所有9名学生中添加了一名虚拟学生,
U
,以便学生和任务的数量相同。我们假设目标是最小化秩和。下面我们看到,最好的作业是将学生1分配给job
C
,将学生2分配给job
D
,将学生3分配给job
A
,而未分配的行则将job
B

m <- matrix(c(3, 2, 1, 9, 2, 3, 2, 9, 1, 9, 3, 9, 9, 1, 9, 9), 4,
       dimnames = list(c(1, 2, 3, "U"), c("A", "B", "C", "D")))

#   A B C D
# 1 3 2 1 9
# 2 2 3 9 1
# 3 1 2 3 9
# U 9 9 9 9

library(lpSolve)
fm <- lp.assign(m)
最后一行给出了以下内容,因此在这种情况下,每个学生都有自己的第一选择:

   student  job
1        1    C
2        2    D
3        3    A
4        U    B

请注意,可能存在多个最小化解决方案,例如,如果两个学生选择相同的排名。

对于下面R矩阵
m
中的示例,其中每行是学生,每列是工作,1表示学生的首选,2表示第二选择,依此类推。9表示该学生未对该工作进行排名。共有3名学生和4项任务,因此我们在最后一行的所有9名学生中添加了一名虚拟学生,
U
,以便学生和任务的数量相同。我们假设目标是最小化秩和。下面我们看到,最好的作业是将学生1分配给job
C
,将学生2分配给job
D
,将学生3分配给job
A
,而未分配的行则将job
B

m <- matrix(c(3, 2, 1, 9, 2, 3, 2, 9, 1, 9, 3, 9, 9, 1, 9, 9), 4,
       dimnames = list(c(1, 2, 3, "U"), c("A", "B", "C", "D")))

#   A B C D
# 1 3 2 1 9
# 2 2 3 9 1
# 3 1 2 3 9
# U 9 9 9 9

library(lpSolve)
fm <- lp.assign(m)
最后一行给出了以下内容,因此在这种情况下,每个学生都有自己的第一选择:

   student  job
1        1    C
2        2    D
3        3    A
4        U    B

请注意,可能存在多个最小化解决方案,例如,如果两个学生选择相同的排名。

您的直觉认为这不是一个适合SO的问题,这可能是正确的。基本上,您要求的是工具建议和一般意见的组合,这通常不是我们的目标。我建议你向这方面的专家咨询,可能是从事组合数学或组合优化的专家。你的直觉是,这不是一个适合SO的问题,这可能是正确的。基本上,您要求的是工具建议和一般意见的组合,这通常不是我们的目标。我建议您向该领域的专家咨询,可能是从事组合数学或组合优化.Thx的专家,以获得
lp.assign()
建议。我真正的问题是188*188成本矩阵。我得到输出
成功:我的问题的目标函数是1171
fm$solution
表的188行和列和分别为1。当我使用
job时,我假设在
fm$solution
中,每行和每列中都有一个1,其他的都是0。这里似乎不是这样。查看
fm$solution
以确定发生了什么。我更仔细地查看了我的矩阵…lp.assign()
的输出看起来像一个置换矩阵(可能是伪装的)。但是,当我从逻辑上评估那些看起来像1并给我带来问题的
[I,j]
元素是否为1时,它们的评估结果为
FALSE
。因此,当您查找精确的1时,为什么
which()
会失败。我通过对
fm$solution()
矩阵应用
round()
解决了这个问题。因此,我的伪装1四舍五入为1(精确),然后由
which()
函数找到