我目前正在写一篇论文,涉及解决一个类似的问题。
给定是一组100个数字,我想检查是否可以通过将给定的数字与0或1相乘来达到某个值。
见下面的简化问题
A + 2B + 3C + 4D = 10, with A, B, C, D from {0,1}.
我试图通过使用lpSolve包和解决二进制LP来解决这个问题。我选择目标函数为常数,因为,如果一切都计算正确,约束条件仍然必须满足。
在我的代码中:
> library(lpSolve)
> f.obj <- c(1,1,1,1)
> f.con <- c(1,2,3,4)
> f.dir <- c("=")
> f.rhs <- c(10)
> lp("max", f.obj, f.con, f.dir, f.rhs, binary.vec = 1:4, all.bin=TRUE)
作为结果,我现在期望A=B=C=D=1
。然而,我得到R作为解决方案A=1, B=1, C=0, D=1
。
有人能理解为什么会这样吗?
也许你们知道更好的算法来解决我的问题。我感谢任何能帮助我的人
非常感谢!
尝试转置约束向量:
> library(lpSolve)
> f.obj <- c(1,1,1,1)
> f.con <- t(c(1,2,3,4))
> f.dir <- c("=")
> f.rhs <- c(10)
> result <- lp("max", f.obj, f.con, f.dir, f.rhs, binary.vec = 1:4, all.bin=TRUE)
> result
Success: the objective function is 4
> result$solution
[1] 1 1 1 1