需要整数优化变量来获取唯一值

时间:2014-11-05 16:07:13

标签: r mathematical-optimization lpsolve

我使用lp solve来求解线性规划方程,解决方案给出了一个向量

> lp("max", obj, con, ineqs, rhs, all.int=TRUE,)$solution
[1]  5  0 13 11  4  0  1 11  0

这很好,但我希望这个向量中的每个条目都是1-9之间的整数,每个整数只能使用一次。比如矢量在下面的样子。

[1]  3  4 8 9  2  5  1 6  7

有什么办法可以做到吗?提前谢谢!

修改

这是我用于lp函数的代码

 obj<-c(1,1,1,1,1,1,1,1,1)
con<-matrix(c(1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,1,1),nrow=5,byrow=TRUE)
ineqs<-c("=", "=", "=", "=", "=")
rhs<-c(45,20,17,27,15)

基本上它的作用是解决了3x3网格的优化问题:

x1 x2 x3
x4 x5 x6
x7 x8 x9

约束为x1 + x2 + x4 + x5 = 20,x2 + x3 + x5 + x6 = 17,x4 + x5 + x7 + x8 = 27,x5 + x6 + x8 + x9 = 15,每个x必须是1到9之间的整数,每个x必须是唯一的。

1 个答案:

答案 0 :(得分:2)

您的配方存在的问题是,您所做的只是将值的总和限制为45;有许多9个整数的集合总和为45但不取值1到9。

您可能会发现使用81个二进制值变量x_ij来表示更容易,而不是用9个整数值变量来计算它,其中每个变量指示x_i(在原始公式中)是否取值j。

# Helper functions to index variables
unit <- function(idx) as.numeric((1:9) == idx)
ivals <- function(i) { ret <- rep(0, 81) ; ret[(9*i-8):(9*i)] <- 1:9 ; ret }
ivars <- function(i) rep(unit(i), each=9)
jvars <- function(j) rep(unit(j), 9)

# Setup and solve optimization model
obj <- rep(0, 81)
const <- rbind(do.call(rbind, lapply(1:9, jvars)),  # Each value once
               do.call(rbind, lapply(1:9, ivars)),  # Each var once
               ivals(1) + ivals(2) + ivals(4) + ivals(5),
               ivals(2) + ivals(3) + ivals(5) + ivals(6),
               ivals(4) + ivals(5) + ivals(7) + ivals(8),
               ivals(5) + ivals(6) + ivals(8) + ivals(9))
ineqs <- rep("=", 22)
rhs <- c(rep(1, 18), 20, 17, 27, 15)
library(lpSolve)
res <- lp("max", obj, const, ineqs, rhs, all.bin=TRUE)
apply(matrix(res$solution, nrow=9), 2, which.max)
# [1] 3 7 5 6 4 1 9 8 2