je viens de me rendre compte de problèmes avec cette fonction
premièrement, on tri les variables alors que les contraintes ont déjà été affectées dans les variables.
or l'affectation des contraintes dans les variables dépend de l'ordre des variables et on change celui-ci avec cette fonction. la fonction affecter variable permet au moment de vérifier un arbre de contrainte, de toujours avoir toutes les variables ayant une valeur. donc il y aura des cas où des variables n'auront pas de valeur ici.
pour corriger on pourrai appeler cette fonction avant d'affecter les contraintes des variables
mais on a aussi un autre problème: avec les tableaux presenceVariable
ces tableaux aussi suppose que les variables sont dans le bon ordre. or si on change l'ordre des variables, alors tout les tableau presenceVariable ne correspondront plus à l'ordre des variables.
pour remédier à ces problèmes je vois plusieurs solutions
dans tous les cas il faut appeler cette fonction de tri avant l'appel de affecterContraintesDansVariables (qui est fait dans yacc), et pas dans la fonction main comme je l'ai fait
Première solution:
-on utilise la variable listeContrainte pour obtenir l'ensemble des contraintes (au lieu de récupérer les contraintes dans les variables)
-on tri les tableaux presenceVariable de toutes les contraintes en même temps qu'on tri la liste des variables
==> un peu dure je pense. et pas très efficace. mais possible
Deuxième solution:
-on ne fait plus intervenir le nombre d’occurrence d'une variable dans les contraintes (on tri seulement par ordre décroissant de taille du domaine)
-on appelle la fonction de tri des variables AVANT de commencer l'analyse des contraintes dans yacc. comme ça on construit les tableaux presenceVariable avec le nouvel ordre des variables
==> facile, mais on perd le critère du nombre d’occurrence qui je pense est important
Troisième solution:
-on analyse une première fois le fichier du CSP en faisant seulement un comptage du nombre d’occurrence des variables
-puis on l'analyse une deuxième fois comme actuellement
-on appelle la fonction de tri des variables AVANT de commencer l'analyse des contraintes.
==> niveau de difficulté entre les 2 précédents. cette solution m'a l'air bien. mais il fraudai un deuxième fichier yacc pour faire une analyse différente (ou alors tout faire dans un seul fichier en faisant pour chaque action sémantique : if(premièreAnalyse) ... else ...)
Quatrième solution:
-on ne tri pas, on met seulement les nombres entre 0 et nombreVariable-1 dans le champ ID des variables
==> très facile mais on enlève l'heuristique de trié les variables pour allé plus vite.