我很乐意在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
感谢人们提供的任何帮助。
答案 0 :(得分:2)
您可以使用以下算法:
步骤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。