Bonjour à tous,
Je me casse les dents sur un truc que je pensais bateau à la base mais que finalement me donne du fil à retordre.
Le contexte est que j'ai plusieurs algorithmes qui agissent sur le même contexte, mais de manière différente.
Les codes ci dessous ne sont pas validés syntaxiquement, car à "main levé", mais c'est pas grave, l'idée reste la même.
La définition d'un algorithme ressemble à ceci :
Ici l'énumération des algorithmes disponibles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<int I> class MonAlgo { static bool Do(); // renvoi true s'il a pu améliorer quelque chose, sinon false }
enum E_ALGOS
{
MON_ALGO_1,
MON_ALGO_2,
MON_ALGO_3,
MON_ALGO_4
}
Donc l'implémentation d'in algo se résume à :
Désormais, il faut les faire coucher ensemble, sachant que l'ordre d'exécution est un facteur important au niveau des performances. Alors je veux un système semi configurable par le code qui pourra décrire un ordre d'exécution. Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template<> MonAlgo<MON_ALGO_1> { static bool Do() { // Je fais des trucs // Si j'ai assuré, return true sinon return false } };
Un autre cheminement pourrait donner :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int Exec_Table = [ MON_ALGO_1, MON_ALGO_3, MON_ALGO_4, MON_ALGO_1, MON_ALGO_2, MON_ALGO_4 ];
Toutes ces valeurs sont statiques, alors j'avais espéré pouvoir obtenir une programmation statique, ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int Exec_Table = [ MON_ALGO_2, MON_ALGO_1, MON_ALGO_3, MON_ALGO_4, MON_ALGO_3, MON_ALGO_4 ];
Mais une erreur de compilation m'empêche de faire ceci en m'indiquant que "i" n'est pas statique, ce qui peut se comprendre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for(int i = 0, i < sizeof(Exec_Table); ++i) { bool b = true; while(b = Exec_Table<i>::Do()) {} // On le ré exécute jusqu'à temps qu'il ne puisse plus offre de solution }
Première question : Etant donné que tout est basé sur du statique, comment faire en sorte que ça le reste dans cette portion de code, et donc que ça compile ?
Maintenant deuxième demande : Je souhaite faire des combinaisons d'algos, à savoir par exemple :
C'est à dire que tant que 3 ou 4 on trouvé un résultat, ce couple doit être ré exécuté jusqu'à tant que ni l'un ni l'autre ne renvoi du positif. Si tel est le cas, on réexécute 1 et si ce dernier trouver quelque chose, on relancer le couple. Le tout s'arrête lorsque 1 ne trouve pas de solution meilleure et que donc il n'y a plus besoin d'exécuter 3 et 4.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MON_ALGO_1 MON_ALGO_3 MON_ALGO_4
J'espère trouver un moyen de faire en sorte que le cheminement soit configurable dans le code, via des tableaux et que le compilateur puisse gérer ça si tant est que l'ensemble soit programmée de manière statique. Mais là je galère un peu comme vous pouvez le constater.
Le premier début de réponse serait de répondre à la première question, à savoir comment rendre ce "i" constant sachant qu'il démarre de 0, valeur constante jusqu'à sizeof(tab) valeur également constante.
Merci beaucoup par avance,
A bientôt
Partager