【问题标题】:matrix with row and column constraints具有行和列约束的矩阵
【发布时间】:2013-07-25 13:43:02
【问题描述】:

我需要求解一个 n x n(n 通常

1.满足预定的行列总和。

2.矩阵中行号大于列号的每个元素都必须为零(所以基本上只有非零元素必须在右上角)。

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

因此,4x4 矩阵可能看起来像这样(行和列约束在实践中会大得多,通常约为 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 的优化包,但到目前为止都没有成功。

任何关于我如何解决此问题的建议将不胜感激。

谢谢!

【问题讨论】:

    标签: r excel vba optimization linear-algebra


    【解决方案1】:

    测试数据:

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

    从 (3N-5) 个参数构造适当的测试矩阵的函数:

    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")
    

    这个问题似乎有多种解决方案,其中 不足为奇(因为 (N-2)+(N-1)+(N-2)= 有 2N 个约束 3N-5 个参数)。

    你没有说你是否需要整数解——如果 所以你需要更专业的工具...

    【讨论】:

    • 感谢您的帮助,我不需要整数,只需要非负值。不过,L-BFGS-B 方法似乎可以很好地满足这一点。
    猜你喜欢
    • 2023-04-08
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多