R lpsolve获得第二,第三,第N个最佳解决方案

我正在尝试在R中使用lpsolveapi解决优化问题。我不仅试图获得最佳解决方案,而且还获得次佳的解决方案(通过n个解决方案)。该应用程序适用于幻想足球,其中您在5个不同的位置上有一定数量的不同大小的球员,而且总工资有一个不可超过的额外限制。我找到了解决方法here,但是无法适应我的问题。

我假设我需要添加一个约束,约束条件为get.objective(lp_model)。我尝试这样做,但由于仍只得到一种解决方案,因此我认为设置不正确。

理想情况下,我正在寻找一种类似这样的解决方案(具有适当数量的玩家):

> sols
[[1]]
[1] 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1

[[2]]
[1] 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0

到目前为止,这是我的代码:

library(lpSolveAPI)

Dataset <- matrix(c("DET","SF","NO","D.Prescott","A.Smith","C.Newton","L.Miller","C.McCaffrey","A.Kamara","D.Freeman","C.Hyde","C.Thompson","D.Murray","D.Bryant","D.Baldwin","A.Green","T.Hill","J.Landry","M.Crabtree","L.Fitzgerald","G.Tate","A.Seferian-Jenkins","V.Davis","D.Walker","J.Cook",1,2,3,4,5,3000,3200,3400,6700,6500,6300,6200,6600,5200,6100,5400,6400,6900,7400,5900,4900,4100,4000,7.679411765,7.309444444,7.061764706,20.66725263,19.58133684,18.78134737,16.08178947,14.93878947,14.605,14.02315789,13.93152632,13.92768421,12.94,15.66052632,15.38147368,14.85521053,14.60457895,14.56222222,14.44427778,14.23257895,14.16161111,11.09,10.95147368,10.52473684,9.581222222),ncol=4)
colnames(Dataset) <- c('Name','Position2','Salary','Pts')
Dataset <- data.frame(Dataset)
Dataset$Position2 <- as.numeric(Dataset$Position2)
Dataset$Salary <- as.numeric(Dataset$Salary)
Dataset$Pts <- as.numeric(Dataset$Pts)

lp_model= make.lp(0,nrow(Dataset))

set.objfn(lp_model,Dataset$Pts)
add.constraint(lp_model,rep(1,nrow(Dataset)),"=",9)
add.constraint(lp_model,as.vector(Dataset$Salary),"<=",50000)
add.constraint(lp_model,Dataset$Position2==1,1)
add.constraint(lp_model,Dataset$Position2==2,Dataset$Position2==3,">=",2)
add.constraint(lp_model,3)
add.constraint(lp_model,Dataset$Position2==4,4)
add.constraint(lp_model,Dataset$Position2==5,2)
lp.control(lp_model,sense= "max")
set.type(lp_model,1:nrow(Dataset),"binary")

lp_model
solve(lp_model)
get.variables(lp_model)
get.objective(lp_model)
get.constr.value((lp_model))
get.total.iter(lp_model)
get.solutioncount(lp_model)

rc<-solve(lp_model)
sols<-list()
obj0<-get.objective(lp_model)
counter = 0
# find more solutions
while(TRUE) {
  counts <- matrix(obj0,ncol=nrow(Dataset))
  counter = counter+1
  sol <- round(get.variables(lp_model))
  sols <- c(sols,list(sol))
  add.constraint(lp_model,counts,"<",obj0)
  rc<-solve(lp_model)
  obj0<-get.objective(lp_model)
  if (rc!=0) break;
  if (counter == 5) break;
}
sols
jiansiliangjian 回答:R lpsolve获得第二,第三,第N个最佳解决方案

我找到了一个基于解决方案的解决方案。我从上面的链接切换回原始答案,并添加了一个计数器。这是代码:

rc<-solve(lp_model)
sols<-list()
obj0<-get.objective(lp_model)
while(TRUE) {
  counter = counter+1
  sol <- round(get.variables(lp_model))
  sols <- c(sols,list(sol))
  add.constraint(lp_model,2*sol-1,"<=",sum(sol)-1)
  rc<-solve(lp_model)
  #if (rc!=0) break;
  #if (get.objective(lp_model)<obj0-1e-6) break;
  if (counter == 5) break;
}
sols
本文链接:https://www.f2er.com/3166699.html

大家都在问