我需要求解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中解决此问题,而没有任何目标函数。
请告知。
答案 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
我们可以使用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