在constrOptim中挣扎着简单的约束

时间:2016-11-03 20:55:44

标签: r optimization constraints

我在R中有一个函数,我希望最大化optimconstrOptim中的一些简单约束,但我努力让我的头脑ciui以适应我的约束。

我的功能是:

negexpKPI <- function(alpha,beta,spend){

  -sum(alpha*(1-exp(-spend/beta)))

}

其中alphabeta是固定向量,而spend是花费c(sp1,sp2,...,sp6)的向量,我想改变它以便最大化{{1}的输出}}。我想以三种不同的方式约束negexpKPI

1)每个spend的最小值和最大值,即

sp1,sp2,...,sp6 0 < sp1 < 10000000 ...

2)总和:

5000 < sp2 < 10000000

3)某些组成部分的总和:

sum(spend)=90000000

请帮忙吗?打开任何其他可行的方法,但如果可能的话,更喜欢基数R.

1 个答案:

答案 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.

所以只需要以矩阵格式重写约束。注意,身份约束只是两个不等式约束。

enter image description here

现在我们可以在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,但sp1sp2都不能超过1000000。所以没有可行的地区!请先解决您的问题。

  

抱歉,我使用的是我没有完全检查的样本数据;真正的优化是40个sp值,有92个约束,如果我在这里完全复制会使问题更难以解释。我已经添加了一些额外的零,以使其现在可行。