2014-11-05 42 views
0

我用LP解决求解线性规划方程,并将该溶液给出了一个矢量要求整数优化变量取唯一的值

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

基本上代码这样做是它解决了3×3的网格优化问题:

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必须是唯一的。

+0

您的预期结果与您显示的输出为lp模型的示例输出有什么关系?如果是这样,怎么样? – 2014-11-05 16:14:41

+0

你好,我编辑了这些问题,以便你能理解lp函数的作用。 “x必须是1到9之间的整数并且每个x必须是唯一的”的约束是我认为我出错的地方。 – calculator 2014-11-05 16:58:56

回答

2

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

而不是用9个整数值变量来表示它,你可能会发现用81个二元 - 值变量x_ij,其中每个变量指示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