Пример #1
0
 // Ritorna true se l'assegnamento rispetta la relazione notSatisfy, false altrimenti.
 protected bool Consinstent(Solution solution)
 {
     if (dsl.notSatisfy.relation.Count == 0) return true;
     foreach (Tuple<string, string> pair in dsl.notSatisfy.relation) {
         string ideX = dsl.statements.GetIdeFromValue(pair.Item1);
         string ideY = dsl.statements.GetIdeFromValue(pair.Item2);
         if (solution.assignments.ContainsKey(ideX) && solution.assignments[ideX] == pair.Item1 && solution.assignments.ContainsKey(ideY) && solution.assignments[ideY] == pair.Item2)
             return false;
     }
     return true;
 }
Пример #2
0
 // Propaga le conseguenze degli assegnamenti effettuati modificando assignments.
 // Ritorna false se, durante la propagazione, si cerca d'assegnare un valore xi ad una variabile
 // a cui è già stato assegnato un valore yi (con xi != yi). Ritorna true altrimenti.
 protected bool Propagate(Solution solution)
 {
     List<KeyValuePair<string, string>> assignmentsList = solution.assignments.ToList();
     if (dsl.satisfy.relation.Count == 0) return true;
     for (int i = 0; i < assignmentsList.Count; i++)
         foreach (Tuple<string, string> pair in dsl.satisfy.relation)
             if (assignmentsList[i].Value == pair.Item1) {
                 string ide = dsl.statements.GetIdeFromValue(pair.Item2);
                 if (solution.assignments.ContainsKey(ide)) {
                     if (solution.assignments[ide] != pair.Item2) return false;
                 } else { // ide non è contenuto in assignments
                     solution.assignments.Add(ide, pair.Item2);
                     assignmentsList.Add(new KeyValuePair<string,string>(ide, pair.Item2));
                 }
             }
     return true;
 }
Пример #3
0
 private Solution RecSolveFirstSolution(Solution solution)
 {
     // Ad ogni variabile è stato assegnato un valore
     if (solution.assignments.Count == dsl.statements.vars.Count) { return solution; }
     Variable var = UnassignedVar(solution);
     foreach (string val in var.values)
     {
         Solution newSolution = new Solution(solution);
         newSolution.assignments.Add(var.ide, val);
         if (!Propagate(newSolution)) break;
         if (Consinstent(newSolution))
         {
             newSolution = RecSolveFirstSolution(newSolution);
             if (newSolution != null) return newSolution;
         }
     }
     return null;
 }
Пример #4
0
 // Ritorna una variabile a cui non è ancora stato effettuato un assegnamento
 protected Variable UnassignedVar(Solution solution)
 {
     foreach (Variable var in dsl.statements.vars)
         if (!solution.assignments.ContainsKey(var.ide)) return var;
     return null;
 }
Пример #5
0
 public Solution(Solution solution)
 {
     this.assignments = new SortedList<string,string>(solution.assignments);
 }