R:使用 "missing values" 的 LPsolve(线性规划)

R: LPsolve (linear programming) with "missing values"

我正在尝试 运行 R 中的 LP (LPsolve),但我的组合之一永远不会发生。例如,如果我试图让雄性和雌性(不是人类 :-))交配以最大化函数值(下面称为 "rank" 的矩阵)。然而,其中一只雄性是其中一只雌性的同父异母兄弟,所以我不希望这种交配永远发生(比如下面矩阵中的雄性 1 和雌性 1)。我希望所有的雌性都交配(即一个约束),我希望所有的雄性都有 2 次且只有 2 次交配(另一个约束)。我试过让 [1,1] 交配真的很消极,这会有所帮助,但我希望它是万无一失的。我已经尝试过 NA、NULL 等但无济于事。 提前致谢

rank <- matrix (0,3, 6) # matrix of males (rows) x females (columns) with the value to maximize for each combination

for (i in 1:3)  {
 for (j in 1:6) 
    {
     rank[i,j] <-i*j
    }
}


m <- NROW(rank)  #number of males
f <- NCOL(rank)  # number of females

row.signs <- c(rep("=", m)) 
row.rhs <- c(rep(2,m))
col.signs <- rep ("=", f) 
col.rhs <- c(rep(1,f))

lp.transport (rank, "max", row.signs, row.rhs, col.signs, col.rhs)$solution

我认为您不能使用默认的运输问题公式来定义该约束... 我建议您手动定义运输问题,然后添加您的排除约束:

library(lpSolve)
m <- 3 # n of males
f <- 6 # n of females
# rank matrix
rank <- matrix(1:(m*f),nrow=m)
# sibling exclusions (where the matrix is 1, we don't allow mating for that combination)
# here we block male 1 with female 1
exclusions <- matrix(0,nrow=m,ncol=f)
exclusions[1,1] <- 1
# transportation problem definition
obj <- as.numeric(rank)
nMalePerFemaleRhs <- rep(1,f)
nMalePerFemaleSign <- rep("=",f)
nMalePerFemaleConstr <- matrix(0,nrow=f,ncol=m*f)
for(i in 1:f){
  nMalePerFemaleConstr[i,(i-1)*m+(1:m)] <- 1
}
nFemalePerMaleRhs <- rep(2,m)
nFemalePerMaleSign <- rep("=",m)
nFemalePerMaleConstr <- matrix(0,nrow=m,ncol=m*f)
for(i in 1:m){
  nFemalePerMaleConstr[i,seq(from=i,length.out=f,by=m)] <- 1
}
# sibling exclusions constraint
siblingConstr <- t(as.numeric(exclusions))
siblingRhs <- 0
siblingSign <- '='

res <- lp(direction='max',
          objective.in=obj,
          const.mat = rbind(nMalePerFemaleConstr,nFemalePerMaleConstr,siblingConstr),
          const.dir = c(nMalePerFemaleSign,nFemalePerMaleSign,siblingSign),
          const.rhs = c(nMalePerFemaleRhs,nFemalePerMaleRhs,siblingRhs),
          all.int = TRUE
          )
solutionMx <- matrix(res$solution,nrow=m)

结果:

> solutionMx
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    0    0    0    1    1
[2,]    0    0    1    1    0    0
[3,]    1    1    0    0    0    0