在R中使用lpSolve()赋值

lvmkulzt  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(94)

我正在尝试编写一个程序,将个体分配到组(P1,P2,P3)中,以使总体幸福感(以df表示)最高。每个个体都应该被分配到一个组中。组P1应该有200个个体,P3应该有500个个体,P3应该有300个个体。

library(lpSolve)

df <- data.frame(P1 = runif(1000, min=0, max=1), 
                 P2 = runif(1000, min=0, max=1),
                 P3 = runif(1000, min=0, max=1))

df <- data.matrix(df)

rows <- t(rep(1, ncol(df))) %x% diag(nrow(df))
columns <-  diag(ncol(df)) %x% t(rep(1, nrow(df)))

L <- list(columns, rows, columns)
nrs <- sapply(L, nrow)

mod <- lp(direction = "max", 
          objective.in = as.vector(df), 
          const.mat = do.call("rbind", L),
          const.dir = ###,
          const.rhs = ###,
          all.bin = TRUE)

matrix(mod$solution, nrow(df))

字符串
如何指定const.dirconst.rhs

jtoj6r0c

jtoj6r0c1#

这应该是可行的。为了在将个人分配到组时最大化总体幸福,您可以使用线性规划来解决这个问题。const.dir和const.rhs参数定义了问题的约束条件。在您的情况下,您希望确保每个组都有特定数量的个人。

library(lpSolve)

df <- data.frame(P1 = runif(1000, min = 0, max = 1),
                 P2 = runif(1000, min = 0, max = 1),
                 P3 = runif(1000, min = 0, max = 1))

df <- data.matrix(df)

rows <- t(rep(1, ncol(df))) %x% diag(nrow(df))
columns <- diag(ncol(df)) %x% t(rep(1, nrow(df)))

L <- list(columns, rows, columns)
nrs <- sapply(L, nrow)

const.dir <- c(rep("=", nrs[1]), rep(">=", nrs[2]), rep("=", nrs[3]))
const.rhs <- c(200, 300, 500)

mod <- lp(direction = "max",
          objective.in = as.vector(df),
          const.mat = do.call("rbind", L),
          const.dir = const.dir,
          const.rhs = const.rhs,
          all.bin = TRUE)

assigned_groups <- matrix(mod$solution, nrow(df))

字符串

相关问题