Programme : combinatoires

Discutez d'informatique ici !
Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 17 Mar 2013, 18:57

Code: Tout sélectionner
#ifndef TIMER_H_
#define TIMER_H_

#include
#include
#include

class Timer
{
public:

  Timer() : ts(0)
  {}

  void start()
  {
    struct timeval tval;
    gettimeofday(&tval, NULL);
    ts = tval.tv_sec * 1000000 + tval.tv_usec;
  }

  double get() const
  {
    return get(ts);
  }

  double get(int refTime) const
  {
    struct timeval tval;
    gettimeofday(&tval, NULL);
    int end_time = tval.tv_sec * 1000000 + tval.tv_usec;

    return static_cast(end_time-refTime) / 1000000.0;
  }
  void tic(){
    struct timeval tval;
    gettimeofday(&tval, NULL);
    tics.push_back(tval.tv_sec * 1000000 + tval.tv_usec);
  }
  double toc(const std::string &message){
    double a=toc();
    std::cout0){
      a = tics.back();
      tics.pop_back();
    }
    return get(a);
  }
private:
  int ts;
  std::list tics;
};


#endif /* TIMER_H_ */


Code: Tout sélectionner
#include
#include "Timer.hpp"
template
void listFatal(){
  if(k==1){
    //skipped
    return;
  }
  size_t stack[k];
  for (size_t i = 0; i(stack); //i/o is the most expensive. skip it
      }
      depth--;
      if(stack[depth-1]+1
void listLejeu()
{
int indice[k+1];
int i=0;

   for ( i = 0; i =0; i--)
         if (indice[i]
void listLejeuBase()
{
int indice[k+1];
int i, max,nb, reste,chiffre,pos,base,ok;
   
   base = n-k+1;

   // calcule de base ^k
   for (max=1, i=0;i0 ; pos++,reste = reste /base )
      {
         chiffre = reste %base;
   
         if (pos>0 && (chiffre > indice[k-pos]))
         {
            ok =false;
            break;
         }
         else
            indice[k-1-pos]=chiffre;
      }   
      if ( ok)
      {
         //impression  de la solution. skipped
      }
   }
}



template
void runTests(){
  std::cout"();
  t.toc("end listFatal");
 
  t.tic();
  listLejeu();
  t.toc("end listLejeu");
 

  t.tic();
  listLejeuBase();
  t.toc("end listLejeuBase");
}

struct Size{
   enum { n = 30 };
};
int main(int argc, char** argv){
  runTests();
  runTests();
  runTests();
  runTests();
  runTests();
  runTests();
  runTests();   
  return 0;
}




Code: Tout sélectionner
Resultats:
running
end listFatal : 5.4e-05
end listLejeu : 2e-06
end listLejeuBase : 1e-06
running
end listFatal : 0.001011
end listLejeu : 0.001347
end listLejeuBase : 0.398276
running
end listFatal : 0.328998
end listLejeu : 0.319482
end listLejeuBase : 2e-06
running
end listFatal : 2.83512
end listLejeu : 2.40135
end listLejeuBase : 1e-06
running
end listFatal : 0.83854
end listLejeu : 0.736533
end listLejeuBase : 98.9158
running
end listFatal : 0.007209
end listLejeu : 0.008876
end listLejeuBase : 121.723
running
end listFatal : 2e-06
#ben alors, listLejeu loop infinie ? :D


La tendance, c'est ton premier algo plus rapide, j'ai aussi runné qq echantillons à n=40, ou mon algo est plus rapide, mais grossomodo, le tiens est fréquemment plus rapide.

Base à fait deux coups d'éclat à et qui sont un peu suspect ^^ (mais peut-être corrects!)
la vie est une fête :)



LeJeu
Membre Irrationnel
Messages: 1142
Enregistré le: 24 Jan 2010, 21:52

par LeJeu » 17 Mar 2013, 22:01

fatal_error a écrit:La tendance, c'est ton premier algo plus rapide, j'ai aussi runné qq echantillons à n=40, ou mon algo est plus rapide, mais grossomodo, le tiens est fréquemment plus rapide.

Base à fait deux coups d'éclat à et qui sont un peu suspect ^^ (mais peut-être corrects!)


Beau job Fatal Error,

J'adore ton expression "Fréquemment plus rapide"... j'avais dit "match serré" et c'est exactement ça !

j'irai voir de plus près les "coups d'éclat" de base , je doute un peu ....

@joel76 - tu tentes le chrono avec SWI-Prolog ???

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 15:31

par joel76 » 17 Mar 2013, 22:22

Abandon par explosion de la pile d'exécution pour toutes_les_combi((30,15, N) après un "certain temps" ! :triste:

Avatar de l’utilisateur
nuage
Membre Complexe
Messages: 2214
Enregistré le: 09 Fév 2006, 22:39

par nuage » 17 Mar 2013, 23:53

Salut,
remarque que ça fait plus de cent millions de possibilités.
C'est pas vraiment étonnant que tu dépasse la mémoire disponible.

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 15:31

par joel76 » 18 Mar 2013, 09:50

Oui, lorsque je les fais simplement afficher ça fonctionne très bien, c'est le fait de les mémoriser qui explose la mémoire. (mais ça reste très long par rapport à C++).

LeJeu
Membre Irrationnel
Messages: 1142
Enregistré le: 24 Jan 2010, 21:52

par LeJeu » 18 Mar 2013, 22:26

[quote="fatal_error"]
Code: Tout sélectionner
#ifndef TIMER_H_
#
#ben alors, listLejeu loop infinie ? :D


Ben oh ! zut ... un signe égal de trop et on se retouve avec un i négatif en sortie de boucle , c'est bêta ...
Code: Tout sélectionner
      for (i=k; [COLOR=Red][B]i>0[/B][/COLOR]; i--)
         if (indice[i] < n -k +i)
            break;

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 24 Mar 2013, 15:33

En essayant d'optimiser un peu...

Code: Tout sélectionner

template
void listFatal(){
  if(k==1){
    //skipped
    return;
  }
  size_t stack[k];
  for (size_t i = 0; i(stack); //i/o is the most expensive. skip it
      }
      depth--;
      if(stack[depth-1]+1
void listLejeu()
{
size_t indice[k+1];
size_t i=0;

   for ( i = 0; i 0; i--)
         if (indice[i]
void runTests(){
  std::cout"();
  t.toc("end listFatal");
 
  t.tic();
  listLejeu();
  t.toc("end listLejeu");
}

struct Size{
   enum { n = 35 };
};
int main(int argc, char** argv){
  runTests();
  runTests();
  runTests();
  runTests();
  runTests();
  runTests();
  runTests(); 
  runTests(); 
 
  return 0;
}


Code: Tout sélectionner
running
end listFatal : 5.2e-05
end listLejeu : 2e-06
running
end listFatal : 0.000149
end listLejeu : 0.001007
running
end listFatal : 0.192122
end listLejeu : 0.737931
running
end listFatal : 6.84903
end listLejeu : 14.4461
running
end listFatal : 14.2646
end listLejeu : 31.933
running
end listFatal : 1.66398
end listLejeu : 1.77569
running
end listFatal : 0.0066
end listLejeu : 0.005716
running
end listFatal : 1e-06
end listLejeu : 1e-06


J'ai supprimé l'algo de base complètement dépassé, il faudrait expliquer pourquoi cette différence en compilation O3

J'ai aussi supprimé mes variables locales, mais je sais pas si ca joue à comparer aussi!

Pour rappel des algorithmes:
Lejeu: n=6
1234
on cherche le plus a gauche : 4
1235
on cherche le plus a gauche : 5
1236
on cherche le plus a gauche : 3
on reinitialise
1245
on cherche le plus a gauche : 5
1245
on cherche le plus a gauche : 6
1246

moi:
123x
1234
1235
1236
on cherche le plus a gauche: 4
124
on complete
1240
1245
1246
la vie est une fête :)

LeJeu
Membre Irrationnel
Messages: 1142
Enregistré le: 24 Jan 2010, 21:52

par LeJeu » 24 Mar 2013, 20:38

fatal_error a écrit:En essayant d'optimiser un peu...
Code: Tout sélectionner
running
end listFatal : 0.192122
end listLejeu : 0.737931

Ridicule ! listLejeu est ridiculesement fréquemment beaucoup moins rapide que fatal .... :-)
Il va regarder ça de plus près...

Ca m'énerve, mais j'aime bien ce suivi dans les topics 'hors scolaire" qui ont une durée de vie de plus de douze heures ....

Ceci dit je suis un peu charrette perso, je reviens au plus tôt

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 24 Mar 2013, 21:06

Ca m'énerve, mais j'aime bien ce suivi dans les topics 'hors scolaire" qui ont une durée de vie de plus de douze heures ....

ouais, chui sur ya une corrélation avec le temps qu'il fait dehors.

La météo devrait monitorer la fréquence des forums de maths!
la vie est une fête :)

LeJeu
Membre Irrationnel
Messages: 1142
Enregistré le: 24 Jan 2010, 21:52

par LeJeu » 24 Mar 2013, 21:12

fatal_error a écrit:ouais, chui sur ya une corrélation avec le temps qu'il fait dehors.

La météo devrait monitorer la fréquence des forums de maths!


Je suis défavorisé... pour moi ce matin, il faisait beau ... en région parisienne, mais j'étais dans les bois, 4 heures d'entrainement en orientation, et pendant ce temps fatal codait.... :-(

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite