首页 > 解决方案 > 约束优化 [Maxima] R

问题描述

我正在尝试解决以下受约束的最大化问题。

这里的例子只是我试图重新创建一个简单的例子。

我有一个数据框如下:

Obs=c(1,2,3,4,5)
Var1=c(11,15,16,19,20)
Var2=c(1.5,22,0.9,1.7,.1)
Var3=c(2.6,2.5,3.5,3.6,2.1)
Value_One = c(10,12.5,8.4,7.5,2.6)
Cost = c(1.1,1.2,1.3,1.6,1.7)
Value_overall = c(10,21,31,4,29)
df=data.frame(Obs,Var1,Var2,Var3,Value_One,Cost,Value_overall)
var_sel=c('Var1','Var2')
coeff_sel=c(2.5,4.5)
gamma=.7

我必须运行一个受约束的优化问题,其示例如下(请注意确切的值,不要紧。请随意更改它们):

Value_func = function(x){
  Value_var=x$Cost

  # - since the contrained optimum function is for minima.

  -((x$Value_overall+gamma*(x$Value_null-
  (as.matrix(x[var_sel])%*%(as.matrix(coeff_sel)))))-2*x[Cost])

}

#Please feel free to change the values below. 
#I just want to know where I am going wrong. The exact values do not matter here.

for (i2 in 1:nrow(df)){
  x=df[i2,]
  zzz=constrOptim(-1.2, Value_func, NULL,ui=1,ci=-1.3)

}

我想要做的是为数据框的每一行运行上述内容。当我运行上面的示例时,我收到以下错误:

Error: $ operator is invalid for atomic vectors
Called from: f(theta, ...)

我试图寻找一个解决方案,这就是我得到的,但它似乎不适用于我的情况(R $ 运算符对 constraOptim 中的原子向量无效)。

请帮忙。提前致谢。

标签: roptimization

解决方案


这使得结果没有错误。对代码的更改包括:

  1. 添加Value_null到 data.frame
  2. 将函数参数更改为costs并在矩阵填充后修改函数。
  3. 将结果保存zzz为列表而不是静态。

如果您首先将其设计为矩阵,则可以使用 apply。

df <- data.frame(Obs=c(1,2,3,4,5)
                 ,Var1=c(11,15,16,19,20)
                 ,Var2=c(1.5,22,0.9,1.7,.1)
                 ,Var3=c(2.6,2.5,3.5,3.6,2.1)
                 ,Value_One = c(10,12.5,8.4,7.5,2.6)
                 ,Cost = c(1.1,1.2,1.3,1.6,1.7)
                 ,Value_overall = c(10,21,31,4,29)
                 #added to match
                 ,Value_null = 5
)

var_sel=c('Var1','Var2')
coeff_sel=c(2.5,4.5)
gamma=.7

Value_func = function(costs){
  # - since the contrained optimum function is for minima.
  -((x$Value_overall+gamma*(x$Value_null-
                              (as.matrix(x[var_sel])%*%(as.matrix(coeff_sel)))))-2*costs)
}

for (i2 in 1:nrow(df)){
  x=df[i2,]
  zzz[[i2]]=constrOptim(1, Value_func, NULL,ui=1,ci=-1.3, x$Cost)
}

或者apply方法。我不喜欢我分配的x <<- z,但它给出了结果。

Value_func = function(costs){
  # - since the contrained optimum function is for minima.
  -((x['Value_overall']+gamma*(x['Value_null']-
                              (x[var_sel]%*%(coeff_sel))))-2*costs)  
}

apply(df, 1, function(z) {
  x<<- z
  constrOptim(1, Value_func, NULL, ui = 1, ci = -1.3, z['Cost'])
}
)

推荐阅读