---
title: "Caso S10: Métodos prescritivos (Otimização)"
output:
  html_document:
    df_print: paged
---

------------------------------------------------------------------------

### Pacotes do R utilizados:

```{r, message=FALSE, warning=FALSE}
library(readxl)
library(GA)
library(caret)
library(ggplot2)
library(dplyr)
library(tidyverse)
```

------------------------------------------------------------------------

#### Aplicação em Analytics: Otimização da planta termoelétrica
   
   
- Criação do modelo de previsão:   

```{r}
df_RG = read_excel("Df_ProdEnerg.xlsx");df_RG = data.frame(df_RG)
set.seed(136)
Index <- createDataPartition(y = df_RG$PE,p = 0.8, list = FALSE)
treino <- df_RG[Index,];teste <- df_RG[-Index,]
set.seed(326)
fit.RF = train(PE ~ .,method ='rf',metric = "RMSE",data = treino,
               ntree = 50,
               trControl=trainControl(method="cv",number=10),
               tuneGrid = data.frame(mtry = 1:3))
fit.RF
Prev.teste.RF <- predict(fit.RF,newdata = teste)
predVals <- extractPrediction(list(fit.RF),testX = teste[,1:4],testY = teste[,5])
plotObsVsPred(predVals)
```
&nbsp;

- Otimização do parâmetro V (pressão do vapor):   

Vamos considerar o caso em que AT = 23oC, AP=1000 e RH=65. Assim,


```{r}
df.grafico <- data.frame(AT=23,V=seq(25.36,81.56,.01),AP=1000,RH=65)
df.grafico$PE.hat <- predict(fit.RF,newdata=df.grafico)
df.grafico %>% ggplot(aes(x=V,y=PE.hat)) + geom_line()
```

```{r}
fitness <- function(x1){
  dados.otimizacao <- data.frame(AT=23,V=x1,AP=1000,RH=65)
  (predict(fit.RF,newdata=dados.otimizacao)) }
GA.PE <- ga(type = "real-valued", fitness = function(x) fitness(x[1]),
         lower = 25.36,upper = 81.56, popSize = 50, maxiter = 50, 
         optim = TRUE)
summary(GA.PE)
plot(GA.PE)
message("FO=",round(GA.PE@fitnessValue,2))
message("V=",round(GA.PE@solution[2],2))
```
&nbsp;

- Otimização de todos os parâmetros:

```{r}
fitness <- function(x1,x2,x3,x4){
  dados.otimizacao <- data.frame(AT=x1,V=x2,AP=x3,RH=x4)
  (predict(fit.RF,newdata=dados.otimizacao))
}
GA <- ga(type = "real-valued",
         fitness = function(x) fitness(x[1],x[2],x[3],x[4]),
         lower = c(1.81,25.36,992.9,25.56), 
         upper = c(37.11,81.56,1033.3,100.16), popSize = 50,
         maxiter = 100, optim = TRUE)
summary(GA)
plot(GA)
message("FO=",round(GA@fitnessValue,2))
message("AT=",round(GA@solution[1,1],2))
message("V=",round(GA@solution[1,2],2))
message("AP=",round(GA@solution[1,3],2))
message("RH=",round(GA@solution[1,4],2))
```


___

