在R中使用线性规划寻找所有可能的解决方案(Rglpk?)

时间:2017-09-18 07:27:51

标签: r dataframe linear-programming

我很乐意在R中使用Rglpk找到最佳解决方案,但是,我努力寻找解决方案的目的是生成满足最低标准值的所有可能解决方案。

例如,对于下面的基本数据框,我可以使用Rglpk找到1男1女的最佳总结果。

df<-data.frame(c("John","Sandy","James","Sharon"),c("M","F","M","F"),c(84,70,13,62))
colnames(df)<-c("Name","Sex","Result")

df
    Name Sex Result
1   John   M     84
2  Sandy   F     70
3  James   M     13
4 Sharon   F     62

library(Rglpk)
num <- length(df$Name)
obj<-df$Result
var.types<-rep("B",num)
matrix <- rbind(as.numeric(df$Sex == "M"),as.numeric(df$Sex == "F"))
direction <- c("==","==")
rhs<-c(1,1)
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs,types = var.types, max = TRUE)

df[sol$solution==1,]
   Name Sex Result
1  John   M     84
2 Sandy   F     70

但是,如果我想找到所有可能的解决方案或&#39;组合&#39;在1个男性和1个女性得分的总和超过140的数据框中,我无法解决如何生成此解决方案并随后以下列方式进行格式化

     M      F Result
1 John  Sandy    154
2 John Sharon    146

感谢人们提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用以下算法:

  1. 解决MIP
  2. 如果不可行:停止
  3. 向禁止当前最佳解决方案的模型添加约束。
  4. 转到第1步。
  5. 步骤3中的约束可能如下所示:

    sum(i, a(i)*x(i)) - sum(i, (1-a(i))*x(i)) <= sum(i, a(i)) - 1
    

    其中a(i)是当前的最佳解决方案(在步骤1中找到)。即 a(i)= x * (i)a是常量。请注意,约束的数量在每个周期中增加一个(因此模型变得越来越大)。

    以下是此剪辑的推导:link

    看起来你仍然需要添加一个约束来确保分数超过140。