Подходя к этому как к проблеме lp, на которую phiver также ссылается в ссылке, предоставленной Стефаном Лораном в комментарии:
library(lpSolve)
library(data.table)
nr <- 4
nc <- 4
ne <- nr * nr
v <- vector("integer", ne)
colvec <- replace(v, seq_along(v) <= nr, 1L)
rowvec <- replace(v, seq_along(v) %% nc == 1, 1L)
colconstr <- c(3, 2, 4, 2)
rowconstr <- c(3, 2, 4, 2)
const.mat <- do.call(rbind, c(
data.table::shift(colvec, seq(0L, ne - nc, nc), fill=0L),
data.table::shift(rowvec, 0L:(nr-1L), fill=0L)))
const.rhs <- c(colconstr, rowconstr)
s <- lpSolve::lp("min", runif(ne), const.mat,
rep("==", nrow(const.mat)), const.rhs, all.bin=TRUE)$solution
matrix(s, nrow=nr)
пример вывода:
[,1] [,2] [,3] [,4]
[1,] 1 0 1 1
[2,] 1 0 1 0
[3,] 1 1 1 1
[4,] 0 1 1 0