我在R中有一个函数,我希望最大化optim
或constrOptim
中的一些简单约束,但我努力让我的头脑ci
和ui
以适应我的约束。
我的功能是:
negexpKPI <- function(alpha,beta,spend){
-sum(alpha*(1-exp(-spend/beta)))
}
其中alpha
和beta
是固定向量,而spend
是花费c(sp1,sp2,...,sp6)
的向量,我想改变它以便最大化{{1}的输出}}。我想以三种不同的方式约束negexpKPI
:
1)每个spend
的最小值和最大值,即
sp1,sp2,...,sp6
0 < sp1 < 10000000
...
2)总和:
5000 < sp2 < 10000000
3)某些组成部分的总和:
sum(spend)=90000000
请帮忙吗?打开任何其他可行的方法,但如果可能的话,更喜欢基数R.
答案 0 :(得分:4)
根据?constrOptim
:
The feasible region is defined by ‘ui %*% theta - ci >= 0’. The
starting value must be in the interior of the feasible region, but
the minimum may be on the boundary.
所以只需要以矩阵格式重写约束。注意,身份约束只是两个不等式约束。
现在我们可以在R中定义:
## define by column
ui = matrix(c(1,-1,0,0,1,-1,1,-1,
0,0,1,-1,1,-1,1,-1,
0,0,0,0,0,0,1,-1,
0,0,0,0,0,0,1,-1,
0,0,0,0,0,0,1,-1,
0,0,0,0,0,0,1,-1), ncol = 6)
ci = c(0, -1000000, 5000, -1000000, 5000000, 90000000, -90000000)
附加说明
我觉得这里有问题。 sp1 + sp2 = 5000000
,但sp1
和sp2
都不能超过1000000
。所以没有可行的地区!请先解决您的问题。
抱歉,我使用的是我没有完全检查的样本数据;真正的优化是40个
sp
值,有92个约束,如果我在这里完全复制会使问题更难以解释。我已经添加了一些额外的零,以使其现在可行。