如何build立一个matrix乘法的简单优化模型?

我已经使用标准的求解器在Excel中创build了一个优化模型,现在我想在R中创build一个类似的模型,这样我可以制作更大的模型。 不幸的是,我有点难以find可以模拟我的概念的好例子。 因此,我想问你们有没有人能给我一些关于如何在R做出类似模型的暗示。

我已经将我的Excel工作表上传到http://dl.dropbox.com/u/9641130/R/Positioning%20Optimization%20R.xlsx

基本思想是通过将范围E10:L19中的最大8个单元更改为1来使单元B3最大化。 B3单元包括范围E10:L19的一个副产品()和许多类似的范围。

我期待看到如何在R中build立一个类似的模型的一些提示。

谢谢! Jochem

========

更新以下蔡斯的build议

我想用一些repoducable R代码来澄清我的问题。 这与您在上面Excel代码中find的模型大致相同。

最初的一组matrix:

A <- as.matrix(structure(list(X0 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.4 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.5 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.6 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X0.7 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("X0", "X0.1", "X0.2", "X0.3", "X0.4", "X0.5", "X0.6", "X0.7"), class = "data.frame", row.names = c(NA, -9L))) B <- as.matrix(structure(list(X1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.3 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X.100000 = c(-100000L, -100000L, -100000L, -100000L, 1L, 1L, 1L, 1L, 1L), X.100000.1 = c(-100000L, -100000L, -100000L, -100000L, 1L, 1L, 1L, 1L, 1L), X.100000.2 = c(-100000L, -100000L, -100000L, -100000L, 1L, 1L, 1L, 1L, 1L), X.100000.3 = c(-100000L, -100000L, -100000L, -100000L, 1L, 1L, 1L, 1L, 1L)), .Names = c("X1", "X1.1", "X1.2", "X1.3", "X.100000", "X.100000.1", "X.100000.2", "X.100000.3"), class = "data.frame", row.names = c(NA, -9L))) C <- as.matrix(structure(list(X1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.3 = c(1L, 1L, 1L, 1L, 1L, -100000L, 1L, 1L, 1L), X1.4 = c(1L, 1L, 1L, 1L, 1L, -100000L, 1L, 1L, 1L), X1.5 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1.6 = c(1L, 1L, 1L, 1L, 1L, -100000L, 1L, 1L, -100000L), X1.7 = c(1L, 1L, 1L, 1L, -100000L, -100000L, 1L, 1L, -100000L)), .Names = c("X1", "X1.1", "X1.2", "X1.3", "X1.4", "X1.5", "X1.6", "X1.7"), class = "data.frame", row.names = c(NA, -9L))) D <- as.matrix(structure(list(X775 = c(385L, 1233L, 1067L, 5L, 730L, 1123L, 837L, 5L, 3087L), X704 = c(625L, 1338L, 804L, 110L, 659L, 1363L, 942L, -165L, 3350L), X704.1 = c(625L, 1338L, 804L, 110L, 659L, 1363L, 942L, -165L, 3350L), X944 = c(625L, 1263L, 898L, 35L, 899L, 1363L, 867L, -65L, 3110L), X775.1 = c(385L, 1233L, 1067L, 5L, 730L, 1123L, 837L, 5L, 3087L), X775.2 = c(385L, 1233L, 1067L, 5L, 730L, 1123L, 837L, 5L, 3087L), X944.1 = c(625L, 1263L, 898L, 35L, 899L, 1363L, 867L, -65L, 3110L), X944.2 = c(625L, 1263L, 898L, 35L, 899L, 1363L, 867L, -65L, 3110L)), .Names = c("X775", "X704", "X704.1", "X944", "X775.1", "X775.2", "X944.1", "X944.2"), class = "data.frame", row.names = c(NA, -9L))) 

函数和(A * B * C * D)的结果现在是0.这是合乎逻辑的,因为在matrixA中,所有的单元格的值为0.但是,我想知道什么公式可以最大化函数和(A * B * C * D)。

 sum(A*B*C*D) [1] 0 

我想通过将matrixA中的值从0更改为1来执行此操作。此外,还应该考虑以下约束条件。 1.每行只能包含一个值为1的单元格。2.每列只能包含一个值为1的单元格; 这意味着我们可以在matrixA中最多放置值8的八倍。

有人提出如何完成这个build议吗?

您的决策variables( A的单元格值)是布尔值(0或1),您的目标和约束是这些variables的线性函数,这使您处于一个称为混合整数线性编程的优化问题类别。 这些问题可以通过使用Rglpk包来解决。 这是我的解决scheme:

 n1 <- nrow(A) n2 <- ncol(A) # objective coefficients obj <- as.vector(B*C*D) # objective # matrix of constraints weights mat <- matrix(0, n1+n2, n1*n2) for (i in 1:n1) { mat[i, ] <- as.numeric(row(A) == i) } for (j in 1:n2) { mat[n1+j, ] <- as.numeric(col(A) == j) } dir <- rep("<=", n1+n2) # constraint directions rhs <- rep(1, n1+n2) # constraints upper-bounds types <- rep("B", n1*n2) # variable types (boolean) library(Rglpk) opt <- Rglpk_solve_LP(obj, mat, dir, rhs, types, max = TRUE, verbose = TRUE) opt # $optimum # [1] 9950 # $solution # [1] 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 # [39] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 # [77] 0 1 0 0 # $status # [1] 0 opt.A <- matrix(opt$solution, n1, n2) opt.A # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] # [1,] 0 0 0 1 0 0 0 0 # [2,] 0 0 1 0 0 0 0 0 # [3,] 0 1 0 0 0 0 0 0 # [4,] 1 0 0 0 0 0 0 0 # [5,] 0 0 0 0 0 0 0 0 # [6,] 0 0 0 0 0 0 1 0 # [7,] 0 0 0 0 0 1 0 0 # [8,] 0 0 0 0 0 0 0 1 # [9,] 0 0 0 0 0 0 0 0 # [10,] 0 0 0 0 1 0 0 0 

9950是你获得sum(A*B*C*D)的最佳值吗? (我没有在这台电脑上的Excel …)