【问题标题】:Optimizing with Constraint in R (objective function in optim evaluates to length 0 not 1)在 R 中使用约束进行优化(优化中的目标函数计算长度为 0 而不是 1)
【发布时间】:2021-12-05 22:59:07
【问题描述】:

我想用约束最小化这个函数

步骤是我需要找到优化(最小化)E(TC)的t(i)

这是我的 n=3 代码,并希望以最佳 t(i) ,i =1,2,3 最小化 E(TC)。请注意,t(1) 必须等于 0,并且具有约束 t(2)

OptExp<-function(te){
  mu=0.001299059
  sigm=0.00006375925
  D=80
  K=500
  F=0.7
  T=40
  Po=-0.0208801593
  mu=0.001299059
  
  n=3
  t=as.vector(n,mode="numeric")
  P1=as.vector(n,mode="numeric")
  P2=as.vector(n,mode="numeric")
  Pt1=as.vector(n,mode="numeric")
  Pt2=as.vector(n,mode="numeric")

  for (i in 2:(n)){
  t[1]=0
  t[i]=te[i-1]}
  
  for (i in 1:n){
  if(i!=n){
  P1[i]=Po*exp((mu+(sigm^2)/2)*t[i])*D*(t[i+1]-t[i])
  P2[i]=(1/2)*Po*exp((mu+(sigm^2)/2)*t[i])*F*D*(t[i+1]-t[i])^2}
  else {
  P1[i]=Po*exp((mu+(sigm^2)/2)*t[i])*D*(T-t[i])
  P2[i]=(1/2)*Po*exp((mu+(sigm^2)/2)*t[i])*F*D*(T-t[i])^2}}
  
  Pt1=sum(P1)
  Pt2=sum(P2)
  
  E=n*K+Pt1+Pt2
  
  #constraint
  if (t[3]<T & t[1]<t[2] & t[2]<t[3]){
  return(E)}
}

optmz=optim(c(3,5),fn=OptExp)

但结果是

Error in optim(c(3, 5), fn = OptExp) : 
  objective function in optim evaluates to length 0 not 1

有人知道我的代码有什么问题吗?

*ps:我也尝试使用 consrtOptim

  n=2
  t=as.vector(n,mode="numeric")
  t[1]=0
  
OptExp<-function(te){
  mu=0.001299059
  sigm=0.00006375925
  D=80
  K=500
  F=0.7
  T=40
  Po=-0.0208801593
  mu=0.001299059
  
  P1=as.vector(n,mode="numeric")
  P2=as.vector(n,mode="numeric")
  Pt1=as.vector(n,mode="numeric")
  Pt2=as.vector(n,mode="numeric")
  
  for (i in 2:(n)){
  t[1]=0
  t[i]=te[i-1]}
  
  for (i in 1:n){
  if(i!=n){
  P1[i]=Po*exp((mu+(sigm^2)/2)*t[i])*D*(t[i+1]-t[i])
  P2[i]=(1/2)*Po*exp((mu+(sigm^2)/2)*t[i])*F*D*(t[i+1]-t[i])^2}
  else {
  P1[i]=Po*exp((mu+(sigm^2)/2)*t[i])*D*(T-t[i])
  P2[i]=(1/2)*Po*exp((mu+(sigm^2)/2)*t[i])*F*D*(T-t[i])^2}}
  
  Pt1=sum(P1)
  Pt2=sum(P2)
  
  E=n*K+Pt1+Pt2
  return(E)
}

lb=t[n-1]
u1=cbind(c(1,-1));u1
c1=c(lb,-40)
init=c(3)
value<-constrOptim(init,f=OptExp,ui=u1,ci=c1,grad=NULL)

注意,n=2 的约束条件是 t(1)=0

然后它返回

one-dimensional optimization by Nelder-Mead is unreliable:
use "Brent" or optimize() directly

【问题讨论】:

  • 您不能只在 OptExp 函数中返回任何内容。你是从哪里得到这个想法的?您可能需要查看函数:constrOptim,它允许您指定线性不等式约束。
  • 我尝试过使用 constrOptim,请查看我编辑的问题。有什么想法吗?谢谢

标签: r optimization constraints


【解决方案1】:

只需按照错误消息中的说明进行操作(无需思考)即可:

  value<-constrOptim(init,f=OptExp,ui=u1,ci=c1,grad=NULL,
               method="Brent",lower=0,upper=40)

  OptExp<-function(te,...){ 

对于多个 t 使用 method="Nelder-Mead"(或更好的 BFGS)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多