我使用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必须是唯一的。
答案 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