IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Réduction des temps de calcul de boucles


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Data Analyst
    Inscrit en
    Mars 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Data Analyst
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 5
    Par défaut Réduction des temps de calcul de boucles
    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
     
    }

  2. #2
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Réduction des temps de calcul de boucles
    Bonjour,

    Un court extrait du jeu de données aiderait à comprendre le fonctionnement de votre programme.

    Actuellement les objets puiss_pac, v et data ne sont pas définis, ce qui empêche d'exécuter le programme.

    D'une façon générale, demandez-vous si les boucles sont nécessaires et ne peuvent pas être remplacées par de la manipulation de données (exemples ici, ici et encore ).

    D'autre part, lorsque vous avez deux dataframe, il est préférable de faire la boucle sur celui ayant le moins d'observations (démonstration ici).

    Cordialement,

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Data Analyst
    Inscrit en
    Mars 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Data Analyst
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 5
    Par défaut
    Bonjour,

    Je vous remercie pour votre réponse. En effet je n'ai pas mit la totalité de mon code veuillez m'en excuser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    v=0:1
    puiss_pac=2500
    Voici également un extrait du jeu de données data
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                      air      eau    tsol         ea        es      puiss   effpompe couverture heure           evo       date  jour
    2017-05-08 03 275.7750 9.487517 11.2500  6.8625174 -1.762483  5.9756408 0.00000000          0     3  0.0000000000 2017-05-08 lundi
    2017-05-08 04 275.5403 9.484049 11.2500  7.0687050 -1.790945  6.1464945 0.02307432          0     4 -0.0070613229 2017-05-08 lundi
    2017-05-08 05 277.4966 9.454455 11.2500  5.0733663 -1.830017  4.4483148 0.02387303          0     5 -0.0056329620 2017-05-08 lundi
    2017-05-08 06 283.2039 9.446280 11.2500 -0.6512668 -1.847367 -0.6029462 0.02744044          0     6 -0.0006964485 2017-05-08 lundi
    2017-05-08 07 286.9248 9.465357 11.2500 -4.4327742 -1.908008 -4.0979666 0.03007073          0     7 -0.0110859497 2017-05-08 lundi
    2017-05-08 08 287.2425 9.496980 11.2531 -4.7404972 -1.901097 -4.3854164 0.03063196          0     8  0.0042816116 2017-05-08 lundi
    Pour information la variable air est exprimée en kelvin et eau en Celsius.
    L'objectif étant de simuler toutes les combinaisons d'une variable appelée newpac (0 ou 1) et d'en supprimer les combinaisons qui ne rentrent pas dans mes "critères" en m'aidant de mon modèle. (Par exemple si la température estimée ne se situe pas entre 27 et 29) on supprime la colonne new_pac correspondante, mais également new_cout et new_temp qui ne nous intéresse plus.

    Merci

Discussions similaires

  1. Réduction de temps de calcul
    Par conanran dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/04/2017, 12h54
  2. Calcul sur des temps de fonctionnement
    Par micbett dans le forum Modélisation
    Réponses: 10
    Dernier message: 28/02/2008, 16h44
  3. Réduction temps de calcul
    Par qwilldune dans le forum MATLAB
    Réponses: 11
    Dernier message: 22/11/2007, 00h43
  4. Amélioration du temps de calcul pour creer des figures
    Par comoliv02 dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/10/2007, 11h23
  5. Mesurer le temps de calcul des fonctions
    Par dzada dans le forum Caml
    Réponses: 2
    Dernier message: 12/03/2007, 19h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo