Bonjour,

Je dispose d'un jeu de données avec diverses variables relatives à la température de l'eau d'un bassin (pompe à chaleur (PAC), température de l'air etc...) . Je souhaite optimiser mes dépenses. Pour ce faire je veux tester toutes les combinaisons possibles de PAC (0 ou 1) en l'appliquant à mon modèle et calculer le coût à chaque itération. Je suis plutôt débutante en R et je souhaiterai savoir s'il est possible d'améliorer mon code pour réduire les temps de calculs qui sont un peu long. Je me suis renseignée sur les fonctions de la famille apply mais je ne vois pas comment les appliquer à mon cas. En vous remerciant.

Aurore



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
hcreuse=c(22,23,0:5)
hpleine=6:21 
pcreuse=0.0967
ppleine=0.1147 
 
tranche_en_min=60
co=round(tranche_en_min*0.0166667,5)
 
energ=((co*puiss_pac)/1000)
 
 
moncout<-function(heure){
  if(heure %in% hcreuse){
    prix1=energ*pcreuse
  }else{prix1=energ*ppleine}
  return(prix1)
}
 
pac=t(expand.grid(v))
row=nrow(pac)+1
col=ncol(pac)
basetemp=matrix(NA,row,col)
baseprix=matrix(NA,row,col)
basetemp[1,]=28             #Ici on initialise à 28 parce que c'est une simulation
basepuiss=matrix(NA,row,col)
basepuiss[1,]=data$puiss[1]
baseea=matrix(NA,row,col)
baseea[1,]=data$eau[1]-(data$air[1]-273.15)
basecouv=matrix(NA,row,col)
basecouv[1,]=data$couverture[1]
#On initialise également les premieres valeurs de températures
for(i in 2:row){
  for (j in 1:ncol(pac)){
    baseea[i,j]=((basetemp[i-1,j]+273.15))-(data$air[i-1])
    basepuiss[i,j]=(((basetemp[i-1,j]+273.15)/100)^4)-((data$air[i-1]/100)^4)
    basetemp[i,j]=basetemp[i-1,j]+(b0+b1*pac[i-1,j]+b2*basepuiss[i-1,j]+b3*baseea[i-1,j]+b4*data$couverture[i])*6
  } 
}   
 
basetemp=t(basetemp[-1,]) #On remplit la premiere ligne du tableau par la valeur de température initiale  
cout=as.matrix(c(0,1*moncout(data$heure[1])))
cout=t(cout) #On initialise également les couts 
 
iterations=800
AM=14:20
 
for (iteration in 2:iterations){ 
  long_temp=length(basetemp)   
  newtemp=cbind(basetemp,basetemp)  
  newea=(newtemp+273.15)-(data$air[iteration-1])
  newpuiss=(((newtemp+273.15)/100)^4)-((data$air[iteration-1]/100)^4) #On recalcule à chaque étape car c'est une simulation
  newcout=cbind(cout,cout)                                                 #On concatene le cout pour que la valeur remplacée soit la suivante
  newpac=matrix(NA,iteration,2*long_temp)
  newpac[1:(iteration-1),]=cbind(pac,pac)                                  #idem pour PAC
  newpac[iteration,1:long_temp]=0                                          #On veut creer ttes les combinaisons possibles a partir de ce qu'il nous reste
  newpac[iteration,(long_temp+1):(2*long_temp)]=1
  for (i in 1:(2*long_temp)){
    newcout[i]=newcout[i]+newpac[iteration,i]*moncout(hour[iteration])            #On calcule le cout à l'aide de la fonction crée plus haut
    newtemp[i]=newtemp[i]+(b0+b1*newpac[iteration,i]+b2*newpuiss[i]+b3*newea[i]+b4*data$couverture[iteration])*6      
 
  }                                   
  for(j in (2*long_temp):1){                                              #On fait le chemin à l'enver pour ne pas avoir de décalage dans les indices lorsque l'on ôte une valeur
    todelete=0
    if (( (data$jour[iteration] %in% c('samedi','dimanche')) & (hour[iteration] %in% AM) &(newtemp[j]<27 | newtemp[j]>29) ) | (newtemp[j] > 29) ){                                   #On supprime les valeurs qui ne nous intéresse pas
      todelete=1
    }else{
      indcout=which(newcout<=newcout[j])                                  
      indtemp=which(newtemp>newtemp[j])
      ind=intersect(indcout,indtemp)
      if(length(ind)!=0){
        todelete=1
      } 
    }
    if(todelete==1){
      newcout<-t(as.matrix(newcout[-j]))                                   #On enleve les indices mauvais
      newtemp<-t(as.matrix(newtemp[-j]))
      newpac<-newpac[,-j]
    }
 
  }
  #print(length(newcout))
  print(iteration)
  #points(newcout~newtemp,col='blue',pch='+')                              #On remplace pour recommencer la boucle
  basetemp=newtemp
  cout=newcout 
  pac=newpac
 
}