线性规划练习与R中的约束

时间:2018-03-08 11:53:33

标签: r matrix linear-programming

我正在寻找一个库或任何其他解决方案来解决这个问题。

我有一个矩阵,我需要用固定数量的1来填充,可能是随机的。此外,每行和每列都定义了一个不能超过的最大值(例如,A行中最多可以有5个,A列中最多可以有6个)。

在R中有一种简单,自动的方式吗?我需要一个更大矩阵的解决方案,例如50x50。

example

由于

1 个答案:

答案 0 :(得分:0)

以下是lpSolveAPI的示例:

fill_matrix <- function(nrow, ncol, n, maxcol, maxrow) {
    lprec <- make.lp(ncol=nrow*ncol, nrow=nrow+ncol+1)
    set.objfn(lprec, rep(0, nrow*ncol))
    set.type(lprec, 1:(nrow*ncol), "binary")
    for (i in 1:nrow) set.row(lprec, row=i, xt=rep(1,ncol), indices=seq(i, by=nrow, length.out=ncol))
    set.constr.type(lprec, rep("<=", nrow), constraints = 1:nrow)
    set.rhs(lprec, rep(maxrow, nrow), constraints=1:nrow)
    for (i in 1:ncol) set.row(lprec, row=nrow+i, xt=rep(1,nrow), indices=((i-1)*nrow)+1:nrow)
    set.constr.type(lprec, rep("<=", ncol), constraints=nrow+1:ncol)
    set.rhs(lprec, rep(maxcol, ncol), constraints=nrow+1:ncol)
    set.row(lprec, row=nrow+ncol+1, xt=rep(1,nrow*ncol))
    set.constr.type(lprec, "=", nrow+ncol+1)
    set.rhs(lprec, n, nrow+ncol+1)
    status <- solve(lprec)
    if(status!=0) stop("could not solve")
    matrix(get.variables(lprec), ncol=ncol, nrow=nrow)
}

现在fill_matrix(6,5,10,2,2)生成一个6x5矩阵,其中只有10个,每行/列最多2个。