具有行和列约束的matrix

我需要解决的焦虑(n通常<12)matrix受到一些限制:

预定的行和列总和被满足。

2.行号大于列号的matrix中的每个元素必须为零(因此基本上唯一的非零元素必须在右上部分)。

3.对于给定的行,右边第一个非零元素的多于三列的每个元素也必须为零。

所以,一个4×4的matrix可能看起来像这样(在实践中,行和列约束将会大得多,通常约为1-3百万):

|3 2 1 0| = 6 |0 2 1 1| = 4 |0 0 2 1| = 3 |0 0 0 4| = 4 3 4 4 6 

我一直在尝试使用一些求解器方法来做到这一点在Excel中,也尝试了一些基于R的优化包,但迄今为止是如此不成功。

任何build议,我怎么可能会接近这个将不胜感激。

谢谢!

testing数据:

 x <- c(2,2,2,1,1,1,1) rowVals <- c(6,4,3,4) colVals <- c(3,4,4,6) 

函数从(3N-5)参数构造适当的testingmatrix:

 makeMat <- function(x,n) { ## first and last element of diag are constrained by row/col sums diagVals <- c(colVals[1],x[1:(n-2)],rowVals[n]) ## set up off-diagonals 2,3 sup2Vals <- x[(n-1):(2*n-3)] sup3Vals <- x[(2*n-2):(3*n-5)] ## set up matrix m <- diag(diagVals) m[row(m)==col(m)-1] <- sup2Vals m[row(m)==col(m)-2] <- sup3Vals m } 

目标函数(行和列偏差的平方和):

 objFun <- function(x,n) { m <- makeMat(x,n) ## compute SSQ deviation from row/col constraints sum((rowVals-rowSums(m))^2+(colVals-colSums(m))^2) } 

优化:

 opt1 <- optim(fn=objFun,par=x,n=4) ## recovers original values, although it takes a lot of steps opt2 <- optim(fn=objFun,par=rep(0,length(x)),n=4) makeMat(opt2$par,n=4) ## [,1] [,2] [,3] [,4] ## [1,] 3 2.658991 0.3410682 0.0000000 ## [2,] 0 1.341934 1.1546649 1.5038747 ## [3,] 0 0.000000 2.5042858 0.4963472 ## [4,] 0 0.000000 0.0000000 4.0000000 ## ## conjugate gradients might be better opt3 <- optim(fn=objFun,par=rep(0,length(x)),n=4, method="CG") 

似乎这个问题有多种解决scheme,这并不奇怪(因为(N-2)+(N-1)+(N-2)= 3N-5个参数有2N个约束)。

你没有说你是否需要整数解决scheme – 如果是的话,你将需要更多的专业工具…