问题描述
我目前正在撰写一篇论文,涉及解决与此类似的问题。
给定是一组 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)
> 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)
> 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