Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向R中的ompr线性规划约束添加约束,使每个人只能扮演一个角色?_R_Linear Programming_Mixed Integer Programming_Ompr - Fatal编程技术网

如何向R中的ompr线性规划约束添加约束,使每个人只能扮演一个角色?

如何向R中的ompr线性规划约束添加约束,使每个人只能扮演一个角色?,r,linear-programming,mixed-integer-programming,ompr,R,Linear Programming,Mixed Integer Programming,Ompr,我试图在R中的混合整数规划模型中添加一个约束,这样每个人只被分配到一个角色 我有一个如下所示的数据框: ID Name Role PreferenceScore ----- ------- --------- ------------------ 1 Abby Chef 10 1 Abby Waiter 8 1 Abby Greet

我试图在R中的混合整数规划模型中添加一个约束,这样每个人只被分配到一个角色

我有一个如下所示的数据框:

ID    Name     Role     PreferenceScore  
 ----- ------- --------- ------------------ 
    1   Abby    Chef                    10  
    1   Abby    Waiter                   8  
    1   Abby    Greeter                  9  
    2   Bob     Chef                     7  
    2   Bob     Waiter                   8  
    2   Bob     Greeter                  3  
    3   Carly   Chef                     5  
    3   Carly   Waiter                   8  
    3   Carly   Greeter                  4  
   ...  ...     ...                      ...
   20   David   Chef                     2  
   20   David   Waiter                   3  
   20   David   Greeter                  8  
我正在尝试使用MIPmodel根据每个人的偏好(数字越大越好)为他们分配一个角色。每个角色最多可以有8人,总共有20人

以下是我到目前为止的情况:

library(dplyr)
library(ompr)
library(ompr.roi)
library(ROI)
library(ROI.plugin.glpk)

teamData <- read.csv("filename")
teamData$wait <- if_else(teamData$jobType == "Waiter", 1, 0)
teamData$chef <- if_else(teamData$jobType == "Chef", 1, 0)
teamData$greet <- if_else(teamData$jobType == "Greeter", 1, 0)

p <- nrow(teamData)
v <- as.numeric(teamData$PreferenceScore)
maxTeamSize <- 8
role <- teamData$Role

chef_job <- teamData$chef 
waiter_job <- teamData$wait
greeter_job <- teamData$greet
name <- teamData$Name

# Build the model
model <- MIPModel() %>%
  add_variable(x[i], i=1:p, type = "binary") %>%
  set_objective(sum_expr(x[i] * v[i], i=1:p)) %>%
  add_constraint(sum_expr(chef_job[i], i=1:p) <= 8) %>%
  add_constraint(sum_expr(waiter_job[i], i=1:p) <= 8) %>%
  add_constraint(sum_expr(greeter_job[i], i=1:p) <= 8) # %>%
#   add_constraint(sum_expr(count(name[i])) == 1)

solved <- solve_model(model, with_ROI("glpk"))

result <- solved %>%
  get_solution(x[i]) %>%
  select(i) %>% 
  rowwise() %>% 
  mutate(Pref = v[i], Role = role[i], teamData$Name[i]) %>%
  ungroup

result
库(dplyr)
图书馆(ompr)
图书馆(ompr.roi)
图书馆(ROI)
库(ROI.plugin.glpk)
teamData这是一个典型的分配问题,您将人员
p
分配给工作
j
。因此,您需要更新公式以获得双索引决策变量
x[p,j]
。然后事情会变得更有意义……:)

然后,您可以对所有作业进行求和,以确保每个人的分配不超过一个(在伪代码中…我的R语法很糟糕):

你的目标函数将通过乘以偏好[p,j]

sum (x[p, j] for j in Jobs) <=1  for p in Persons
sum (x[p, j] for p in People) <= spots[j] for j in Jobs