我在过去使用的LPSolve上跟踪this guide,但是现在得到的结果是“错误:找不到可行的解决方案”
我的data.table看起来像这样:
New_proj$Position <- as.factor(New_proj$Position)
New_proj$Salary <-as.numeric(New_proj$Salary)
#### Prepare constraint matrix of zeros #####
A <- matrix(0, nrow = 6, ncol = nrow(New_proj))
#Designate the positions that are equivalent to each other when generating the optimal lineup
#There are 7 distinct positions and 1 constraint in which salary is < 50,000
#I.e. A player with the position 1B/2B can fill the 1B or the 2B position
#Add a "1" to all position that can fill that position slot
#Set C parameters
j<-1
i<-1
for (i in 1:nrow(New_proj)){
if (New_proj$Position[i]=="C" )
A[j,i]<-1
}
#W
j<-2
i<-1
for (i in 1:nrow(New_proj)){
if (New_proj$Position[i]=="LW" ||
New_proj$Position[i]=="RW" )
A[j,i]<-1
}
#D
j<-3
i<-1
for (i in 1:nrow(New_proj)){
if (New_proj$Position[i]=="D" )
A[j,i]<-1
}
#G
j<-4
i<-1
for (i in 1:nrow(New_proj)){
if (New_proj$Position[i]=="G" )
A[j,i]<-1
}
#U
j<-5
i<-1
for (i in 1:nrow(New_proj)){
if (New_proj$Position[i]=="C" ||
New_proj$Position[i]=="LW" ||
New_proj$Position[i]== "RW"||
New_proj$Position[i]=="D" )
A[j,i]<-1
}
A[6, ] <- New_proj$Salary # salary <= 50000
# Prepare input for LP solver
objective.in <- New_proj$AvgPointsPerGame
const.mat <- A[]
const.dir <- c("==", "==", "==", "==","==", "<=")
const.rhs <- c(2, 3, 2, 1,1, 50000)
# Generate optimal lineup with lp solve
require(lpSolve)
sol <- lp(direction = "max", objective.in, # maximize objective function
const.mat, const.dir, const.rhs # constraints
) # use binary variables only
### View the solution
inds <- which(sol$solution == 1)
Error: object 'dataset' not found
sol
Error: no feasible solution found
从那里我修改为
{{1}}
我不知道区别在哪里。我还遵循了另一个教程,该教程给出了同样的“没有可行的解决方案”,但我一生都无法弄清原因。这表明我要问的内容与矩阵中的内容之间有些脱节,但我看不到哪里。
欢迎任何想法。
答案 0 :(得分:3)
已编辑:
问题是第5个约束。我注意到,A
的第五行中实际上有更多的1,所以我猜想在那里很难找到解决方案,因为您只能将一个变量设置为1
解。
rowSums(A[1:5,])
[1] 28 56 47 17 131
如果您查看LHS
,问题将会更加清楚。如果1
中的系数(即第五个约束)为A[5, ]
,则只能将1个自由变量设置为1
。因此,假设您已将这些变量中的1个设置为1,则仍然需要满足1
至3
的约束。但是:这些行中只有o
系数,因此您将无法满足这些约束。
A [,A [5,] == 0]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]
[1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[4,] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[6,] 8400 8200 7700 7500 7500 7400 7200 7100 6900 6500 6500 6500 6500 6500 6500 6500 6500
如果仅使用此约束,则该问题不可行。如果使用除此约束以外的所有约束,则是可行的。另外,如果将第5个约束的RHS更改为2
,该问题也将变得可行。
原始答案:
这是问题的数学表述:
Objective Function:
4.4*x1 + 4.36*x2 + 5.42*x3 + 4.75*x4 + 2.26*x5 + 2.47*x6
Constraints:
0*x1 + 0*x2 + 0*x3 + 1*x4 + 0*x5 + 0*x6 == 2
0*x1 + 0*x2 + 0*x3 + 0*x4 + 0*x5 + 0*x6 == 3
0*x1 + 0*x2 + 0*x3 + 0*x4 + 0*x5 + 0*x6 == 2
1*x1 + 1*x2 + 1*x3 + 0*x4 + 1*x5 + 1*x6 == 1
0*x1 + 0*x2 + 0*x3 + 1*x4 + 0*x5 + 0*x6 == 1
8400*x1 + 8200*x2 + 7700*x3 + 7700*x4 + 7500*x5 + 7500*x6 <= 50000
如果查看第二和第三约束,则可以看到它们永远不能大于0,因为所有系数均为0
。
在注释中,您还指定了所有变量都应为二进制。但是,all.bin
中lp()
的默认值为FALSE
。
如果您确实设置了all.bin = TRUE
,您将发现第一个约束也不可行。