public void Generer() { for (int i = 0; i < Grille.NB_CASE_PAR_LIGNE; i++) { for (int j = 0; j < Grille.NB_CASE_PAR_LIGNE; j++) { if (!cases[i, j].GetVariable().EstAssigne()) { ContrainteBinaire cb; //Contrainte sur la ligne for (int k = 0; k < Grille.NB_CASE_PAR_LIGNE; k++) { if (k != i) { cb = new ContrainteBinaire(cases[i, j].GetVariable(), cases[k, j].GetVariable(), ContrainteBinaire.Operateur.NOT_EQUAL); if (!contraintes.Contains(cb)) { contraintes.Add(cb); } } } //Contrainte sur la colonne for (int k = 0; k < Grille.NB_CASE_PAR_LIGNE; k++) { if (k != j) { cb = new ContrainteBinaire(cases[i, j].GetVariable(), cases[i, k].GetVariable(), ContrainteBinaire.Operateur.NOT_EQUAL); if (!contraintes.Contains(cb)) { contraintes.Add(cb); } } } //Contrainte sur la région int tmpI = i - (i % 3); int tmpJ = j - (j % 3); for (int k = tmpI; k < tmpI + Grille.NB_CASE_PAR_REGION; k++) { for (int l = tmpJ; l < tmpJ + Grille.NB_CASE_PAR_REGION; l++) { if (i != k && j != l) { cb = new ContrainteBinaire(cases[i, j].GetVariable(), cases[k, l].GetVariable(), ContrainteBinaire.Operateur.NOT_EQUAL); if (!contraintes.Contains(cb)) { contraintes.Add(cb); } } } } } } } }
/* Supprime les valeurs inconsistantes */ public bool SupprimerValeursInconsistantes(Variable v1, Variable v2) { bool supprime = false; ContrainteBinaire cb = this.csp.GetContrainteVariables(v1, v2); if (cb != null) { List <int> tDomaine = new List <int>(v1.GetDomaine()); foreach (int x in tDomaine) { v1.SetAssigne(true); v1.SetValeur(x); bool satisfy = false; foreach (int y in v2.GetDomaine()) { if (!v2.EstAssigne()) { v2.SetAssigne(true); v2.SetValeur(y); if (cb.estRespecte()) { satisfy = true; } v2.SetAssigne(false); v2.SetValeur(0); } else { if (cb.estRespecte()) { satisfy = true; } } } if (!satisfy) { v1.SupprimerValeurDomaine(x); supprime = true; } v1.SetAssigne(false); v1.SetValeur(0); } } return(supprime); }
public ContrainteBinaire GetContrainteVariables(Variable v1, Variable v2) { ContrainteBinaire cb = null; foreach (ContrainteBinaire c in contraintes) { if (c.Contient(v1) && c.Contient(v2)) { cb = c; } } return(cb); }