8

以前にこの質問をしましたが、他のことをいくつか試してみましたが、うまくいかなかったので、フォローアップを続けたいと思いました.

私は基本的に、バイナリと整数の制約がある R の NLP 型の問題を最適化しようとしています。同じコードは次のとおりです。

# Input Data
DTM <- sample(1:30,10,replace=T)
DIM <- rep(30,10)
Price <- 100 - seq(0.4,1,length.out=10)

# Variables that shall be changed to find optimal solution
Hike <- c(1,0,0,1,0,0,0,0,0,1)
Position <- c(0,1,-2,1,0,0,0,0,0,0)

# Bounds for Hikes/Positions
HikeLB <- rep(0,10)
HikeUB <- rep(1,10)
PositionLB <- rep(-2,10)
PositionUB <- rep(2,10)

library(Rsolnp)

# x <- c(Hike, Position)
# Combining two arrays into one since I want 
# to optimize using both these variables

opt_func <- function(x) {

  Hike <- head(x,length(x)/2)
  Position <- tail(x,length(x)/2)

  hikes_till_now <- cumsum(Hike) - Hike
  PostHike <- numeric(length(Hike))
  for (i in seq_along(Hike)){
    PostHike[i] <- 99.60 - 0.25*(Hike[i]*(1-DTM[i]/DIM[i]))
    if(i>1) {
      PostHike[i] <- PostHike[i] - 0.25*hikes_till_now[i]
    }
  }
  Pnl <- Position*(PostHike-Price)
  return(-sum(Pnl)) # Since I want to maximize sum(Pnl)

}

#specify the in-equality function for Hike
unequal <- function(x) {
  Hike <- head(x,length(x)/2)
  return(sum(Hike))
}

#specify the equality function for Position
equal <- function(x) {
  Position <- tail(x,length(x)/2)
  return(sum(Position))
}

#the optimiser
solnp(c(Hike,Position), opt_func, 
      eqfun=equal, eqB=0,   
      ineqfun=unequal, ineqUB=3, ineqLB=1, 
      LB=c(HikeLB,PositionLB), UB=c(HikeUB,PositionUB))

次の警告/エラーが表示されます。

# solnp--> Solution not reliable....Problem Inverting Hessian.

私が理解しているのは、ヘッセ行列は疎行列であるため、反転に問題がある可能性があるということです? また、この最適化を行うためのより良い方法があるかもしれません。複雑な問題のようには見えず、ここでかなり簡単なものが欠けていると感じているからです!

問題の説明は、この質問で詳細に説明されています。

どんな助けでも大歓迎です。

4

0 に答える 0