无需优化即可求解约束方程

时间:2019-01-26 15:22:21

标签: r

我需要求解R中的约束方程而无需优化。

因此,以下5个类别中的每一个都有10个级别:

Cat  | Avg.Percentage
A    |  33
B    |  75
C    |  80
D    |  95
E    |  110

A的10个级别(x1,x2,... x10)是百分比值,这10个百分比的平均值应近似等于上表中提到的33,其余类别和类别应遵循相同的概念它的水平。

再加上5个类别中每10个级别中的百分比分布,应具有以下分布和有限约束:

% of levels | min | max
 10%        | 100 | 125
 20%        | 80  | 99
 40%        | 50  | 79
 20%        | 30  | 49
 10%        | 0   | 29

如何在R中解决此问题,而没有任何目标函数。

请告知。

1 个答案:

答案 0 :(得分:2)

这个问题是不可能的,也就是说,没有满足约束条件的解决方案,因为如果每个A值都设置为其下限,那么我们将得到以下最小的平均值:

lo <- c(100, 80, 80, 50, 50, 50, 50, 30, 30, 0)
mean(lo)
## [1] 52

因此A值的平均值不可能为33。

同样,最大可能的平均值是

hi <- c(125, 99, 99, 79, 79, 79, 79, 49, 49, 29)
mean(hi)
## [1] 76.6

所以C,D和E也不可行。

更改约束

如果我们将A的平均约束更改为52而不是33,那么显然上面的lo是解决方案;但是,我们可以使用lpSolveAPI来自动获取它。

library(lpSolveAPI)

lp <- make.lp(0, 10)
set.bounds(lp, lower = c(100, 80, 80, 50, 50, 50, 50, 30, 30, 0),
  upper = c(125, 99, 99, 79, 79, 79, 79, 49, 49, 29))
add.constraint(lp, rep(1, 10)/10, "=", 52)

solve(lp) # 0 means feasible solution found
## [1] 0

get.variables(lp)
## [1] 100  80  80  50  50  50  50  30  30   0

针对A,B,C,D和E的计算解决方案

我们可以使用sapply遍历A,B,C,D和E,并且如上所述,我们看到B是唯一具有可行解决方案的人:

avg <- c(A = 33, B = 75, C = 80, D = 95, E = 110)
sapply(avg, function(x) {
  lp <- make.lp(0, 10)
  set.bounds(lp, lower = c(100, 80, 80, 50, 50, 50, 50, 30, 30, 0),
    upper = c(125, 99, 99, 79, 79, 79, 79, 49, 49, 29))
  add.constraint(lp, rep(1, 10)/10, "=", x)
  code <- solve(lp)
  v <- get.variables(lp)
  v * if (code > 0) NA else 1
})

给予:

       A   B  C  D  E
 [1,] NA 125 NA NA NA
 [2,] NA  99 NA NA NA
 [3,] NA  99 NA NA NA
 [4,] NA  79 NA NA NA
 [5,] NA  79 NA NA NA
 [6,] NA  79 NA NA NA
 [7,] NA  79 NA NA NA
 [8,] NA  49 NA NA NA
 [9,] NA  49 NA NA NA
[10,] NA  13 NA NA NA