LPSolve返回错误“找不到可行的解决方案”

时间:2018-10-05 02:36:30

标签: r lpsolve

我在过去使用的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}}

我不知道区别在哪里。我还遵循了另一个教程,该教程给出了同样的“没有可行的解决方案”,但我一生都无法弄清原因。这表明我要问的内容与矩阵中的内容之间有些脱节,但我看不到哪里。

full sample file here

欢迎任何想法。

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,则仍然需要满足13的约束。但是:这些行中只有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.binlp()的默认值为FALSE

如果您确实设置了all.bin = TRUE,您将发现第一个约束也不可行。